【问题标题】:What is the difference between exec_command and send with invoke_shell() on Paramiko?exec_command 和在 Paramiko 上使用 invoke_shell() 发送有什么区别?
【发布时间】:2019-09-09 17:37:18
【问题描述】:

那么SSHClient.exec_command() 和在 Paramiko 上用SSHClient.invoke_shell 发送有什么区别?

我可以用exec_command 向MikroTik 路由器设备发送和执行命令,但不能用send (invoke_shell()) 执行它。

另一方面,我可以向 Cisco 设备发送和执行命令 send (invoke_shell()),但不能使用 exec_command 执行它。

我的意思是配置命令,比如routing(ip route xxx xxx)或者make vlan或者添加ip地址等等。

【问题讨论】:

    标签: python ssh paramiko cisco


    【解决方案1】:

    区别在于invoke_shell使用SSHshell通道,而exec_command使用SSHexec通道。

    作为用户/开发人员,这对您来说真正意味着什么取决于 SSH 服务器,而不是 Paramiko 本身。


    通用 *nix OpenSSH 服务器:

    • shell 通道执行登录 shell(就像您使用 SSH 终端客户端登录一样)。然后,shell 将显示命令提示符并等待客户端/用户键入命令。 shell 通道的目的是实现交互式 shell 会话。所以基本上它的合法用途是 SSH 终端客户端的实现。这是一个人很少会做的事情。如果这样做,您通常希望使用terminal emulation(Paramiko invoke_shell 无条件地这样做,但实际上可以在没有终端仿真的情况下打开shell 频道)。

      shell 通道显然是 SSH 终端客户端(如 OpenSSH ssh 或 PuTTY)在正常情况下使用的。

      shell 通道是一个带有输入和输出的黑盒子。输入和输出没有结构。例如,如果您通过将命令发送到输入来执行命令,您将永远无法知道它何时结束。如果你向输入队列发送两个命令,你将无法区分什么输出来自什么命令。

    • exec 命令将命令作为“参数”并在隔离环境中执行它——仍然通过用户的默认 shell,但不是作为“登录”shell,这可能会导致命令执行存在显着差异。

      有关此类差异的典型示例,请参阅Some Unix commands fail with "<command> not found", when executed using Python Paramiko exec_command

      exec 频道的目的是自动执行命令。所以通常你不想使用终端仿真,以避免命令做一些花哨的事情,比如分页、着色和主要是交互式确认。这就是为什么get_pty 的默认值为False

      exec 通道由 OpenSSH ssh 或 PuTTY plink 使用,当您指定要在其命令行上执行的命令时:

      ssh user@host command
      

    对于不太常见的 SSH 服务器,差异可能会更加显着。有些服务器甚至可能不支持其中一个频道。它们似乎同时支持两者也很常见,但其中之一(通常是exec)完全损坏了。

    Executing command using Paramiko exec_command on device is not working


    Java/JSch 也有类似的问题:
    What is the difference between the 'shell' channel and the 'exec' channel in JSch

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      相关资源
      最近更新 更多