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

问题描述 投票:0回答:1

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

  • 我尝试过使用
    exec_command
    ,但我真的需要一个交互式 shell。
  • 使用
    invoke_shell()
    我得到一个终端并可以发出命令,但从 Windows 10 OpenSSH 服务器我得到带有 ANSI 转义序列的输出,包括
    H
    代码,该代码不容易处理为纯文本。参考从WIN10 ssh服务器解码数据(paramiko recv()的响应)
python ssh terminal paramiko ansi-escape
1个回答
1
投票

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")
    

    在 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”通道,这表明您正在滥用它用于其设计之外的目的。如果没有更好的解决方案来解决您想要做的事情,请三思!

© www.soinside.com 2019 - 2024. All rights reserved.