有没有办法在 Python Paramiko 中启动没有终端仿真的 shell?
exec_command
,但我真的需要一个交互式 shell。invoke_shell()
我得到一个终端并可以发出命令,但从 Windows 10 OpenSSH 服务器我得到带有 ANSI 转义序列的输出,包括 H
代码,该代码不容易处理为纯文本。参考从WIN10 ssh服务器解码数据(paramiko recv()的响应)。SSHClient.invoke_shell
打开“shell”SSH 通道。基本上只是执行用户默认 shell 的简写。否则,它与 SSH“exec”通道(由 SSHClient.exec_command
使用)没有什么不同。
“shell”和“exec”SSH 通道都可以在有或没有终端仿真的情况下启动。只是 Paramiko
SSHClient.invoke_shell
方法不提供该选项(而 SSHClient.exec_command
则通过其 get_pty
参数提供)。
有两种选择:
使用
SSHClient.exec_channel
显式启动 shell,例如
ssh.exec_command("/bin/bash")
在 Linux 服务器上,您甚至可以使用
SHELL
环境变量来避免对 shell 路径进行硬编码:
ssh.exec_command("$SHELL")
在 Windows 上可以使用
%CMDSPEC%
(未经测试)完成类似的操作。
或者重新实现
SSHClient.invoke_shell
以支持在没有终端仿真的情况下执行。
如果你看一下
SSHClient.invoke_shell
的实现,你会发现:
chan = self._transport.open_session()
chan.get_pty(term, width, height, width_pixels, height_pixels)
chan.invoke_shell()
Channel.get_pty
调用:
chan = ssh.get_transport().open_session()
chan.invoke_shell()
请注意,为什么
SSHClient.invoke_shell
始终使用终端仿真是有原因的。 SSH“shell”通道的唯一目的是实现交互式 SSH 终端客户端(如 PuTTY)。没有终端仿真的终端客户端没有任何意义。
您想在没有终端仿真的情况下使用“shell”通道,这表明您正在滥用它用于其设计之外的目的。如果没有更好的解决方案来解决您想要做的事情,请三思!