8 votes

Quelle est la différence entre exec_command et send avec invoke_shell() sur Paramiko ?

Alors quelle est la différence entre SSHClient.exec_command() et envoyer avec SSHClient.invoke_shell sur Paramiko ?

Je peux envoyer et exécuter une commande avec exec_command au routeur MikroTik mais ne peut pas l'exécuter avec send ( invoke_shell() ).

D'autre part, je peux envoyer et exécuter la commande send ( invoke_shell() ) vers le dispositif Cisco, mais ne peut pas l'exécuter avec exec_command .

La commande que je veux dire est la commande de configuration comme le routage (ip route xxx xxx) ou faire vlan ou ajouter une adresse ip et etc.

9voto

Martin Prikryl Points 4584

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 ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X