我正在進行一個項目,其中多個 Raspberry Pi 每天多次收集感測器資料並將其記錄到多個檔案中。我想編寫一個小腳本,以便在一天結束時使用 crontab 將所有這些檔案上傳到 FTP 伺服器。所以我使用lftp編寫了一個腳本,該腳本一開始有效,但後來開始顯示錯誤。
下面是腳本和詳細輸出。我該如何修復它?
#!/bin/bash
HOST='ftp://xyz.com'
USER='xxxxxx'
PASS='xxxxxx'
TARGETFOLDER='/home/xxxx'
SOURCEFOLDER='/home/pi/yyyy'
lftp -f "
open $HOST
user $USER $PASS
debug -o lftp_debug.txt
lcd $SOURCEFOLDER
mirror --reverse --delete --verbose $SOURCEFOLDER $TARGETFOLDER
bye
"
輸出:
---- Connecting to xyz.com (xx.xx.xx.xx) port 21
<--- 220 (vsFTPd 3.0.3)
---> FEAT
<--- 211-Features:
<--- EPRT
<--- EPSV
<--- MDTM
<--- PASV
<--- REST STREAM
<--- SIZE
<--- TVFS
<--- 211 End
---> USER XXXX
<--- 331 Please specify the password.
---> PASS XXXX
<--- 230 Login successful.
---> PWD
<--- 257 "/home/XXXX" is the current directory
---> MKD /home
<--- 550 Create directory operation failed.
---> MKD /home/XXXX
<--- 550 Create directory operation failed.
---- CWD path to be sent is `/home/XXXX'
---> CWD /home/XXXX
<--- 250 Directory successfully changed.
---> PASV
**** control-socket: Connection reset by peer
---- Closing data socket
---- Closing control socket
##更新2##
有趣的是,當我使用相同的用戶透過「FTP」命令登入同一個 FTP 伺服器並通過時,它就像一個魅力,但是當我使用相同的用戶登入並通過lftp
時,我能夠登入伺服器,但很快當我給出ls
命令時,它顯示以下輸出。
lftp [email protected]:~> ls
`ls' at 0 [Delaying before reconnect: 24]
##更新3##
我嘗試使用 SFTP 代替,它工作正常。希望這可以節省某人的時間。
答案1
不要使用 ftp。您遇到的問題可能與 FTP 中連接方向的普遍混亂有關。 FTP 使用兩個連接埠:一個指令連接,一個資料連接。傳統上,命令連線是從客戶端到伺服器,資料連線是從伺服器到客戶端!
PASV 則相反;它指示伺服器偵聽來自客戶端的資料連接,並告訴客戶端它的連接埠號碼。看來這種(對很多人來說出乎意料的)行為正在困擾你。
然而,在我看來,今天繼續使用 FTP 並不是一個好的選擇。從安全角度和協定角度來看,它已經過時了。
您有多種 FTP 替代方案。如果您使用身份驗證,scp/sftp 是一個不錯的選擇。它只需要一個端口,經過身份驗證和加密。
如果您需要匿名提交,http(s) 是一個不錯的選擇。透過 POST 請求或使用 WebDAV。 Http 可以也設定為使用身份驗證,並且可以使用 TLS (https) 加密。它也只為資料和命令開啟一個通道。
FTP 是一個已有 40 年歷史的協定。它已經不再使用,因此該軟體沒有像更流行的 Web 伺服器和 ssh 伺服器那樣受到足夠的關注,因此原始程式碼中存在嚴重漏洞的可能性更高。
此外,SCP'ing 的命令會簡單得多:scp * $user@$host:$targetfolder
- 您可以使用基於金鑰的身份驗證來避免在腳本中使用密碼!