paramiko SFTP 在获取时挂起

3 投票
2 回答
6219 浏览
提问于 2025-04-16 02:38

我正在尝试使用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的方法都非常感谢 :)

2 个回答

1

我建议你在客户端打开Wireshark这个工具,看看协议层面发生了什么。虽然你无法直接读取数据包里的内容,因为它是加密的,但你可以看到TCP/IP层面上发生了什么,这可能会给你一些线索。

5

我遇到的问题和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()

撰写回答