2010-11-09 20 views
9

Estoy teniendo problemas para conectarse a un dispositivo con un paramiko (versión 1.7.6-2) cliente ssh:paramiko AuthenticationException tema

$ python 
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import paramiko 
>>> ssh = paramiko.SSHClient() 
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
>>> ssh.connect("123.0.0.1", username="root", password=None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 327, in connect 
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys) 
    File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 481, in _auth 
    raise saved_exception 
paramiko.AuthenticationException: Authentication failed. 
>>> 

Cuando uso ssh desde la línea de comandos, que funciona bien:

ssh [email protected] 


BusyBox v1.12.1 (2010-11-03 13:18:46 EDT) built-in shell (ash) 
Enter 'help' for a list of built-in commands. 

# 

¿Alguien ha visto esto antes?

Editar 1

Aquí está la salida detallada del comando ssh:

:~$ ssh -v [email protected] 
OpenSSH_5.3p1 Debian-3ubuntu4, OpenSSL 0.9.8k 25 Mar 2009 
debug1: Reading configuration data /etc/ssh/ssh_config 
debug1: Applying options for * 
debug1: Connecting to 123.0.0.1 [123.0.0.1] port 22. 
debug1: Connection established. 
debug1: identity file /home/waffleman/.ssh/identity type -1 
debug1: identity file /home/waffleman/.ssh/id_rsa type -1 
debug1: identity file /home/waffleman/.ssh/id_dsa type -1 
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.1 
debug1: match: OpenSSH_5.1 pat OpenSSH* 
debug1: Enabling compatibility mode for protocol 2.0 
debug1: Local version string SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu4 
debug1: SSH2_MSG_KEXINIT sent 
debug1: SSH2_MSG_KEXINIT received 
debug1: kex: server->client aes128-ctr hmac-md5 none 
debug1: kex: client->server aes128-ctr hmac-md5 none 
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent 
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP 
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent 
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY 
debug1: Host '123.0.0.1' is known and matches the RSA host key. 
debug1: Found key in /home/waffleman/.ssh/known_hosts:3 
debug1: ssh_rsa_verify: signature correct 
debug1: SSH2_MSG_NEWKEYS sent 
debug1: expecting SSH2_MSG_NEWKEYS 
debug1: SSH2_MSG_NEWKEYS received 
debug1: SSH2_MSG_SERVICE_REQUEST sent 
debug1: SSH2_MSG_SERVICE_ACCEPT received 
debug1: Authentication succeeded (none). 
debug1: channel 0: new [client-session] 
debug1: Requesting [email protected] 
debug1: Entering interactive session. 
debug1: Sending environment. 
debug1: Sending env LANG = en_US.utf8 

Editar 2 Aquí está la salida de pitón con la salida de depuración:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import paramiko, os 
>>> paramiko.common.logging.basicConfig(level=paramiko.common.DEBUG) 
>>> ssh = paramiko.SSHClient() 
>>> ssh.load_system_host_keys() 
>>> ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) 
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
>>> ssh.connect("123.0.0.1", username='root', password=None) 
DEBUG:paramiko.transport:starting thread (client mode): 0x928756cL 
INFO:paramiko.transport:Connected (version 2.0, client OpenSSH_5.1) 
DEBUG:paramiko.transport:kex algos:['diffie-hellman-group-exchange-sha256', 'diffie-hellman-group-exchange-sha1', 'diffie-hellman-group14-sha1', 'diffie-hellman-group1-sha1'] server key:['ssh-rsa', 'ssh-dss'] client encrypt:['aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'arcfour128', 'arcfour256', 'arcfour', 'aes192-cbc', 'aes256-cbc', '[email protected]', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr'] server encrypt:['aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'arcfour128', 'arcfour256', 'arcfour', 'aes192-cbc', 'aes256-cbc', '[email protected]', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr'] client mac:['hmac-md5', 'hmac-sha1', '[email protected]', 'hmac-ripemd160', '[email protected]', 'hmac-sha1-96', 'hmac-md5-96'] server mac:['hmac-md5', 'hmac-sha1', '[email protected]', 'hmac-ripemd160', '[email protected]', 'hmac-sha1-96', 'hmac-md5-96'] client compress:['none', '[email protected]'] server compress:['none', '[email protected]'] client lang:[''] server lang:[''] kex follows?False 
DEBUG:paramiko.transport:Ciphers agreed: local=aes128-ctr, remote=aes128-ctr 
DEBUG:paramiko.transport:using kex diffie-hellman-group1-sha1; server key type ssh-rsa; cipher: local aes128-ctr, remote aes128-ctr; mac: local hmac-sha1, remote hmac-sha1; compression: local none, remote none 
DEBUG:paramiko.transport:Switch to new keys ... 
DEBUG:paramiko.transport:Trying discovered key b945197b1de1207d9aa0663f01888c3c in /home/waffleman/.ssh/id_rsa 
DEBUG:paramiko.transport:userauth is OK 
INFO:paramiko.transport:Authentication (publickey) failed. 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 327, in connect 
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys) 
    File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 481, in _auth 
    raise saved_exception 
paramiko.AuthenticationException: Authentication failed. 
>>> 
+0

Intenté conectarlo a un QNAP TS-409 que ejecuta un linux integrado. Funcionó bien. – hughdbrown

+0

Supongo que podría hacer 'ssh root @ 123.0.0.1' para ver cómo se conecta ssh. –

+0

, haga "ssh -v [email protected]" y vea si SSH usa autenticación de clave pública u otro método de autenticación. –

Respuesta

7

El servidor ssh en el dispositivo remoto ha denegado su autenticación. Asegúrese de estar utilizando la clave correcta y el dispositivo no tiene otras restricciones de acceso. Es difícil decir qué está pasando sin registros del servidor.

[EDIT] Acabo de mirar hacia atrás a través de su salida, se está autenticando usando la autenticación None. Por lo general, esto no siempre está permitido, y se usa para determinar qué métodos de autorización permiten el servidor. Es posible que su servidor esté usando autenticación basada en host (¡o ninguna en absoluto!).

Dado que auth_none() se usa raramente, no se puede acceder desde la clase SSHClient, por lo que deberá usar Transport directamente.

transport.auth_none('root') 
+0

Eso fue ... complicado. Gracias. – waffleman

+0

Hola @waffleman, yo también estaba pasando el mismo problema ... así que puse la línea transport.auth_none ('root') en el código pero ahora obtengo un error como ... NameError: el nombre 'transporte' no está definido –

+0

@Spike: ¿Declaraste ¿transporte? transport = ssh.get_transport() – waffleman

0

paramiko's SSHClient tiene load_system_host_keys método que podría usar para cargar un conjunto de claves específico del usuario. Como ejemplo en la explicación de documentos, debe ejecutarse antes de conectarse a un servidor.

+0

Sin suerte. También traté de eliminar los known_hosts para ver si eso tenía algún efecto. – waffleman

+0

@waffleman: ¿has probado el método 'load_host_keys'? – SilentGhost

+0

No funcionó – waffleman

0

Recibo un error similar cuando el servidor utiliza la autenticación AD. Creo que esto es un error de paramiko. Aprendí que tengo que configurar las claves ssh antes de usar paramiko.

2

Asegúrese de que los permisos en los archivos de clave pública y privada (y posiblemente la carpeta que lo contiene) estén configurados como muy restrictivos (es decir, chmod 600 id_rsa). Resulta que esto es requerido (por el sistema operativo?) Para usar los archivos como claves ssh. Encontré esto de mi colega útil :) También asegúrese de que está utilizando el nombre de usuario correcto para la clave ssh dada.

-3

He tratado de eliminar la carpeta ~./Ssh, entonces está trabajando bien

+3

No debe eliminar la carpeta '.ssh' – dazedconfused

3

Como muy tarde el seguimiento de este asunto, creo que estaba corriendo en el mismo problema que Waffleman, en un contexto de una red confinada.

La sugerencia sobre el uso de auth_none en el objeto Transport resultó bastante útil, pero me encontré un poco desconcertado sobre cómo implementar eso. La cosa es, al menos hoy, no puedo obtener el objeto Transport de un objeto SSHClient hasta que se haya conectado; pero no se conectará en primer lugar ...

Así que en caso de que esto sea útil para otros, mi trabajo está por debajo. Solo anulo el método _auth.

Bien, esto es frágil, ya que _auth es algo privado. Mis otras alternativas fueron, en realidad todavía lo son, crear manualmente los objetos Transport y Channel, pero por el momento siento que estoy mucho mejor con todo esto todavía bajo el capó.

from paramiko import SSHClient 

class SSHClient_noauth(SSHClient): 

    def _auth(self, username, *args): 
     self._transport.auth_none(username) 
     return