在Paramiko中,是否有一种无需终端仿真即可启动shell的方法?
exec_command,但是我真的需要一个交互式的shell。invoke_shell(),我可以获得一个终端并可以发出命令,但是在Windows10 OpenSSH服务器上,我获得了一个包含H代码在内的ANSI转义序列的输出,这对纯文本的处理并不容易。请参阅Decoding data from WIN10 ssh server (response of paramiko recv())。发布于 2019-08-29 18:05:52
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显式启动shell,如
ssh.exec_command("/bin/bash")
在Linux服务器上,您甚至可以使用SHELL环境变量来避免对shell路径进行硬编码:
ssh.exec_command("$SHELL")
在使用%CMDSPEC% (未经测试)的Windows上也可以进行类似的操作。SSHClient.invoke_shell以支持不需要终端仿真的执行。
如果您查看SSHClient.invoke_shell实现,就会看到:
chan = self._transport.open_session() chan.get_pty(术语、宽度、高度、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“通道而不使用终端仿真,则表示您滥用它是为了不为其设计的目的。三思而后行,如果你想要做的事情没有更好的解决方案的话!
https://stackoverflow.com/questions/57715388
复制相似问题