2012-06-06 4 views
5

Ich versuche, über SFTP mit einem Remote-Server von Python (mit Paramiko) zu verbinden, um den Abruf von Dateien zu automatisieren.Paramiko SFTP mit Schlüssel und Benutzername/Passwort - "Ups, unbehandelt Typ 3"

Systemversionen: Betriebssystem: Mac OS X Lion Python: 2.7.1 paramiko: 1.7.7.2

Mein kleinstes 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() 

Die oben die folgende Protokollausgabe erzeugt:

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, unbehandelt Typ 3" im Protokoll bedeutet? Das scheint zu sein, wenn das Ganze auseinander fällt. Alternativ, wenn jemand etwas sieht, mache ich schrecklich falsch im Code, der auch hilfreich wäre.

+0

Dieser (unfixierte) Fehler scheint das Problem zu verbergen, das Sie sehen: https://github.com/paramiko/paramiko/issues/519 – Symmetric

Antwort

1

Sie verwenden sowohl die Kennwort- als auch die Schlüsselauthentifizierung für den Server, was wie ein Konflikt aussieht. Verwenden Sie die Transport.auth_publickey-Methode, um eine Verbindung herzustellen. Wenn dies fehlschlägt, verwenden die Dokumente die Funktion transport.get_exception, um weitere Details zu erfassen.

Edit:

Nach this, Multi-Faktor-Authentifizierung bedeutet sowohl ein Passwort und ein Schlüssel. Sie sollten also die auth_publickey-Funktion verwenden können, gefolgt von der auth_password-Methode.

Oder, wenn Sie über ausreichenden Zugriff verfügen, können Sie die FTP-Einstellungen so anpassen, dass nur die Schlüsselauthentifizierung erforderlich ist.

Haben Sie versucht, sich mit einem FTP-Client wie filezilla anzumelden?

+0

Interessant. Wenn ich den vorgeschlagenen Pfad versuche, sehe ich ein Array von auth_publickey. Dieses Array ist ['password', 'publickey']. Wenn ich dann zu den Dokumenten gehe, die du verlinkt hast (danke), sehe ich, dass die zurückgegebenen Daten eine "Liste von Auth-Typen sind, die für die nächste Stufe der Authentifizierung (normalerweise leer) zulässig sind". Sie würden nicht zufällig wissen, wo die Dokumentation zum mehrstufigen Authentifizierungsprozess ist, oder sogar ein Beispiel/Tutorial, oder? – rebekswr

+0

@rebekswr ok, ich habe meine Antwort mit einigen Sachen auf mehrstufige Authentifizierung aktualisiert. –

+0

Ich habe beide Aufrufe versucht, in beiden möglichen Aufträgen, und beide gaben immer die gleiche Ausgabe wie die anderen, und als ich danach is_authenticated anrief, war ich nie. Ich fahre fort, sftp über eine Befehlszeile anzurufen, da ich nicht brauche, dass es portabel ist. Vielen Dank für deine Hilfe. – rebekswr

0

Das Problem kommt von der Tatsache, dass Sie ein RSA-Schlüsselformat verwenden (key_file = '/absolute/path/to/.ssh/id_rsa_key').

Stellen Sie sicher, dass Sie es in einen SSH RSA mit Putty Key Generator konvertieren. Ich habe und verwende den gleichen Code: Es funktioniert.