3

我正在尝试使用 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 的替代解决方案:)

4

2 回答 2

4

我遇到了与 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()
于 2019-03-11T10:41:25.613 回答
1

我建议你在客户端启动 Wireshark,看看协议级别发生了什么。您将无法读取数据包中的数据,因为它将被加密,但您会看到 TCP/IP 级别发生了什么,这可能会提供线索。

于 2010-08-11T15:31:34.810 回答