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

标签 python ssh terminal paramiko ansi-escape

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

  • 我尝试过使用 exec_command,但我确实需要一个交互式 shell。
  • 使用 invoke_shell() 我得到一个终端并可以发出命令,但从 Windows 10 OpenSSH 服务器我得到一个带有 ANSI 转义序列的输出,包括 H 代码,其中不容易处理为纯文本。引用Decoding data from WIN10 ssh server (response of paramiko recv()) .

最佳答案

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

“shell”和“exec”SSH channel 都可以在有或没有终端仿真的情况下启动。只是 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” channel 的唯一目的是实现交互式 SSH 终端客户端(如 PuTTY)。没有终端仿真的终端客户端没有任何意义。

如果您想在没有终端仿真的情况下使用“shell” channel ,则表明您正在将其滥用于非设计目的。如果没有更好的解决方案来解决您想要做的事情,请三思!

关于python - 如何在 Python Paramiko 中启动没有终端仿真的 shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57715388/

相关文章:

Python cv2.imshow() 不工作 : cannot connect to X server

python - 由于启用了 django-social-auth 后端,无法登录到 django 管理页面

java - Project Euler p21 有趣的程序行为

python - 使用sqlalchemy和mysql-python,如何设置charset=utf8mb4?

python - [pycharm 远程 python 控制台] : "cannot connect to X server" error with import pandas

linux - linux终端中的随机文本

python - Django MTM 字段 : limit_choices_to = other_ForeignKeyField_on_same_model?

intellij-idea - IntelliJ IDEA - 远程开发 - 后端IDE未成功启动

shell 脚本 ssh 命令退出状态

bash - 使用 pip 安装新软件包时出现 zsh 文件存在错误