Ftp

檢查文件是否已通過 FTP 正確傳輸

  • April 18, 2018

此腳本將通過 FTP 發送文件,然後將其刪除。但是,有時,文件在傳輸結束之前被刪除,然後接收到一個空文件。

#!/bin/bash

tar czf <sourcefile> --directory=<directory> log
ftp -v -n $1 <<END_OF_SESSION
user <user> <password>
put <sourcefile> <targetfile>
bye
END_OF_SESSION

rm <sourcefile>

什麼是同步程序的好方法,以便在發送完成後進行刪除?

如下更新所示,有時無法建立連接。

筆記:

在 Lubuntu 16.04 上執行。

隨行更新tar

失敗會話的日誌資訊:

Connected to IP
220 (vsFTPd 3.0.2)
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
local: /home/user01/tmp/log.tgz remote: E1/180418090056
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.
221 Goodbye.

和一個成功的:

Connected to IP
220 (vsFTPd 3.0.2)
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
local: /home/user01/tmp/log.tgz remote: E1/180418090344
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
6901 bytes sent in 0.00 secs (43.5848 MB/s)
221 Goodbye.

ftp命令沒有允許您檢查傳輸是否成功的功能。如果您必須繼續使用此 FTP 傳輸實現,則有兩種選擇:

  1. 將傳輸的文件下載到本地臨時文件,並將其逐字節與源進行比較。
  2. 在 FTP 客戶端中執行ls並檢查文件長度是否符合預期。請記住,這ls取決於伺服器,並且可能因伺服器實現而異。

最好的解決方案(除了將 FTP 完全替換為rsyncor scp)是使用提供可靠傳輸狀態的不同 FTP 客戶端。

#!/bin/bash
tar czf <sourcefile> --directory=<directory> log
lftp -u '<user>,<password>' -e 'put -E <source> -o <target>; quit' "$1"

lftp命令應該在大多數 Linux 發行版中都可用。該-E標誌將put命令配置為更像mv而不是cp:它在成功傳輸後刪除源文件。

引用自:https://unix.stackexchange.com/questions/438291