2017-08-04 2 views
0

Je travaille sur la conversion d'un outil de Ruby en Python, et la version Ruby utilise Net::SSH pour se connecter à un hôte distant, et envoyer des commandes et récupérer des réponses/données. J'ai utilisé paramiko dans la contrepartie Python, mais je suis confus quant à l'objectif de Channels in paramiko. De ce que j'ai lu jusqu'à présent, il me semble qu'un canal (qui utilise un paramiko Transport) est utilisé pour maintenir une connexion persistante SSH plutôt que d'exécuter une commande et de mettre fin à la connexion.Utilisation de canaux avec Paramiko

Un canal est-il requis? Quelle est la pile requise pour ouvrir une connexion SSH persistante à un hôte pour envoyer et recevoir plusieurs commandes de manière séquentielle et obtenir les réponses, puis une fois la fermeture de la connexion terminée manuellement?

Ce sont les deux principales lignes que je vais avoir du mal à traduire en Python, parce que je ne suis pas sûr si Ruby « Channel » cartes directement à un paramiko « Channel »:

@ssh_connection = Net::SSH.start(@linux_server_name, 
         @server_user_name, 
         :password => @password, 
         :paranoid => false) 

et plus tard dans le code

@channel = @ssh_connection.open_channel do |new_channel| 

Edit: pour expliquer davantage ma question, j'ai pu se connecter à un hôte distant en utilisant paramiko et exécuter plusieurs commandes séquentielles et d'obtenir leurs résultats sans l'aide d'un transport ou un canal, à nouveau , qu'est-ce que t il justifie l'utilisation d'une chaîne dans paramiko?

def connect(self): 
    ssh_connection = paramiko.SSHClient() 
    ssh_connection.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh_connection.connect(self.linux_server_name) 
    stdin, stdout, stderr = ssh_connection.exec_command("ls -l") 
    print(stdout.readlines()) 
    stdin, stdout, stderr = ssh_connection.exec_command("ls -l /tmp") 
    print(stdout.readlines()) 
    ssh_connection.close() 

Répondre

1

exec_command() est suffisant si le serveur SSH prend en charge les commandes en cours d'exécution (comme ssh [email protected] "cmd; cmd; ...". Mais certains serveurs SSH (par exemple, les périphériques réseau tels que les commutateurs, routeurs, ...) ne supporte que le démarrage d'une session interactive. Ensuite, vous devez utiliser invoke_shell() qui retourne un canal

Transport et canal sont tous les termes SSH (autres que Paramiko de) Voir ci-dessous pour plus d'informations RFCs:..

  • rfc4251 - Le protocole SSH architecture
  • rfc4252 - Le protocole d'authentification SSH
  • rfc4253 - Le protocole de couche de transport SSH
  • rfc4254 - Le protocole de connexion SSH
+0

Voir aussi: https://stackoverflow.com/questions/41570124/ping-isnt-allowed-to-be-executed, https://stackoverflow.com/questions/41183971/paramiko-session-times-out-but-i-need-to-execute -a-lot-de-commandes, https://stackoverflow.com/q uestions/40090445/paramiko-exec-command-not-executing-and-retourne-extra-params-found-in-cli – pynexj

+0

Est le 'invoque_shell()' ce que vous utiliseriez, par exemple, quand vous avez besoin d'utiliser un pty? On dirait que ce serait le cas ... –

+0

pas exactement. 'exec_command (commande, get_pty = True)' peut aussi obtenir un pty. voir https://stackoverflow.com/questions/43111173/ – pynexj