问题描述
有没有办法在Python Paramiko中启动无需终端仿真的shell?
Is there a way to start a shell without terminal emulation in Python Paramiko?
- 我尝试使用
exec_command
,但我确实需要一个交互式外壳。 - 使用
invoke_shell()
我可以找到一个终端,并且可以发出命令,但是从Windows 10 OpenSSH服务器上获得了带有ANSI转义序列的输出,包括H
代码,很难将其处理为纯文本。请参阅。
- I have tried using
exec_command
but I really need an interactive shell. - Using
invoke_shell()
I get a terminal and can issue commands, but from Windows 10 OpenSSH server I get an output with ANSI escape sequences, includingH
code, which is not easy to process to plain text. Refer to Decoding data from WIN10 ssh server (response of paramiko recv()).
推荐答案
Paramiko 打开外壳 SSH通道。基本上,这只是执行用户默认外壳程序的简写。否则,它与SSH exec通道(由)。
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
) does.
shell和 exec可以在有或没有终端仿真的情况下启动SSH通道。只是Paramiko SSHClient.invoke_shell
方法不提供该选项(而 SSHClient.exec_command
提供–通过其 get_pty
参数)。
Both "shell" and "exec" SSH channels can be started with or without the terminal emulation. It's only that Paramiko SSHClient.invoke_shell
method does not offer that option (while SSHClient.exec_command
does – via its get_pty
parameter).
有两种选择:
-
使用
SSHClient.exec_channel
显式启动外壳程序,例如
Use
SSHClient.exec_channel
to start the shell explicitly, like
ssh.exec_command("/bin/bash")
在Linux上服务器,甚至可以通过使用 SHELL
环境变量来避免对shell路径进行硬编码:
On Linux servers, you may even be able to avoid hard-coding the shell path by using the SHELL
environment variable:
ssh.exec_command("$SHELL")
类似在Windows上使用%CMDSPEC%
(未试用)完成。
Similar might be done on Windows using %CMDSPEC%
(untested).
或重新实现 SSHClient.invoke_shell
以支持无需终端仿真的执行。
Or re-implement SSHClient.invoke_shell
to support execution without the terminal emulation.
如果您查看 SSHClient.invoke_shell
实现,它执行以下操作:
If you look at SSHClient.invoke_shell
implementation, it does:
chan = self._transport.open_session()
chan.get_pty(term, width, height, width_pixels, height_pixels)
chan.invoke_shell()
所有您需要做的就是做同样的事情,只需删除呼叫:
All you need, is to do the same, just remove the Channel.get_pty
call:
chan = ssh.get_transport().open_session()
chan.invoke_shell()
尽管请注意,这是有原因的,但为什么 SSHClient.invoke_shell
始终使用终端仿真。 SSH shell通道的唯一目的是实现交互式SSH终端客户端(如PuTTY)。没有终端仿真的终端客户端没有任何意义。
Though note that there's a reason, why SSHClient.invoke_shell
always uses the terminal emulation. The only purpose of SSH "shell" channel is implementing an interactive SSH terminal client (like PuTTY). A terminal client without the terminal emulation makes no sense.
您要使用没有终端仿真的 shell通道表示您出于特定目的滥用它。请三思,如果没有更好的解决方案来解决您要尝试的事情!
这篇关于如何在Python Paramiko中启动没有终端仿真的shell?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!