2012-06-06 21 views
5

Estoy tratando de conectarme a través de SFTP a un servidor remoto de Python (usando Paramiko) para automatizar la recuperación de archivos.Paramiko SFTP con clave y nombre de usuario/contraseña - "Oops, tipo 3 no administrado"

versiones del sistema: SO: Mac OS X Lion Python: 2.7.1 paramiko: 1.7.7.2

Mi menor ejemplo:

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

Lo anterior genera la siguiente salida del 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 

¿Alguien sabe qué "Oops, tipo 3 no controlado" en el registro significa? Eso parece ser cuando todo se desmorona. Alternativamente, si alguien ve algo que estoy haciendo terriblemente mal en el código también sería útil.

+0

Este error (no corregido) parece cubrir el problema que está viendo: https://github.com/paramiko/paramiko/issues/519 – Symmetric

Respuesta

1

Está utilizando autenticación de contraseña y clave para el servidor, lo que parece un conflicto. Intente utilizar el método Transport.auth_publickey para conectarse. Si falla, los documentos dicen que use la función transport.get_exception para recopilar más detalles.

Editar:

Según this, autenticación de múltiples factores que consiste en utilizar tanto una contraseña y una clave. Por lo tanto, debe poder usar la función auth_publickey, seguido del método auth_password para ingresar.

O, si tiene suficiente acceso, puede ajustar la configuración de ftp para que solo requiera autenticación de clave.

¿Ha intentado iniciar sesión utilizando un cliente ftp, como filezilla?

+0

Interesante. Cuando pruebo la ruta que sugirió, veo una matriz devuelta por auth_publickey. Esa matriz es ['contraseña', 'publickey']. Cuando voy a ver los documentos que vinculé (gracias) veo que los datos devueltos son una "lista de tipos de autenticación permitidos para la próxima etapa de autenticación (normalmente vacía)". Usted no sabría dónde está la documentación en el proceso de autenticación de varias etapas, o incluso un ejemplo/tutorial, ¿verdad? – rebekswr

+0

@rebekswr ok, actualicé mi respuesta con algunas cosas sobre la autenticación en varias etapas. –

+0

Intenté ambas llamadas, en ambas órdenes posibles y ambas dieron siempre el mismo resultado que el otro y cuando llamé se autenticó después, nunca lo hice. Voy a llamar a sftp desde una línea de comando ya que no necesito que sea portátil. Muchas gracias por su ayuda. – rebekswr

0

El problema proviene del hecho de que utiliza un formato de clave rsa (archivo_clave = '/absolute/path/to/.ssh/id_rsa_key').

Asegúrese de convertirlo en SSH RSA usando el generador de llaves Putty. Lo hice y uso el mismo código: está funcionando.

Cuestiones relacionadas