Mettre en œuvre un shell interactif via ssh en Python à l'aide de Paramiko?

Je veux écrire un programme en Python 3.x sur Windows 7) qui exécute plusieurs commandes dans un shell à distance via ssh. Après avoir regardé paramikos' exec_command fonction de (), j'ai réalisé qu'il ne soit pas adapté à mon cas d'utilisation (parce que le canal est fermé après l'exécution de la commande), comme les commandes dépendent de variables d'environnement (mis en avant les commandes) et ne peuvent être concaténées dans une exec_command() l'appel car ils sont à exécuter à des moments différents dans le programme.

Donc, je veux exécuter des commandes sur le même canal. L'option suivante je l'ai regardé en était la mise en œuvre d'un shell interactif à l'aide de paramikos' invoke_shell() fonction:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=psw, port=22)

channel = ssh.invoke_shell()

out = channel.recv(9999)

channel.send('cd mivne_final\n')
channel.send('ls\n')

while not channel.recv_ready():
    time.sleep(3)

out = channel.recv(9999)
print(out.decode("ascii"))

channel.send('cd ..\n')
channel.send('cd or_fail\n')
channel.send('ls\n')

while not channel.recv_ready():
    time.sleep(3)

out = channel.recv(9999)
print(out.decode("ascii"))

channel.send('cd ..\n')
channel.send('cd simulator\n')
channel.send('ls\n')

while not channel.recv_ready():
    time.sleep(3)

out = channel.recv(9999)
print(out.decode("ascii"))

ssh.close() 

Il y a quelques problèmes avec ce code:

  1. La première "imprimer" ne donne pas toujours l'impression de le " ls "de sortie (parfois, il est imprimé uniquement sur le deuxième "imprimer").
  2. Le premier " cd " et " ls "les commandes sont toujours présents dans la sortie (je les obtenir via le "recv " commande", dans le cadre de la sortie), alors que tous la suite de " cd " et " ls " les commandes sont imprimées parfois, et parfois ils ne le sont pas.
  3. Le deuxième et le troisième " cd " et " ls "commandes (lors de l'impression) apparaissent toujours avant le premier" ls " de sortie.

Je suis confus avec ce "non-déterminisme" et serions très reconnaissants de votre aide.

vous pourrez obtenir de l'aide si remplacer la balise avec le moins d'adeptes avec un python de la balise, en supposant que c'est vraiment le code python. bonne chance.
Avez-vous d'utiliser paramiko? Je l'ai trouvé beaucoup plus facile de travailler avec fabric. Vous venez de configurer env des variables comme user, password et host_string et ensuite vous pouvez faire diverses choses comme l'utilisation: get télécharger des fichiers à partir de l'hôte distant, put envoyer des fichiers et des run pour émettre des commandes. Vous pouvez enchaîner des commandes comme ceci par exemple: run('cd .. && cd simulator && ls').
malheureusement, le tissu n'est pas compatible avec python 3.x il n'est donc pas une option. De toute façon, d'après ce que j'ai vu, le Tissu est juste un wrapper pour paramiko et ne me permet pas de courir "non-enchaînée" les commandes dans le même canal. Il y a beaucoup de logique que j'ai finalement envie de courir entre les commandes du shell.
désolé, j'ai oublié que vous travaillez avec Python 3.x
découvrez netmiko Elle est spécialisée pour les périphériques réseau, mais vous pouvez également l'utiliser avec Linux. Il fonctionne sur Python 3 et est construit sur Paramiko, mais aussi de s'occuper beaucoup de la mise en mémoire tampon pour vous

OriginalL'auteur misha | 2016-03-05