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

How do I start a shell without terminal emulation in Python Paramiko?

有没有办法在 Python Paramiko 中启动 shell 而无需终端仿真?

Paramiko SSHClient.invoke_shell opens "shell" SSH channel. What is basically only a shorthand for executing user's default shell. Otherwise it does not differ to what SSH "exec" channel (used by 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(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" 频道表明,您正在 滥用 它用于非设计用途.如果没有更好的解决方案,请三思!