有没有办法在 Python Paramiko 中启动没有终端仿真的 shell?
- 我尝试过使用
exec_command
,但我确实需要一个交互式 shell。 - 使用
invoke_shell()
我得到一个终端并可以发出命令,但从 Windows 10 OpenSSH 服务器我得到一个带有 ANSI 转义序列的输出,包括H
代码,其中不容易处理为纯文本。引用Decoding data from WIN10 ssh server (response of paramiko recv()) .
最佳答案
Paramiko SSHClient.invoke_shell
打开“shell”SSH channel 。基本上只是执行用户默认 shell 的简写。否则它与 SSH“exec” channel (由 SSHClient.exec_command
使用)没有什么不同。
“shell”和“exec”SSH channel 都可以在有或没有终端仿真的情况下启动。只是 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” channel 的唯一目的是实现交互式 SSH 终端客户端(如 PuTTY)。没有终端仿真的终端客户端没有任何意义。
如果您想在没有终端仿真的情况下使用“shell” channel ,则表明您正在将其滥用于非设计目的。如果没有更好的解决方案来解决您想要做的事情,请三思!
关于python - 如何在 Python Paramiko 中启动没有终端仿真的 shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57715388/