gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:20:42 26 4
gpt4 key购买 nike

有没有办法在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com