过去几天我一直在努力弄清楚为什么 paramiko 发送 \x07 而不是 tab 到远程会话。 我使用 paramikos invoke_shell 因为我需要运行几个互连的命令。除了这部分之外,一切正常:
check_export = f'echo -e \"this\tis\tjust a test\" > /tmp/export'
这是简化版本,唯一重要的部分是我需要用制表符分隔单词(仅在某些地方)。 打印返回正确的形式:
echo -e "this is just a test" > /tmp/export
但是当我从 paramiko 会话检查 recv() 时,我看到了这个:
b'echo -e "this\x07is\x07just a test" > /tmp/export\r\n[root@server~]# '
因此文件 /tmp/export 不包含制表符,并且前 3 个单词被挤在一起。
我尝试过提供文字选项卡,U00000009,但没有任何效果。
我还尝试对字符串进行 .encode() 操作,但出现错误,指出需要的是字节,而不是字符串。
我在这里缺少什么?我希望得到一些意见。 谢谢
这可能是您滥用交互式 shell 来实现命令自动化的副作用。如果您在 shell 中输入
echo -e "this
然后按 Tab 键会发生什么?如果没有找到这样的文件,shell 将尝试将 this
扩展为文件名并发出 beep (ASCII 7)。这就是你的代码的作用。这不是 Paramiko 将 ASCII 7 (bell) 借调到服务器。这是服务器通过响铃响应您发送 Tab 键。
不要使用交互式 shell 来实现命令自动化。参见:
或者,如果您想坚持您的(在我看来是错误的)方法,请通过转义反斜杠将文字
\
t
序列发送到远程 shell(我认为您实际上打算这样做,基于 -e
): \\t
check_export = f'echo -e \"this\\tis\\tjust a test\" > /tmp/export'
顺便说一句,这里不需要
f'...'
。或者也许您打算使用 r'...'
?
check_export = r'echo -e \"this\tis\tjust a test\" > /tmp/export'
参见 https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals