Je suis en train de réécrire un script Bash que j'ai écrit en Python. Le coeur de ce script étaitSession SSH imbriquée avec Paramiko
ssh -t first.com "ssh second.com very_remote_command"
Je rencontre un problème avec l'authentification imbriquée avec paramiko. Je n'ai pas pu trouver d'exemples traitant de ma situation précise, mais j'ai pu trouver des exemples avec sudo sur un hôte distant.
The first method écrit à stdin
ssh.connect('127.0.0.1', username='jesse', password='lol')
stdin, stdout, stderr = ssh.exec_command("sudo dmesg")
stdin.write('lol\n')
stdin.flush()
The second crée un canal et utilise la prise comme envoyer et recv.
j'ai pu obtenir stdin.write travailler avec sudo, mais il ne fonctionne pas avec ssh sur l'hôte distant.
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('first.com', username='luser', password='secret')
stdin, stdout, stderr = ssh.exec_command('ssh [email protected]')
stdin.write('secret')
stdin.flush()
print '---- out ----'
print stdout.readlines()
print '---- error ----'
print stderr.readlines()
ssh.close()
... impressions ...
---- out ----
[]
---- error ----
['Pseudo-terminal will not be allocated because stdin is not a terminal.\r\n', 'Permission denied, please try again.\r\n', 'Permission denied, please try again.\r\n', 'Permission denied (publickey,password,keyboard-interactive).\r\n']
L'erreur pseudo-terminal me rappelle du drapeau -t dans ma commande d'origine, donc je suis passé à la deuxième méthode, en utilisant un canal. Au lieu de ssh.exec_command et plus tard, j'ai:
t = ssh.get_transport()
chan = t.open_session()
chan.get_pty()
print '---- send ssh cmd ----'
print chan.send('ssh [email protected]')
print '---- recv ----'
print chan.recv(9999)
chan = t.open_session()
print '---- send password ----'
print chan.send('secret')
print '---- recv ----'
print chan.recv(9999)
... mais il imprime « ---- envoyer cmd ssh ---- » et se planter jusqu'à ce que je tue le processus. Je ne connais pas Python et je ne connais pas très bien les réseaux. Dans le premier cas, pourquoi l'envoi du mot de passe fonctionne-t-il avec sudo mais pas avec ssh? Les invites sont-elles différentes? Paramiko est-il même la bonne bibliothèque pour cela?
J'essaie d'utiliser votre solution pour un besoin similaire .. Cependant ('un-invite $') n'est pas toujours fixe .. il a toujours un '#' mais un autre contenu qui continue à varier..comment je compte pour cela? – Amistad
Si elle se termine par '#', alors changez 'une-invite $ 'en' # '. Cependant, assurez-vous de vérifier l'espace blanc de fin, c'est-à-dire '... endswith ('#')' n'est pas la même chose que '... endswith ('#')'. – mqsoh
serait l'utilité attendue (une chose TCL) vous aider? L'équivalent python est pexpect je crois ... – Jimbo