代码之家  ›  专栏  ›  技术社区  ›  Chuck

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

  •  0
  • Chuck  · 技术社区  · 7 年前

    我正在创建一个脚本,通过应用程序将多个文件上传到服务器。用户可以选择多个文件,所有文件都将通过Python程序上传到服务器。我在寻找可以用来连接到服务器的SFTP python库时遇到了PySTFP。我下载了最新版本,并尝试使用以下脚本进行连接:

    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\uu init\uuu0.py:61:用户警告:无法加载主机密钥)。我试了大约一个小时来改变这一点,然后感到沮丧,并尝试了一项以前避免的工作。我降级到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()
    

    仅得到以下错误: “失败”

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dalvenjia    7 年前

    PySTFP只是一个围绕paramiko的包装器,用于抽象和简化sftp操作,如果您对PySTFP有问题,可以直接使用parmiko,因为paramiko是PySTFP的依赖项,您将已经安装了它。

    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)