我正在創建一個腳本來通過應用程序將多個文件上傳到服務器。用戶將能夠選擇多個文件,所有這些文件都將通過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,更舊的版本或完全不同的庫),我會大量讚賞它。
首先,您必須驗證主機密鑰。不要試圖避免這種情況!請參閱https://stackoverflow.com/a/43389508/850848 –
什麼是異常調用堆棧?什麼聲明會拋出異常? –
@MartinPrikryl欣賞回覆 - 我看過那個鏈接,但找不到找到我的密鑰的地方,以便放入known_hosts文件中?我重新修改了最新版本的pysftp,因爲我在完成該腳本時需要安全性。 –