Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursive directory download with Paramiko?

I want to download a directory with unknown contents recursively via SSH and have been trying Paramiko. I have seen several examples how to upload directories but none that covers recursive download.

I can list all items in a directory but haven't been able to find a way of knowing if the item is a file (to download) or a directory (to call recursively).

transport = paramiko.Transport((MY_IP, 22))
transport.connect(username=MY_NAME, password=MY_PASS)
sftp = paramiko.SFTPClient.from_transport(transport)

file_list = sftp.listdir(path='/home/MY_HOME_DIR')
    for item in file_list:
        # Here is an item name... but is it a file or directory?
        print(item)
sftp.close()
transport.close()

So how do I know if an item is a file or if it is a directory?

like image 937
Arahman Avatar asked Jul 13 '11 06:07

Arahman


People also ask

How do I download from Paramiko?

Connect : Connect to sftp using correct credentials. Upload: Upload file in specific remote path. Download : Download the file if it exists. Wait time is in seconds and we can retry as per requirement.

Does Pysftp use Paramiko?

pysftp is a wrapper around Paramiko with a more Python-ish interface. pysftp interface does not expose all of the features of Paramiko. On the other hand, pysftp implements more high-level features on top of Paramiko, notably recursive file transfers.

What is Paramiko SSHClient ()?

SSHClient. A high-level representation of a session with an SSH server. This class wraps Transport , Channel , and SFTPClient to take care of most aspects of authenticating and opening channels. A typical use case is: client = SSHClient() client.

Does Paramiko use OpenSSH?

Paramiko relies on cryptography for crypto functionality, which makes use of C and Rust extensions but has many precompiled options available. See our installation page for details. SSH is defined in RFC 4251, RFC 4252, RFC 4253 and RFC 4254. The primary working implementation of the protocol is the OpenSSH project.


1 Answers

Paramiko does not support recursive operations.

But it's easy to implement:

import os
from stat import S_ISDIR, S_ISREG
def get_r_portable(sftp, remotedir, localdir):
    for entry in sftp.listdir_attr(remotedir):
        remotepath = remotedir + "/" + entry.filename
        localpath = os.path.join(localdir, entry.filename)
        mode = entry.st_mode
        if S_ISDIR(mode):
            try:
                os.mkdir(localpath)
            except OSError:     
                pass
            get_r_portable(sftp, remotepath, localpath)
        elif S_ISREG(mode):
            sftp.get(remotepath, localpath)

You also can use pysftp. It's a wrapper around Paramiko that has more Python-ish look and feel and supports recursive operations. See

  • pysftp.Connection.put_r()
  • pysftp.Connection.get_r()

Or see my answer to Python pysftp get_r from Linux works fine on Linux but not on Windows.

But pysftp seems to be an abandoned project, so you better stick with Paramiko.

like image 181
Martin Prikryl Avatar answered Sep 20 '22 12:09

Martin Prikryl