本文介绍了如何在Python Paramiko中启动没有终端仿真的shell?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法在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, including H 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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-13 15:37