提问者:小点点

使用pysftp[duplicate]将文件连接并上载到服务器


我正在创建一个脚本,通过应用程序将多个文件上传到服务器。用户将能够选择多个文件,所有这些文件都将通过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()

我运行这个,却发现一个错误,我没有主机密钥。我做了一些研究,发现你可以通过添加来关闭对主机密钥验证的需求:

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

然后将原始行更改为:

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

这样就不需要主机密钥。这仍然存在相同的错误(pysftp__init__.py:61:UserWarning:未能加载主机密钥)。我尝试了大约一个小时来改变这一点,然后感到沮丧,并尝试了一项以前避免的工作。我降级到PySTFP的早期版本(PySTFP==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()

仅获取以下错误:“失败”

我已经试了几个小时了。正如您可能已经猜到的,我对Python和编程基本上是新手,所以我可能在某个地方犯了一个初学者错误。注意,我可以通过Filezilla使用SFTP连接到我的服务器,通过puTTY使用SSH连接到我的服务器(我只使用主机、端口、用户名和密码),所以这没有问题。如果有人能帮我解决这个问题(通过使用最新版本的PYSTFP、旧版本或完全不同的库),我将不胜感激。


共1个答案

匿名用户

pysftp只是一个包装程序,用于抽象和简化sftp操作,如果您对pysftp有问题,您可以直接使用parmiko,因为parmiko是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)