So what is the difference between SSHClient.exec_command()
and send with SSHClient.invoke_shell
on Paramiko?
I can send and execute command with exec_command
to MikroTik router device but can't execute it with send
(invoke_shell()
).
On the other hand, I can send and execute command send
(invoke_shell()
) to Cisco device, but can't execute it with exec_command
.
The command I mean is the configuration command like routing (ip route xxx xxx) or make vlan or add an ip address and etc..
The difference is that invoke_shell
uses SSH shell
channel, while exec_command
uses SSH exec
channel.
What that really means to you as a user/developer really depends on the SSH server, not on Paramiko itself.
In common *nix OpenSSH server:
The
shell
channel executes a login shell (as if you login with SSH terminal client). The shell will then present a command prompt and wait for client/user to type the commands. The purpose of theshell
channel is to implement an interactive shell session. That is something one will do very very rarely. If you do, you typically want to use terminal emulation (Paramikoinvoke_shell
does that unconditionally, but actually it's possible to open theshell
channel without the terminal emulation). SSH terminal clients (like OpenSSHssh
or PuTTY) do obviously useshell
channel, under normal circumstances.The
exec
command takes a command as an "argument" and executes it in an isolated environment – still via user's default shell, but not as a "login" shell, what may cause significant differences in the command execution.For a typical example of such difference, see 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 terminal emulation, to avoid the command to do fancy stuff like pagination, coloring and mainly interactive confirmations. That's why the default value ofget_pty
isFalse
.exec
channel is used by OpenSSHssh
or PuTTYplink
, when you specify a command to execute on its command line:ssh user@host command
With less common SSH servers, the difference can be even more significant. Some servers may even not support one of the channels. It is also quite common that they seeming support both, but one of them (typically the exec
) is completely broken.
There's a similar question for Java/JSch:
What is the difference between the 'shell' channel and the 'exec' channel in JSch
来源:https://stackoverflow.com/questions/55762006/what-is-the-difference-between-exec-command-and-send-with-invoke-shell-on-para