知道为什么 paramiko 发送 \x07 而不是发送到远程服务器吗?

问题描述 投票:0回答:1

过去几天我一直在努力弄清楚为什么 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() 操作,但出现错误,指出需要的是字节,而不是字符串。

我在这里缺少什么?我希望得到一些意见。 谢谢

python paramiko
1个回答
5
投票

这可能是您滥用交互式 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

© www.soinside.com 2019 - 2024. All rights reserved.