Paramiko SFTP mit key und Benutzername/Passwort - "Hoppla, nicht behandelte Typ 3"
Ich versuche, eine Verbindung über SFTP auf einen remote-server von Python (mit Paramiko) zu automatisieren Abruf von Dateien.
System-Versionen:
OS: Mac OS X Lion
Python: 2.7.1
Paramiko: 1.7.7.2
Meine kleinste Beispiel:
key_file = '/absolute/path/to/.ssh/id_rsa_key' # NOT .pub
key_passphrase = 'id_rsa_key_passphrase'
host = 'ftp.test.com'
port = 22
username = 'my_ftp_username'
password = 'my_ftp_password'
# SSH Key
my_key = paramiko.RSAKey.from_private_key_file(key_file, password=key_passphrase)
# SFTP Connection
transport = paramiko.Transport((host, port))
transport.connect(username=username, password=password, pkey=my_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# Print something
print sftp.listdir()
# Close connections
sftp.close()
transport.close()
Den oben erzeugt folgende log-Ausgabe:
DEB [20120606-16:20:46.121] thr=1 paramiko.transport: starting thread (client mode): 0x8ae7dd0L
INF [20120606-16:20:46.241] thr=1 paramiko.transport: Connected (version 2.0, client All)
DEB [20120606-16:20:46.242] thr=1 paramiko.transport: kex algos:['diffie-hellman-group1-sha1', 'diffie-hellman-group-exchange-sha1'] server key:['ssh-rsa'] client encrypt:['aes256-cbc', 'aes192-cbc'] server encrypt:['aes256-cbc', 'aes192-cbc'] client mac:['hmac-sha1', 'hmac-sha1-96'] server mac:['hmac-sha1', 'hmac-sha1-96'] client compress:['none'] server compress:['none'] client lang:[''] server lang:[''] kex follows?False
DEB [20120606-16:20:46.242] thr=1 paramiko.transport: Ciphers agreed: local=aes256-cbc, remote=aes256-cbc
DEB [20120606-16:20:46.242] thr=1 paramiko.transport: using kex diffie-hellman-group1-sha1; server key type ssh-rsa; cipher: local aes256-cbc, remote aes256-cbc; mac: local hmac-sha1, remote hmac-sha1; compression: local none, remote none
DEB [20120606-16:20:46.673] thr=1 paramiko.transport: Switch to new keys ...
DEB [20120606-16:20:46.706] thr=2 paramiko.transport: Attempting password auth...
DEB [20120606-16:20:47.112] thr=1 paramiko.transport: userauth is OK
INF [20120606-16:20:50.288] thr=1 paramiko.transport: Authentication continues...
DEB [20120606-16:20:50.288] thr=1 paramiko.transport: Methods: ['password', 'publickey']
DEB [20120606-16:20:50.305] thr=2 paramiko.transport: [chan 1] Max packet in: 34816 bytes
WAR [20120606-16:20:50.405] thr=1 paramiko.transport: Oops, unhandled type 3
INF [20120606-16:23:53.582] thr=1 paramiko.transport: Disconnect (code 11): Idle connection
Weiß jemand, was "Hoppla, nicht behandelte Typ 3" im log bedeutet? So scheint es zu sein, wenn die ganze Sache auseinander fällt. Alternativ, wenn jemand sieht was ich mache schrecklich falsch im code wäre auch hilfreich.
- Diese (nicht fixierten) Fehler erscheint cover der Ausgabe, die Sie hier sehen: github.com/paramiko/paramiko/issues/519
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung von sowohl Passwort und key-Authentifizierung an den server, der aussieht wie ein Konflikt. Versuchen Sie es mit der Transport.auth_publickey Methode, um mit zu verbinden. Wenn es nicht gelingt, die docs sagen, dass die Verwendung der
transport.get_exception
Funktion sammeln, um mehr details.Edit:
Laut diese, multifactor-Authentifizierung bedeutet, dass mit einem Passwort und einen Schlüssel. Also, sollten Sie in der Lage sein zu verwenden, die
auth_publickey
Funktion, gefolgt von der auth_password Methode zu bekommen.Oder, wenn Sie ausreichende Zugriffsrechte, können Sie die ftp-Einstellungen zu erfordern nur key-Authentifizierung.
Haben Sie versucht, die Anmeldung mit einem ftp-client, wie filezilla?
Merke ich, dass diese Frage fast 4 Jahre alt, aber ich traf das gleiche problem und eine funktionierende Lösung gefunden!
Verweisen auf die doc: http://docs.paramiko.org/en/2.4/api/transport.html
In der Dokumentation, unter der
connect()
Methode es wird erwähnt, dass:So, Sie können einfach nicht mit
connect()
wenn Sie tun müssen, um multi-Faktor-auth, Sie verhandeln müssen es manuell mit den oben genannten Methoden auslösen und die BEIDEN Authentifizierungen, mit key-auth ersten, bevor Sie ein Kennwort auth.Den unten snippet funktioniert bei mir!
Und verpackt das ganze in eine Funktion zum verarbeiten so ziemlich jedem SFTP-server können Sie werfen es an. Meine Fehlerbehandlung weggelassen, da es nicht sinnvoll ist, hier...
Das Problem kommt von der Tatsache, dass Sie mit einem rsa-Schlüssel-format (key_file = '/absoluter/Pfad/zu/.ssh/id_rsa_key').
Stellen Sie sicher, konvertieren es in eine SSH-RSA mit putty Key generator. Ich habe und verwenden die gleiche code ist: Es funktioniert.