2012-06-06 10 views
5

Sto provando a connettermi tramite SFTP a un server remoto da Python (utilizzando Paramiko) per automatizzare il recupero dei file.Paramiko SFTP con chiave e nome utente/password - "Oops, non gestito di tipo 3"

Versioni del sistema: operativo: Mac OS X Lion Python: 2.7.1 paramiko: 1.7.7.2

mio piccolo esempio:

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

Quanto sopra genera il seguente output di registro:

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 

Qualcuno sa cosa significa "Oops, non gestito di tipo 3" nel log? Questo sembra essere quando l'intera cosa cade a pezzi. In alternativa, se qualcuno vede qualcosa che sto facendo terribilmente male nel codice che sarebbe utile pure.

+0

Questo errore (non risolto) sembra coprire il problema che si sta verificando: https://github.com/paramiko/paramiko/issues/519 – Symmetric

risposta

1

Si sta utilizzando sia la password che l'autenticazione della chiave sul server, che sembra un conflitto. Prova a utilizzare il metodo Transport.auth_publickey per connettersi. Se fallisce, i documenti dicono di usare la funzione transport.get_exception per raccogliere maggiori dettagli.

Edit:

Secondo this, autenticazione a più fattori significa utilizzare sia una password e una chiave. Quindi, dovresti essere in grado di utilizzare la funzione auth_publickey, seguita dal metodo auth_password per entrare.

Oppure, se hai accesso sufficiente, puoi regolare le impostazioni ftp per richiedere solo l'autenticazione della chiave.

Hai provato ad accedere utilizzando un client ftp, come ad esempio filezilla?

+0

Interessante. Quando provo il percorso suggerito, vedo una matrice restituita da auth_publickey. Quella matrice è ['password', 'chiave pubblica']. Quando poi vado a vedere i documenti che hai collegato (grazie), vedo che i dati restituiti sono "una lista di tipi di autorizzazione consentiti per la fase successiva di autenticazione (normalmente vuota)". Non sapresti mai dove è la documentazione sul processo di autenticazione multistadio, o anche un esempio/tutorial, vero? – rebekswr

+0

@rebekswr ok, ho aggiornato la mia risposta con alcune cose sull'autenticazione a più stadi. –

+0

Ho provato entrambe le chiamate, in entrambi gli ordini possibili ed entrambi hanno sempre dato lo stesso risultato l'uno dell'altro e quando ho chiamato is_authenticated in seguito non lo sono mai stato. Sto passando a chiamare sftp da una riga di comando poiché non ho bisogno che sia portatile. Grazie mille per il vostro aiuto. – rebekswr

0

Il problema deriva dal fatto che si utilizza un formato di chiave rsa (key_file = '/absolute/path/to/.ssh/id_rsa_key').

Assicurarsi di convertirlo in SSH RSA utilizzando il generatore di chiavi di mastice. Ho fatto e uso lo stesso codice: funziona.

Problemi correlati