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

8 人关注

那么,帕拉米科上的 SSHClient.exec_command() 和带 SSHClient.invoke_shell 的发送有什么区别?

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

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

我指的命令是配置命令,如路由(ip route xxx xxx)或制作vlan或添加一个ip地址等。

python
ssh
paramiko
cisco
Adhy
Adhy
发布于 2019-04-19
1 个回答
Martin Prikryl
Martin Prikryl
发布于 2019-04-23
已采纳
0 人赞同

不同的是, invoke_shell 使用SSH shell 通道,而 exec_command 使用SSH exec 通道。

这对作为用户/开发者的你来说到底意味着什么,真的取决于SSH服务器,而不是Paramiko本身。

In common *nix OpenSSH server:

  • 替换代码1】通道执行一个登录外壳(就像你用SSH终端客户端登录一样)。然后shell会出现一个命令提示,等待客户/用户输入命令。替换代码1】通道的目的是实现一个交互式shell会话。所以基本上它的合法用途是实现一个SSH终端客户端。这是一个非常非常少做的事情。如果你这样做,你通常想使用 终端仿真 (Paramiko invoke_shell does that unconditionally, but actually it's possible to open the shell channel without the 终端仿真).

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

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

  • 替换代码3】命令将命令作为一个 "参数",并在一个孤立的环境中执行--仍然通过用户的默认shell,但不是作为一个 "登录 "shell,这可能导致命令执行中的重大差异。

    关于这种差异的典型例子,见 Some Unix commands fail with "<command> not found", when executed using Python Paramiko exec_command .

    The purpose of the exec channel is automating a command execution. So typically you do not want to use a 终端仿真, to avoid the command to do fancy stuff like pagination, coloring and mainly interactive confirmations. That's why the default value of get_pty is False .

    OpenSSH ssh 或PuTTY plink 使用 exec 通道,当你在其命令行上指定执行一个命令时。

    ssh user@host command
    
  •