Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

paramiko SFTP hangs on get

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

like image 237
Ulfur Avatar asked Oct 27 '25 07:10

Ulfur


1 Answers

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()
like image 79
Krachtwerk Avatar answered Oct 28 '25 22:10

Krachtwerk



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!