How to download only the latest file from SFTP server with Paramiko?

20,017

Solution 1

Use the SFTPClient.listdir_attr instead of the SFTPClient.listdir to get listing with attributes (including the file timestamp).

Then, find a file entry with the greatest .st_mtime attribute.

The code would be like:

latest = 0
latestfile = None

for fileattr in sftp.listdir_attr():
    if fileattr.filename.startswith('Temat') and fileattr.st_mtime > latest:
        latest = fileattr.st_mtime
        latestfile = fileattr.filename

if latestfile is not None:
    sftp.get(latestfile, latestfile)

For a more complex example, see How to get the latest folder that contains a specific file of interest in Linux and download that file using Paramiko in Python?

Solution 2

import paramiko
remote_path = '/tmp'

ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=<IP>, username=<USER>, password=<PW>,allow_agent=False)
sftp_client = ssh_client.open_sftp()

sftp_client.chdir(remote_path)
for f in sorted(sftp_client.listdir_attr(), key=lambda k: k.st_mtime, reverse=True):
    sftp_client.get(f.filename, f.filename)
    break

sftp_client.close()
ssh_client.close()

This will connect to the remote server (IP) using password (PW) as user (USER) & downloads the latest file available under <remote_path>

Share:
20,017
Cosaquee
Author by

Cosaquee

I like Puppet, Ruby, DevOps and automation. Simple stuff for complex problems.

Updated on June 23, 2021

Comments

  • Cosaquee
    Cosaquee almost 3 years

    I want to write script that connects to my university SFTP server and downloads the latest file with exercises. So far I've changed a little bit the code from Paramiko example, but I do not know how to download the latest file.

    Here is my code :

    import functools
    import paramiko 
    
    class AllowAnythingPolicy(paramiko.MissingHostKeyPolicy):
        def missing_host_key(self, client, hostname, key):
            return
    
    adress = 'adress'
    username = 'username'
    password = 'password'
    
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(AllowAnythingPolicy())
    client.connect(adress, username= username, password=password)
    
    def my_callback(filename, bytes_so_far, bytes_total):
        print ('Transfer of %r is in progress' % filename) 
    
    sftp = client.open_sftp()
    sftp.chdir('/directory/to/file')
    for filename in sorted(sftp.listdir()):
        if filename.startswith('Temat'):
            callback_for_filename = functools.partial(my_callback, filename)
            sftp.get(filename, filename, callback=callback_for_filename)
    
    client.close()