2012-06-06 13 views
5

Próbuję połączyć się przez SFTP ze zdalnym serwerem z Pythona (przy użyciu Paramiko), aby zautomatyzować pobieranie plików.Paramiko SFTP z kluczem i nazwą użytkownika/hasłem - "Ups, nieobsługiwany typ 3"

Wersje systemowe: OS: Mac OS X Lion Python: 2.7.1 Paramiko: 1.7.7.2

Moja najmniejsza przykład:

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

Powyższy generuje następujący wynik dziennika:

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 

Czy ktoś wie, co oznacza "Ups, nieobsłużony typ 3" w dzienniku? Wydaje się, że to wszystko się rozpada. Ewentualnie, jeśli ktoś widzi coś, co robię okropnie źle w kodzie, który również byłby pomocny.

+0

Ten (niezablokowany) błąd pojawia się, aby omówić problem, który widzisz: https://github.com/paramiko/paramiko/issues/519 – Symmetric

Odpowiedz

1

Używasz uwierzytelniania hasła i klucza do serwera, co wygląda na konflikt. Spróbuj połączyć się przy użyciu metody Transport.auth_publickey. Jeśli się nie powiedzie, docs powiedzą, że używają funkcji transport.get_exception, aby zebrać więcej szczegółów.

Edit:

Według this, uwierzytelnianie wielopoziomowe oznacza przy użyciu zarówno hasła i klucz. Powinno być możliwe użycie funkcji auth_publickey, a następnie auth_password.

Lub, jeśli masz wystarczający dostęp, możesz dostosować ustawienia FTP tak, aby wymagało tylko uwierzytelniania klucza.

Czy próbowałeś zalogować się przy użyciu klienta FTP, na przykład filezilla?

+0

Interesujące. Kiedy próbuję ścieżki, którą zasugerowałeś, widzę tablicę zwróconą przez auth_publickey. Ta tablica to ['password', 'publickey']. Kiedy przejdę do dokumentów, które połączyłeś (dziękuję), widzę, że zwrócone dane są "listą dozwolonych typów uprawnień dla następnego etapu uwierzytelniania (zwykle pustego)". Nie wiedziałbyś, gdzie jest dokumentacja procesu wielostopniowego uwierzytelniania, czy nawet przykład/samouczek? – rebekswr

+0

@rebekswr ok, zaktualizowałem swoją odpowiedź kilkoma kwestiami dotyczącymi wielostopniowego uwierzytelniania. –

+0

Próbowałem obu połączeń, w obu możliwych zleceń i obaj zawsze podawali te same dane wyjściowe, a kiedy zadzwoniłem, jest to potwierdzone, nigdy nie byłem. Przechodzę do wywoływania sftp z wiersza poleceń, ponieważ nie muszę go przenosić. Dziękuję bardzo za Twoją pomoc. – rebekswr

0

Problem wynika z faktu, że używasz formatu klucza RSA (key_file = '/absolute/path/to/.ssh/id_rsa_key').

Należy przekonwertować go na SSH RSA przy użyciu generatora kluczy. Zrobiłem i używam tego samego kodu: Działa.

Powiązane problemy