Ich schreibe gerade ein Bash-Skript, das ich geschrieben habe, in Python um. Der Kern des Skripts war
ssh -t first.com "ssh second.com very_remote_command"
Ich habe ein Problem mit der verschachtelten Authentifizierung mit paramiko. Ich konnte keine Beispiele finden, die sich mit meiner genauen Situation befassen, aber ich konnte Beispiele finden mit sudo auf einem entfernten Host.
Die erste Methode schreibt an 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()
Die zweite erstellt einen Kanal und verwendet die socket-ähnliche senden. y recv .
Ich konnte die stdin.write zur Arbeit mit sudo aber es funktioniert nicht mit ssh auf dem entfernten Host.
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 luser@second.com')
stdin.write('secret')
stdin.flush()
print '---- out ----'
print stdout.readlines()
print '---- error ----'
print stderr.readlines()
ssh.close()
...druckt...
---- 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']
Der Pseudoterminal-Fehler erinnerte mich an die -t-Flagge in meinem ursprünglichen Befehl, so dass ich zur zweiten Methode wechselte und einen Kanal verwendete. Anstelle von ssh.exec_command und später, habe ich:
t = ssh.get_transport()
chan = t.open_session()
chan.get_pty()
print '---- send ssh cmd ----'
print chan.send('ssh luser@second.com')
print '---- recv ----'
print chan.recv(9999)
chan = t.open_session()
print '---- send password ----'
print chan.send('secret')
print '---- recv ----'
print chan.recv(9999)
...aber er gibt '---- send ssh cmd ----' aus und bleibt einfach hängen, bis ich den Prozess beende.
Ich bin neu in Python und kenne mich nicht allzu gut mit Netzwerken aus. Im ersten Fall, warum funktioniert das Senden des Passworts mit sudo aber nicht mit ssh ? Sind die Eingabeaufforderungen unterschiedlich? Ist paramiko überhaupt die richtige Bibliothek für diese Aufgabe?