2017-10-19 184 views
0

我正在创建一个脚本来通过应用程序将多个文件上传到服务器。用户将能够选择多个文件,所有这些文件都将通过Python程序上传到服务器。我查看了可用于连接到服务器并遇到pysftp的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。我做了一些研究,发现你可以通过添加关闭对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:未能加载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() 

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

我一直想这几个小时。正如你可能已经猜到的那样,我对Python和编程一般都很陌生,所以我可能会在某处出现初学者错误。需要注意的是,我可以通过Filezilla使用SFTP连接到我的服务器,并通过puTTY使用SSH(我只是使用主机,端口,用户名和密码) - 所以这没有问题。如果有人可以帮我解决这个问题要么使用最新版本的pysftp,更旧的版本或完全不同的库),我会大量赞赏它。

+1

首先,您必须验证主机密钥。不要试图避免这种情况!请参阅https://stackoverflow.com/a/43389508/850848 –

+1

什么是异常调用堆栈?什么声明会抛出异常? –

+0

@MartinPrikryl欣赏回复 - 我看过那个链接,但找不到找到我的密钥的地方,以便放入known_hosts文件中?我重新修改了最新版本的pysftp,因为我在完成该脚本时需要安全性。 –

回答

1

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) 
+0

最后使用这个,非常感谢!我只是万一有人代码在未来有同样的问题: '进口的paramiko \ n ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(主机名= 'host',port = portno,username = username,password = password) s = ssh_client.open_sftp() s.put(localpath,remotepath)' –