如何在Python 3中使用Paramiko发送方向键指令?
解决Python 3中Paramiko向远程Links浏览器发送方向键失效的问题
我之前也碰到过类似的终端控制码发送问题,在Python 3里用Paramiko发送方向键转义序列失效,大概率是编码问题或者终端类型配置不对导致的,下面给你几个可行的解决方案:
1. 用正确的字节序列发送方向键
Python 3里字符串是Unicode类型,直接发送'\e[B'其实不对——因为Python并没有\e这个转义符,它会被当成普通的字符'e'处理,而不是我们需要的ESC(ASCII码27)字符。正确的做法是直接构造字节序列:
- 下方向键对应的ANSI转义序列是
ESC [ B,对应字节是b'\x1b[B' - 上方向键:
b'\x1b[A' - 左方向键:
b'\x1b[D' - 右方向键:
b'\x1b[C'
用Paramiko的send_bytes方法直接发送字节,避免编码错误:
import paramiko # 建立SSH连接 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("your_server_ip", username="your_user", password="your_pass") # 调用shell并指定终端类型(关键!) channel = ssh.invoke_shell(term="xterm") # 发送下方向键 channel.send_bytes(b'\x1b[B') # 后续操作:比如读取输出、发送其他指令 # output = channel.recv(1024).decode() # print(output) ssh.close()
2. 确保终端类型配置正确
很多时候转义序列失效是因为远程终端类型不支持ANSI控制码。在调用invoke_shell时指定term="xterm"或者term="vt100",这两种终端类型都能正确解析方向键的转义序列,Links浏览器在这类终端环境下才能识别到方向键指令。
3. 用chr(27)构造转义序列(备选方案)
如果你习惯用字符串构造,可以用chr(27)生成ESC字符,再编码成字节发送:
down_key = chr(27) + "[B" channel.send(down_key.encode("utf-8"))
这个效果和直接发送b'\x1b[B'是一样的,只是写法不同。
为什么之前的方法失效?
Python 2里字符串本质是字节,'\e[B'可能被某些环境解析为ESC开头的序列,但Python 3严格区分Unicode字符串和字节,'\e'会被解析为字面量字符'e',发送到远程后自然不会被识别成方向键指令。
内容的提问来源于stack exchange,提问作者mmichalik
相关产品推荐
相关产品推荐

