2017-10-19 185 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)' –