La différence est que invoke_shell
utilise SSH shell
tandis que exec_command
utilise SSH exec
canal.
Ce que cela signifie réellement pour vous en tant qu'utilisateur/développeur dépend du serveur SSH, et non de Paramiko lui-même.
Dans le serveur commun *nix OpenSSH :
-
El shell
exécute un shell de connexion (comme si vous vous connectiez avec un client terminal SSH). Le shell présente alors une invite de commande et attend que le client/utilisateur tape les commandes. Le but du shell
est d'implémenter une session interactive du shell. Donc, fondamentalement, son utilisation légitime est l'implémentation d'un client terminal SSH. C'est quelque chose que l'on fait très très rarement. Si vous le faites, vous voudrez généralement utiliser émulation de terminal (Paramiko invoke_shell
le fait de manière inconditionnelle, mais il est en fait possible d'ouvrir la shell
sans l'émulation de terminal).
El shell
est évidemment utilisé par les clients de terminal SSH (comme OpenSSH ssh
ou PuTTY), dans des circonstances normales.
El shell
Le canal est une boîte noire avec une entrée et une sortie. L'entrée et la sortie n'ont aucune structure. Si vous exécutez par exemple une commande en l'envoyant à l'entrée, vous ne pourrez jamais dire quand elle s'est terminée. Si vous envoyez deux commandes à la file d'entrée, vous ne pourrez pas distinguer quelle sortie provient de quelle commande.
-
El exec
command prend une commande en tant qu'"argument" et l'exécute dans un environnement isolé - toujours via le shell par défaut de l'utilisateur, mais pas en tant que shell "de connexion", ce qui peut entraîner des différences significatives dans l'exécution de la commande.
Pour un exemple typique de cette différence, voir Certaines commandes Unix échouent avec "<command> not found", lorsqu'elles sont exécutées à l'aide du paramètre Python exec_command. .
L'objectif de la exec
Le canal automatise l'exécution d'une commande. Donc, typiquement, vous ne voulez pas utiliser une émulation de terminal, pour éviter que la commande fasse des choses fantaisistes comme la pagination, la coloration et principalement les confirmations interactives. C'est pourquoi la valeur par défaut de get_pty
es False
.
exec
est utilisé par OpenSSH ssh
ou PuTTY plink
lorsque vous spécifiez une commande à exécuter sur sa ligne de commande :
ssh user@host command
Avec les serveurs SSH moins courants, la différence peut être encore plus importante. Certains serveurs peuvent même ne pas supporter l'un des canaux. Il est également assez fréquent qu'ils semblent supporter les deux, mais que l'un d'entre eux (généralement le canal exec
) est complètement cassé.
Voir L'exécution de la commande à l'aide de Paramiko exec_command sur le dispositif ne fonctionne pas. .
Une question similaire se pose pour Java/JSch :
Quelle est la différence entre le canal "shell" et le canal "exec" dans JSch ?