Upload file via SFTP with Python

Question:

I wrote a simple code to upload a file to a SFTP server in Python. I am using Python 2.7.

import pysftp

srv = pysftp.Connection(host="www.destination.com", username="root",
password="password",log="./temp/pysftp.log")

srv.cd('public') #chdir to public
srv.put('C:UsersXXXDropboxtest.txt') #upload file to nodejs/

# Closes the connection
srv.close()

The file did not appear on the server. However, no error message appeared. What is wrong with the code?

I have enabled logging. I discovered that the file is uploaded to the root folder and not under public folder. Seems like srv.cd('public') did not work.

Asked By: guagay_wk

||

Answers:

I found the answer to my own question.

import pysftp

srv = pysftp.Connection(host="www.destination.com", username="root",
password="password",log="./temp/pysftp.log")

with srv.cd('public'): #chdir to public
    srv.put('C:UsersXXXDropboxtest.txt') #upload file to nodejs/

# Closes the connection
srv.close()

Put the srv.put inside with srv.cd

Answered By: guagay_wk
import pysftp

with pysftp.Connection(host="www.destination.com", username="root",
password="password",log="./temp/pysftp.log") as sftp:

  sftp.cwd('/root/public')  # The full path
  sftp.put('C:UsersXXXDropboxtest.txt')  # Upload the file

No sftp.close() is needed, because the connection is closed automatically at the end of the with-block

I did a minor change with cd to cwd

Syntax –

# sftp.put('/my/local/filename')  # upload file to public/ on remote
# sftp.get('remote_file')         # get a remote file
Answered By: Amit Ghosh

With as a context manager will close the connection. Explicitly using srv.close() is not required

Answered By: Ambesh

Do not use pysftp it’s dead. Use Paramiko directly. See also pysftp vs. Paramiko.

The code with Paramiko will be pretty much the same, except for the initialization part.

import paramiko
 
with paramiko.SSHClient() as ssh:
    ssh.load_system_host_keys()
    ssh.connect(host, username=username, password=password)
 
    sftp = ssh.open_sftp()

    sftp.chdir('public')
    sftp.put('C:UsersXXXDropboxtest.txt', 'test.txt')

To answer the literal OP’s question: the key point here is that pysftp Connection.cd works as a context manager (so its effect is discarded without with statement), while Paramiko SFTPClient.chdir does not.

Answered By: Martin Prikryl
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.