Paramiko 上的 exec_command 和使用 invoke_shell() 发送有什么区别?

Adh*_*dhy 7 python ssh cisco paramiko

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

我可以使用exec_commandMikroTik 路由器设备发送和执行命令,但无法使用send( invoke_shell())执行它。

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

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

Mar*_*ryl 9

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

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


常见的 *nix OpenSSH 服务器:

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

    在正常情况下,该shell通道显然由 SSH 终端客户端(如 OpenSSHssh或 PuTTY)使用。

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

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

    有关这种差异的典型示例,请参阅使用 Python Paramiko exec_command 执行时某些 Unix 命令失败并显示“<command> not found”

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

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

    ssh user@host command
    
    Run Code Online (Sandbox Code Playgroud)

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

请参阅在设备上使用 Paramiko exec_command 执行命令不起作用


Java/JSch 有一个类似的问题:JSch 中
的“shell”通道和“exec”通道有什么区别