使用python通过sftp上传文件

use*_*486 10 python sftp python-2.7 pysftp

我写了一个简单的代码,用于将文件上传到python中的sftp服务器.我正在使用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:\Users\XXX\Dropbox\test.txt') #upload file to nodejs/

# Closes the connection
srv.close()
Run Code Online (Sandbox Code Playgroud)

该文件未出现在服务器上.但是,没有出现错误消息.代码有什么问题?

编辑:我已启用日志记录.我发现文件上传到根文件夹而不是公共文件夹下.似乎srv.cd('public')没有用.

use*_*486 22

我找到了自己问题的答案.

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:\Users\XXX\Dropbox\test.txt') #upload file to nodejs/

# Closes the connection
srv.close()
Run Code Online (Sandbox Code Playgroud)

放在srv.put里面srv.cd

  • Pysftp 已死。最好使用帕拉米科。请参阅[我的答案](/sf/ask/2362629811/#73432631)。 (2认同)

Mar*_*ryl 21

不要使用 pysftp 它已经死了。直接使用Paramiko。另请参见pysftp 与 Paramiko


除了初始化部分之外,Paramiko 的代码几乎相同。

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:\Users\XXX\Dropbox\test.txt', 'test.txt')
Run Code Online (Sandbox Code Playgroud)

回答字面OP的问题:这里的关键点是pysftpConnection.cd作为上下文管理器工作(因此它的效果在没有with声明的情况下被丢弃),而ParamikoSFTPClient.chdir则不然。


Ami*_*osh 9

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:\Users\XXX\Dropbox\test.txt')  # Upload the file
Run Code Online (Sandbox Code Playgroud)

不需要sftp.close(),因为连接在 with 块结束时自动关闭

我做了一个小小的cd改变cwd

句法 -

# sftp.put('/my/local/filename')  # upload file to public/ on remote
# sftp.get('remote_file')         # get a remote file
Run Code Online (Sandbox Code Playgroud)