首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Paramiko中没有终端仿真的情况下启动shell?

问如何在Paramiko中没有终端仿真的情况下启动shell?
EN

Stack Overflow用户
提问于 2019-08-29 17:42:44
回答 1查看 2K关注 0票数 1

在Paramiko中,是否有一种无需终端仿真即可启动shell的方法?

  • 我尝试过使用exec_command,但是我真的需要一个交互式的shell。
  • 使用invoke_shell(),我可以获得一个终端并可以发出命令,但是在Windows10 OpenSSH服务器上,我获得了一个包含H代码在内的ANSI转义序列的输出,这对纯文本的处理并不容易。请参阅Decoding data from WIN10 ssh server (response of paramiko recv())。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-29 18:05:52

Paramiko SSHClient.invoke_shell打开"shell“SSH频道。什么基本上只是执行用户的默认shell的简写。否则,它与SSH "exec“通道(由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(术语、宽度、高度、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“通道而不使用终端仿真,则表示您滥用它是为了不为其设计的目的。三思而后行,如果你想要做的事情没有更好的解决方案的话!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57715388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档