Paramiko
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
显式启动外壳,例如ssh.exec_command("/bin/bash")
在Linux服务器上,您甚至可以避免使用
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”通道表示您正在 滥用 该 通道是 出于其非设计目的。
如果对您尝试做的事情没有更好的解决方案,请三思而后行!



