2012-06-06 15 views
5

SFTP üzerinden Python'dan (Paramiko kullanarak) dosyaların geri alınmasını otomatikleştirmek için uzak bir sunucuya bağlanmaya çalışıyorum.Paramiko SFTP anahtar ve kullanıcı adı/parola - "Hatalar, işlenmemiş tip 3"

Sistem sürümleri: OS: Mac OS X Lion Python: 2.7.1 Paramiko: 1.7.7.2

Benim en küçük örnek: Yukarıda aşağıdaki günlük çıktı üretir

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

:

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 

Günlüğün anlamı "Oops, unhandled type 3" ne anlama geliyor? Her şey ayrı düştüğü zaman öyle görünüyor. Alternatif olarak, bir şey görürse, kodda çok yanlış yaptığım gibi, bu da yararlı olur.

+0

Bu (çözülmemiş) hata, şu anda gördüğünüz sorunu görüyor: https://github.com/paramiko/paramiko/issues/519 – Symmetric

cevap

1

Bir çakışma gibi görünen sunucuya hem parola hem de anahtar kimlik doğrulaması kullanıyorsunuz. Bağlanmak için Transport.auth_publickey yöntemini kullanmayı deneyin. Başarısız olursa, dokümanlar daha fazla ayrıntı toplamak için transport.get_exception işlevini kullanır.

Düzenleme:

this göre, çok faktörlü kimlik doğrulama şifre ve anahtar ikisini de kullanarak anlamına gelir. Yani, auth_publickey işlevini kullanabilmeniz ve auth_password yöntemini kullanabilmeniz gerekir.

Veya, yeterli erişiminiz varsa, ftp ayarlarını yalnızca anahtar kimlik doğrulaması gerektirecek şekilde ayarlayabilirsiniz.

filezilla gibi bir ftp istemcisi kullanarak giriş yapmayı denediniz mi?

+0

İlginç. Yolu denediğimde, auth_publickey'den dönen bir dizi görmemi önerdin. Bu dizi ['şifre', 'publickey']. Bağlandığınız belgelere baktığımda (teşekkür ederim), döndüğüm verilerin bir sonraki kimlik doğrulama aşamasına (normalde boş olan) izin verilen bir "auth" türü listesi olduğunu görüyorum. Çok aşamalı kimlik doğrulama sürecindeki belgelerin nerede, hatta bir örnek/öğretici olduğunu biliyor musunuz? – rebekswr

+0

@rebekswr Tamam, cevabımı çok aşamalı kimlik doğrulamayla bazı şeyler ile güncelledim. –

+0

Her iki çağrıyı da denedim, her iki sırada da her ikisi de aynı çıktıyı verdiler ve daha sonra is_authenticated olarak adlandırdım. Taşınabilir olmak için ihtiyaç duymadığımdan, bir komut satırından sftp çağırmaya devam ediyorum. Yardımın için çok teşekkürler. – rebekswr

0

Sorun, bir rsa anahtar biçimi kullanmanızdan kaynaklanıyor (key_file = '/absolute/path/to/.ssh/id_rsa_key').

Macun anahtar üreteci kullanarak bir SSH RSA'ya dönüştürdüğünüzden emin olun. Aynı kodu kullandım ve kullandım: Çalışıyor.

İlgili konular