我正试图通过SFTP连接到Python的远程服务器(使用Paramiko)来自动检索文件。
系统版本: 操作系统:Mac OS X Lion Python: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
有人知道日志中的“Oops,unhandled type 3”是什么意思吗?就在那一刻,一切都分崩离析了。或者,如果有人看到我在代码中做了非常错误的事情,那也会有帮助。
问题是因为您使用rsa密钥格式(key_file='/absolute/path/to/.ssh/id_rsa_key')。
确保使用putty密钥生成器将其转换为SSH RSA。我使用了相同的代码:它正在工作。
您正在对服务器同时使用密码和密钥身份验证,这看起来像是冲突。尝试使用Transport.auth_publickey方法连接。如果失败,文档会说使用
transport.get_exception
函数来收集更多细节。编辑:
根据this,多因素身份验证意味着同时使用密码和密钥。因此,您应该能够使用
auth_publickey
函数,然后使用auth_password方法进入。或者,如果您有足够的访问权限,可以将ftp设置调整为只需要密钥身份验证。
您是否尝试过使用ftp客户端(如filezilla)登录?
我意识到这个问题已经快4岁了,但是我碰到了同样的问题,找到了一个可行的解决方案!
引用文档:http://docs.paramiko.org/en/2.4/api/transport.html
在文档中,在
connect()
方法下提到:因此,如果需要进行多因素身份验证,就不能使用
connect()
,必须使用上述方法手动协商并触发两种身份验证,在进行密码身份验证之前先使用密钥身份验证。下面的片段对我有用!
并将整个过程封装在一个函数中,以处理几乎任何可以抛出的SFTP服务器。我的错误处理被省略了,因为这里没有意义。。。
相关问题 更多 >
编程相关推荐