如何在Python Paramiko中启动没有终端仿真的shell?

发布于 2021-01-29 16:44:01

有没有一种方法可以在没有Python Paramiko终端仿真的情况下启动shell?

  • 我尝试使用,exec_command但是我确实需要一个交互式外壳。
  • 使用invoke_shell()我可以获得一个终端并可以发出命令,但是从Windows 10 OpenSSH服务器上,我得到了带有ANSI转义序列(包括H代码)的输出,这不易处理为纯文本。请参阅从WIN10 ssh服务器解码数据(paramiko recv()的响应)
关注者
0
被浏览
186
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    ParamikoSSHClient.invoke_shell打开“
    shell” SSH通道。基本上,这只是执行用户默认Shell的简写。否则,它与SSH“
    exec”通道(由使用SSHClient.exec_command)没有什么不同。

    可以在有终端仿真或没有终端仿真的情况下启动“ shell”和“ exec”
    SSH通道。只是ParamikoSSHClient.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”通道表示您正在 滥用 通道是 出于其非设计目的。
    如果对您尝试做的事情没有更好的解决方案,请三思而后行!



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看