paramiko SFTP 在获取时挂起

发布于 2024-09-13 17:25:09 字数 477 浏览 6 评论 0原文

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

I'm trying to use paramiko to get a file via SFTP.
It connects, I can list directories and it even downloads the first megabyte or so of the file but then it just hangs. No exception, no error, nothing. It just hangs there indefinitely.

Here's the code I'm working with:

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 :\

I have sftp access to the host in question but no shell access.
The host contains a single file that I need to fetch regularly and process in a python script.

Any help with this problem or alternate solutions to doing SFTP in Python are greatly appreciated :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

海未深 2024-09-20 17:25:09

我遇到了和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()

I was experiencing the same problem as Ulfur. He posted his own fix/workaround as a comment to another answer, so I decided to add it as a proper answer to make it more visible.

The basic idea is to not use the .get() method, but to loop over the lines. The following is a Python 3 implementation.

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()
后知后觉 2024-09-20 17:25:09

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

I suggest you fire up Wireshark on the client and see what's happening at the protocol level. You won't be able to read the data in the packets as it will be encrypted, but you will see what's going on at the TCP/IP level and that might provide a clue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文