Paramiko / scp - check if file exists on remote host

26,457

Solution 1

Use paramiko's SFTP client instead. This example program checks for existence before copy.

#!/usr/bin/env python

import paramiko
import getpass

# make a local test file
open('deleteme.txt', 'w').write('you really should delete this]n')

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
    ssh.connect('localhost', username=getpass.getuser(),
        password=getpass.getpass('password: '))
    sftp = ssh.open_sftp()
    sftp.chdir("/tmp/")
    try:
        print(sftp.stat('/tmp/deleteme.txt'))
        print('file exists')
    except IOError:
        print('copying file')
        sftp.put('deleteme.txt', '/tmp/deleteme.txt')
    ssh.close()
except paramiko.SSHException:
    print("Connection Error")

Solution 2

It should be possible to use only paramiko combined with 'test' command to check file existence. This doesn't require SFTP support:

from paramiko import SSHClient

ip = '127.0.0.1'
file_to_check = '/tmp/some_file.txt'

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect(ip)

stdin, stdout, stderr = ssh.exec_command('test -e {0} && echo exists'.format(file_to_check))
errs = stderr.read()
if errs:
    raise Exception('Failed to check existence of {0}: {1}'.format(file_to_check, errs))

file_exits = stdout.read().strip() == 'exists'

print file_exits
Share:
26,457
Mark
Author by

Mark

Updated on December 14, 2020

Comments

  • Mark
    Mark over 3 years

    I'm using Python Paramiko and scp to perform some operations on remote machines. Some machines I work on require files to be available locally on their system. When this is the case, I'm using Paramiko and scp to copy the files across. For example:

    from paramiko import SSHClient
    from scp import SCPClient
    
    ssh = SSHClient()
    ssh.load_system_host_keys()
    ssh.connect('192.168.100.1')
    
    scp = SCPClient(ssh.get_transport())
    scp.put('localfile', 'remote file')
    scp.close()
    
    ssh.close()
    

    My question is, how can I check to see if 'localfile' exists on the remote machine before I try the scp?

    I'd like to try and use Python commands where possible i.e. not bash

  • Mark
    Mark about 8 years
    Thanks for your suggestion. Does sftp need anything to run on the remote machine i.e. FTP?
  • tdelaney
    tdelaney about 8 years
    No, it should be part of the servers ssh daemon. My SFTP worked without extra config.