我正在尝试使用paramiko通过SFTP获取文件。 它连接,我可以列出目录,它甚至下载文件的第一兆字节,但它只是挂起。没有例外,没有错误,没有。它只是无限期地挂在那里。
这是我正在使用的代码:
import paramiko
t = paramiko.Transport( host )
t.connect( username=uname, password=passwd )
f = paramiko.SFTPClient.from_transport( t )
print f.listdir()
f.get( fname, fname ) #it hangs on this line :\
我有sftp访问有问题的主机但没有shell访问权限。 主机包含一个我需要定期获取并在python脚本中处理的文件。
非常感谢任何有关此问题的帮助或在Python中执行SFTP的替代解决方案:)
答案 0 :(得分:1)
我建议你在客户端启动Wireshark,看看协议级别发生了什么。您将无法读取数据包中的数据,因为它将被加密,但您将看到TCP / IP级别上发生的情况,这可能提供线索。
答案 1 :(得分:0)
我遇到了与Ulfur相同的问题。他发布了自己的修复程序/替代方法,作为对另一个答案的评论,所以我决定将其添加为适当的答案,以使其更加明显。
基本思想是不使用.get()
方法,而是循环遍历所有行。以下是Python 3的实现。
transport = None
sftp = None
sftp_path = 'some/sftp/path'
dst_path = '/some/local/path'
try:
transport = paramiko.Transport((SFTP_HOST, SFTP_PORT))
transport.set_log_channel('delapi')
transport.connect(username=SFTP_USER, password=SFTP_PASS)
sftp = paramiko.SFTPClient.from_transport(transport)
with sftp.open(sftp_path, 'r') as remote:
with open(dst_path, 'w') as local:
for line in remote:
local.write(line)
except SSHException:
print("SSH error")
finally:
if sftp:
sftp.close()
if transport:
transport.close()