如何在 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
代码,这不是易于处理为纯文本。参考Decoding data from WIN10 ssh server (response of paramiko recv()).
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" 频道表明,您正在 滥用 它用于非设计用途.如果没有更好的解决方案,请三思!
有没有办法在 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
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" 频道表明,您正在 滥用 它用于非设计用途.如果没有更好的解决方案,请三思!