Ich überschreibe ein Bash-Skript, das ich in Python geschrieben habe. Der Kern dieses Skripts warVerschachtelte SSH-Sitzung mit Paramiko
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 befassten, aber ich konnte Beispiele mit sudo auf einem entfernten Host finden.
The first method schreibt 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 einen Kanal erstellt und verwendet die pfannenartige senden und recv.
konnte ich stdin.write arbeiten mit sudo, erhalten, aber es mit ssh nicht auf dem entfernten Rechner arbeiten.
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()
... 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']
Die Pseudo-Terminal Fehler erinnerten mich an der -t Flagge in meinem ursprünglichen Befehl, so wechselte ich zu der zweiten Methode, einen Kanal. Statt ssh.exec_command und später, ich habe:
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)
... aber es druckt ‚---- ssh cmd senden ----‘ und hängt nur, bis ich den Prozess zu beenden.
Ich bin neu in Python und nicht zu gut über Netzwerke. Im ersten Fall, warum funktioniert das Senden des Passworts mit sudo aber nicht mit ssh? Sind die Eingabeaufforderungen unterschiedlich? Ist Paramiko dafür sogar die richtige Bibliothek?
Ich versuche, Ihre Lösung für eine ähnliche Notwendigkeit zu verwenden .. Jedoch ('einige-prompt $') ist nicht immer behoben .. es hat immer ein '#', aber einige andere Inhalte, die variiert..wie mache ich Konto dafür? – Amistad
Wenn es mit '#' endet, ändern Sie 'some-prompt $' in '#'. Stellen Sie jedoch sicher, dass Sie nach weißem Leerzeichen suchen, d. H. '... endswith ('#')' ist nicht dasselbe wie '... endswith (' # ') '. – mqsoh
würde das Expect Utility (eine TCL-Sache) Ihnen helfen? Das Python-Äquivalent ist pexpect, glaube ich ... – Jimbo