使用Python通过SFTP上传文件

29

我写了一段简单的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()

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

我已经启用了日志记录。我发现文件已上传到根文件夹而不是public文件夹下。好像srv.cd('public')没有起作用。

3个回答

43

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

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()

srv.put 放在 srv.cd 内部


2
Pysftp已经停止更新了,建议使用Paramiko。请参考我的回答 - Martin Prikryl

21
不要使用pysftp,它已经停止维护了。直接使用Paramiko吧。另外可以参考pysftp vs. 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')

回答字面上的OP问题:关键点在于pysftp Connection.cd作为一个上下文管理器(所以它的效果在没有with语句的情况下被丢弃),而Paramiko SFTPClient.chdir则不是。

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

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

我对 cd 进行了小改动,改成了 cwd

语法 -

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

cd 更改为 cwd 是实际的修复。cd 作为上下文管理器工作,而 cwd 不是。 - Martin Prikryl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接