2010-11-09 10 views
9

Mam problem z połączeniem się z urządzeniem z Paramiko (wersja 1.7.6-2) ssh klient:Paramiko AuthenticationException problem

$ 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. 
>>> 

Kiedy używać ssh z linii poleceń, to działa dobrze:

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. 

# 

Ktoś to widział?

Edycja 1

Oto pełne informacje wyjściowe polecenia 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 

Edycja 2 Oto wynik pyton z debugowania:

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

Próbowałem połączyć się z QNAP TS-409, który uruchamia wbudowany linux. Dobrze pracował. – hughdbrown

+0

Domyślam się, że możesz zrobić 'ssh root @ 123.0.0.1', aby zobaczyć, jak łączy się ssh. –

+0

zrobić "ssh -v [email protected]" i sprawdzić, czy SSH używa uwierzytelniania kluczem publicznym lub innej metody uwierzytelniania? –

Odpowiedz

7

Serwer ssh na urządzeniu zdalnym odmówił Twojego uwierzytelnienia. Upewnij się, że używasz właściwego klucza, a urządzenie nie ma żadnych innych ograniczeń dostępu. Trudno powiedzieć, co się dzieje bez logów z serwera.

[EDYTOWANIE] Właśnie przeglądałem twoje wyniki, uwierzytelniasz się przy użyciu uwierzytelniania None. Zwykle nie jest to dozwolone i służy do określenia, jakie metody autoryzacji są dozwolone przez serwer. Możliwe, że serwer używa uwierzytelniania na podstawie hosta (lub w ogóle żadnego!).

Odtąd auth_none() jest rzadko używany, nie jest dostępny z klasy SSHClient, więc będziesz musiał bezpośrednio użyć Transport.

transport.auth_none('root') 
+0

To było to ... podchwytliwe. Dzięki. – waffleman

+0

Hi @ awffleman, również miałem problem z tym samym .. więc wstawiłem linię transportu.auth_none ('root') w kodzie, ale teraz otrzymuję błąd jako .. NameError: nazwa 'transport' nie jest zdefiniowana –

+0

@Spike: Czy zadeklarowałeś transport? transport = ssh.get_transport() – waffleman

0

paramiko's SSHClient ma load_system_host_keys metodę, która można użyć do załadowania zestawu kluczy określonego przez użytkownika. Jako przykład w wyjaśnieniu do dokumentu, należy go uruchomić przed połączeniem z serwerem.

+0

Brak szczęścia. Próbowałem też usunąć znane_hosty, aby sprawdzić, czy to miało jakiś wpływ. – waffleman

+0

@waffleman: czy wypróbowałeś metodę 'load_host_keys'? – SilentGhost

+0

Nie działa – waffleman

0

Otrzymuję podobny błąd, gdy serwer korzysta z uwierzytelniania AD. Myślę, że to błąd Paramiko. Nauczyłem się, że muszę ustawić klucze ssh przed użyciem paramiko.

2

Upewnij się, że uprawnienia do publicznych i prywatnych plików kluczy (i ewentualnie do folderu zawierającego) są ustawione bardzo restrykcyjnie (tj. Chmod 600 id_rsa). Okazuje się, że jest to wymagane (przez system operacyjny?) Do używania plików jako kluczy ssh. Znalazłem to od mojego pomocnego kolegi :) Upewnij się również, że używasz poprawnej nazwy użytkownika dla danego klucza ssh.

-3

Próbowałem usunąć folder ~ /. Ssh, to działa dobrze

+3

Nie powinieneś usuwać folderu '.ssh' – dazedconfused

3

Jak bardzo późnym okresie obserwacji w tej sprawie, ja wierzę, że został uruchomiony w tym samym numerze co waffleman, w kontekście zamknięta sieć.

Wskazówka dotycząca używania obiektu auth_none na obiekcie Transport okazała się dość pomocna, ale znalazłem się trochę zaskoczony, jak to zaimplementować. Od dzisiaj przynajmniej nie mogę uzyskać obiektu obiektu SSHClient, dopóki nie połączy się; ale nie połączy się w pierwszej kolejności ...

Więc w przypadku, gdy jest to przydatne dla innych, moja praca jest poniżej. Właśnie przesłoniłem metodę _auth.

OK, jest to delikatne, ponieważ _auth jest rzeczą prywatną. Moje inne alternatywy były - w rzeczywistości wciąż są - do ręcznego tworzenia obiektów Transport i Channel, ale na razie czuję, że jestem znacznie lepiej z tym wszystkim pod maską.

from paramiko import SSHClient 

class SSHClient_noauth(SSHClient): 

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