没有使用密码时Paramiko SFTP出现问题

时间:2010-11-17 21:36:00

标签: python paramiko

我需要使用SFTP上传一些文件,这可以从命令行工作:

$sftp myuser@my_remote_host
Connected to my_remote_host
sftp>

这是我的Paramiko脚本:

#!/usr/bin/env python
import paramiko
import sys
import os

host = "my_remote_host"
port = 22

transport = paramiko.Transport((host, port))

username = "myuser"      

LOCAL_PATH = "/tmp/"
REMOTE_PATH = "/dcs/tmp/"
FILE = "myfile"

transport.connect(username = username)

sftp = paramiko.SFTPClient.from_transport(transport)
path = LOCAL_PATH + FILE
sftp.put(LOCAL_PATH + FILE, REMOTE_PATH + FILE)

sftp.close()
transport.close()
print 'Upload done.'

执行时我收到此错误:

No handlers could be found for logger "paramiko.transport"
Traceback (most recent call last):
  File "./my_sftp.py", line 19, in ?
    sftp = paramiko.SFTPClient.from_transport(transport)
  File "/usr/lib/python2.4/site-packages/paramiko/sftp_client.py", line 102, in from_transport
    chan = t.open_session()
  File "/usr/lib/python2.4/site-packages/paramiko/transport.py", line 655, in open_session
    return self.open_channel('session')
  File "/usr/lib/python2.4/site-packages/paramiko/transport.py", line 745, in open_channel
    raise e
EOFError

添加私钥时出现此错误:

path = os.path.join(os.environ['HOME'], '.ssh', 'id_dsa')
key = paramiko.DSSKey.from_private_key_file(path)
transport.connect(username = username, pkey=key)

Traceback (most recent call last):
  File "./my_sftp.py", line 24, in ?
    transport.connect(username = username, pkey=key)
  File "/usr/lib/python2.4/site-packages/paramiko/transport.py", line 1007, in connect
    self.auth_publickey(username, pkey)
  File "/usr/lib/python2.4/site-packages/paramiko/transport.py", line 1234, in auth_publickey
    return self.auth_handler.wait_for_response(my_event)
  File "/usr/lib/python2.4/site-packages/paramiko/auth_handler.py", line 174, in wait_for_response
    raise e
paramiko.AuthenticationException: Authentication failed.

1 个答案:

答案 0 :(得分:2)

在您的第一个示例中,您无法仅使用用户名进行身份验证,因此无法启动会话。

我不知道为什么你的私钥示例在没有更多信息的情况下无效。它可能是该服务器的错误密钥吗?命令行上的SSH可能正在尝试多个密钥,或从代理获取密钥。

无论如何,更容易从SSHClient课开始。它将把所有身份验证和主机验证部分包装在一个包中。它还有open_sftp()便捷方法来返回SFTPClient实例。