Scripting

用於下載文件的 LFTP 腳本

  • June 3, 2021

我想編寫一個 lftp 腳本,每隔 x 時間從伺服器每 15 分鐘下載一次文件。

有人可以建議我怎麼做嗎?

謝謝

**第一:**創建腳本。你可以隨心所欲地稱呼它。我會打電話downloader.sh的。

#!/bin/bash
PROTOCOL="ftp"
URL="server.example.com" 
LOCALDIR="/home/user/downloads"
REMOTEDIR="dir/remote/server/"
USER="user"
PASS="password"
REGEX="*.txt"
LOG="/home/user/script.log"

cd $LOCALDIR
if [  ! $? -eq 0 ]; then
   echo "$(date "+%d/%m/%Y-%T") Cant cd to $LOCALDIR. Please make sure this local directory is valid" >> $LOG
fi

lftp  $PROTOCOL://$URL <<- DOWNLOAD
   user $USER "$PASS"
   cd $REMOTEDIR
   mget -E $REGEX
DOWNLOAD

if [ ! $? -eq 0 ]; then
   echo "$(date "+%d/%m/%Y-%T") Cant download files. Make sure the credentials and server information are correct" >> $LOG
fi

第二:將其添加到 crontab。如果您想在一小時內每隔 15 分鐘執行一次:

45,30,15,00 * * * * /home/user/downloader.sh >/dev/null 2>&1

如果您想每 15 分鐘執行一次,無論開始時間是幾點:

*/15 * * * * /home/user/downloader.sh >/dev/null 2>&1

解釋變數:

  • PROTOCOL- 使用什麼協議。lftp支持其中的一個很好的範圍:ftp, ftps, http, https, hftp, fish, sftpfile. https 和 ftps 需要使用 OpenSSL 或 GNU TLS 支持編譯 lftp。
  • URL- 伺服器的名稱或 IP。:PORT如果您的伺服器不使用正在使用的協議的預設埠,您甚至可以在最後添加。
  • LOCALDIR- 保存文件的位置。
  • REMOTEDIR- 在cd遠端伺服器上獲取文件的位置。
  • USERPASSWORD- ftp 憑據。
  • REGEX- 正則表達式過濾要下載的文件。例如,如果您只想下載已確定副檔名的文件,它會很有用。*如果您想下載所有內容,請使用。
  • LOG- 日誌文件位置。

解釋一些程式碼邏輯:

1. - 如果

if [  ! $? -eq 0 ]; then
fi

$?變數是一個特殊的 bash 變數,意思是“最後一個命令的狀態碼”。Bash 在成功的命令執行時總是返回零,因此,比較-eq(等於)與!an 上的開始(負數)if應該足以查看執行過程中是否cd存在lftp問題。如果您想更好地記錄發生的事情,則必須瀏覽這些命令的文件。

2. -heredocs

lftp  $PROTOCOL://$URL <<- DOWNLOAD
DOWNLOAD

bash heredocs。這是一種說“用這個輸入列表輸入這個命令”的方式。我已經命名了限製字元串DOWNLOAD,因此,介於<<- DOWNLOAD和之間的所有內容都DOWNLOAD將輸入到lftp. 您將在 Internet 上看到帶有<<符號的範例,但我更喜歡該<<-版本,因為它支持縮進。

3. - lftp 命令

   user $USER "$PASS"
   cd $REMOTEDIR
   mget -E $REGEX

這些是lftp該方法的內部命令,分別是使用$USER登錄名和"$PASS"密碼驗證使用者,更改為$REMOTEDIR和批量下載任何帶有$REGEX關鍵字的內容。您可以通過簡單地鍵入來學習它們lftp,並且在打開 lftp shell 後,鍵入?並按下Enteror? lftp-command-you-want並按下Enter。例子:

[root@host ~]# lftp
lftp :~> ?
   !<shell-command>                     (commands)                           alias [<name> [<value>]]
   attach [PID]                         bookmark [SUBCMD]                    cache [SUBCMD]
   cat [-b] <files>                     cd <rdir>                            chmod [OPTS] mode file...
   close [-a]                           [re]cls [opts] [path/][pattern]      debug [<level>|off] [-o <file>]
   du [options] <dirs>                  exit [<code>|bg]                     get [OPTS] <rfile> [-o <lfile>]
   glob [OPTS] <cmd> <args>             help [<cmd>]                         history -w file|-r file|-c|-l [cnt]
   jobs [-v] [<job_no...>]              kill all|<job_no>                    lcd <ldir>
   lftp [OPTS] <site>                   ln [-s] <file1> <file2>              ls [<args>]
   mget [OPTS] <files>                  mirror [OPTS] [remote [local]]       mkdir [-p] <dirs>
   module name [args]                   more <files>                         mput [OPTS] <files>
   mrm <files>                          mv <file1> <file2>                   [re]nlist [<args>]
   open [OPTS] <site>                   pget [OPTS] <rfile> [-o <lfile>]     put [OPTS] <lfile> [-o <rfile>]
   pwd [-p]                             queue [OPTS] [<cmd>]                 quote <cmd>
   repeat [OPTS] [delay] [command]      rm [-r] [-f] <files>                 rmdir [-f] <dirs>
   scache [<session_no>]                set [OPT] [<var> [<val>]]            site <site-cmd>
   source <file>                        torrent [-O <dir>] <file|URL>...     user <user|URL> [<pass>]
   wait [<jobno>]                       zcat <files>                         zmore <files>

lftp :~> ? mget
Usage: mget [OPTS] <files>
Gets selected files with expanded wildcards
-c  continue, resume transfer
-d  create directories the same as in file names and get the
    files into them instead of current directory
-E  delete remote files after successful transfer
-a  use ascii mode (binary is the default)
-O <base> specifies base directory or URL where files should be placed

與知道這mget將是正確的命令相關的知識lftp來自閱讀手冊頁並蒐索“bulk”、“multi”或“mass”等關鍵字,並且知道該ftp(1)命令也有該mget命令,因此可能lftp會有一個等價的命令。

手冊頁: lftp(1)

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