使用 pysftp 连接并将文件上传到服务器

Connecting and uploading a file to a server using pysftp

我正在创建一个脚本以通过应用程序将多个文件上传到服务器。用户将能够 select 多个文件,所有文件都将通过 Python 程序上传到服务器。我查看了可用于连接服务器的 SFTP python 库,发现了 pysftp。我下载了最新版本并尝试使用以下脚本进行连接:

import tkinter.filedialog
import pysftp as sftp

def upload():
    try:
        s = sftp.Connection(host='host',username='username',password='password',port=portnumber)
        localpath='C:/Python/Code/example.txt'
        remotepath='/home/example'
        s.put(localpath,remotepath)

        s.close

    except Exception as e:
        print(str(e))
upload()

我运行这个,结果发现报错说我没有hostkey。我做了一些研究,发现您可以通过添加以下内容来关闭对主机密钥验证的需要:

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None

然后将原始行更改为:

s = sftp.Connection(host='hostip',username='username',password='password',port=portno, cnopts=cnopts) 

这样它就不需要主机密钥。这仍然有相同的错误(pysftp__init__.py:61: UserWarning: Failed to load HostKeys)。在感到沮丧并尝试解决我以前避免的工作之前,我尝试了大约一个小时来改变它。我降级到不需要主机密钥验证的以前版本的 pysftp (pysftp==0.2.8)。我再次 运行 以下代码:

import tkinter.filedialog
import pysftp as sftp


def upload():
    try:
        s = sftp.Connection(host='hostip',username='username',password='password',port=portno)
        localpath='C:/Python/Code/example.txt'
        remotepath='/home/test'
        s.put(localpath,remotepath)

        s.close

except Exception as e:
    print(str(e))
upload()

只得到如下错误: 'Failure'

我已经尝试了几个小时了。正如您可能已经猜到的那样,我对 Python 和一般编程还很陌生,所以我可能在某个地方犯了初学者错误。请注意,我可以通过 Filezilla 使用 SFTP 连接到我的服务器,并通过 PuTTY 使用 SSH(我只使用主机、端口、用户名和密码)——所以 that.If 没有问题,任何人都可以帮我解决这个(通过使用最新版本的 pysftp、旧版本或完全不同的库)我将不胜感激。

pysftp 只是 paramiko 的包装器,用于抽象和简化 sftp 操作,如果您在使用 pysftp 时遇到问题,您可以直接使用 parmiko,因为 paramiko 是 pysftp 的依赖项,您已经安装了它。

from paramiko import SSHClient

client = SSHClient()
client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy)
client.connect('hostname', user='user', password='password')
sftp = client.open_sftp()
sftp.put(localpath, remotepath)