使用pysftp连接并上传文件到服务器
我正在创建一个脚本来通过应用程序将多个文件上传到服务器。用户将能够选择多个文件,所有这些文件都将通过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,更旧的版本或完全不同的库),我会大量赞赏它。
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)
最后使用这个,非常感谢!我只是万一有人代码在未来有同样的问题: '进口的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)' –
首先,您必须验证主机密钥。不要试图避免这种情况!请参阅https://stackoverflow.com/a/43389508/850848 –
什么是异常调用堆栈?什么声明会抛出异常? –
@MartinPrikryl欣赏回复 - 我看过那个链接,但找不到找到我的密钥的地方,以便放入known_hosts文件中?我重新修改了最新版本的pysftp,因为我在完成该脚本时需要安全性。 –