繁体   English   中英

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

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

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

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

SSHClient.invoke_shell打开“shell”SSH 通道。 What 基本上只是执行用户默认 shell 的简写。 否则它与 SSH“exec”通道(由SSHClient.exec_command )的作用没有SSHClient.exec_command

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM