本文介绍了带有密钥和用户名/密码的Paramiko SFTP-&Oops,未经处理的类型3(&q;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试从Python(使用Paramiko)通过SFTP连接到远程服务器,以自动检索文件。 系统版本: 操作系统:Mac OS X Lion 巨蟒:2.7.1 帕拉米科:1.7.7.2
我最小的例子:
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
有人知道日志中的"哎呀,未处理类型3"是什么意思吗?这似乎就是整个事情分崩离析的时候。或者,如果有人发现我在代码中做了一些非常错误的事情,这也会很有帮助。
推荐答案
我意识到这个问题已经提出近4年了,但我遇到了同样的问题,并找到了可行的解决方案!
引用单据:http://docs.paramiko.org/en/2.4/api/transport.html
文档中connect()
方法下提到:
这是START_CLIENT、GET_Remote_SERVER_KEY和Transport.auth_Password或Transport.auth_Public Key的快捷方式。
所以您根本不能使用connect()
,如果您需要进行多因素身份验证,您必须使用上述方法手动协商,并触发两种身份验证,首先使用密钥身份验证,然后使用密码身份验证。
以下代码片段适合我!
host = "some-host"
port = 22
sftp_key = "/some-key"
username = "some-user"
password = "some-pass"
sftp_key = paramiko.RSAKey.from_private_key_file(sftp_key)
transport = paramiko.Transport((host, port))
transport.start_client(event=None, timeout=15)
transport.get_remote_server_key()
transport.auth_publickey(username, sftp_key, event=None)
transport.auth_password(username, password, event=None)
sftp = paramiko.SFTPClient.from_transport(transport)
并将整个过程包装在一个函数中,以处理几乎任何您可以使用的SFTP服务器。我的错误处理被省略,因为它在这里没有意义...
#Auth types: user_pass, key_only, key_and_pass
#You can pass a junk string in for password or sftp_key if not used
def connect_to_sftp(host, port, username, password, sftp_key, auth_type):
try:
transport = paramiko.Transport((host, port))
if auth_type == "key_and_pass":
sftp_key = paramiko.RSAKey.from_private_key_file(sftp_key)
transport.start_client(event=None, timeout=15)
transport.get_remote_server_key()
transport.auth_publickey(username, sftp_key, event=None)
transport.auth_password(username, password, event=None)
#transport.connect(username = username, password = password, pkey = sftp_key)
elif auth_type == "key_only":
sftp_key = paramiko.RSAKey.from_private_key_file(sftp_key)
transport.connect(username = username, pkey = sftp_key)
elif auth_type == "user_pass":
transport.connect(username = username, password = password)
else:
## Do your own error handling :)
print "uh-oh!"
sftp = paramiko.SFTPClient.from_transport(transport)
except Exception, e:
## Do your own error handling :)
print "uh-oh!"
return sftp, transport
这篇关于带有密钥和用户名/密码的Paramiko SFTP-&Oops,未经处理的类型3(&q;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!