用于下载文件的 LFTP 脚本

gur*_*one 5 scripting ftp lftp

我想编写一个 lftp 脚本,每 x 时间从服务器每 15 分钟下载一次文件。

有人可以建议我如何做到这一点吗?

谢谢

小智 12

第一:创建脚本。你可以随心所欲地称呼它。我会叫它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
Run Code Online (Sandbox Code Playgroud)

第二:将其添加到 crontab。如果你想在一小时内每 15 分钟执行一次:

45,30,15,00 * * * * /home/user/downloader.sh >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

如果你想每 15 分钟执行一次,不管开始时间是什么时候:

*/15 * * * * /home/user/downloader.sh >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

解释变量:

  • 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
Run Code Online (Sandbox Code Playgroud)

$?变量是一个特殊的 bash 变量,意思是“上一个命令的状态代码”。Bash 总是在成功执行命令时返回零,因此,比较-eq(等于)与!an 上的起始(负)if应该足以查看是否cdlftp执行过程中有问题。如果您想要更好地记录所发生的事情,则必须浏览这些命令的文档。

2. - 继承人

lftp  $PROTOCOL://$URL <<- DOWNLOAD
DOWNLOAD
Run Code Online (Sandbox Code Playgroud)

bash 继承人。这是说“用这个输入列表提供这个命令”的一种方式。我已经命名了限制字符串,DOWNLOAD因此,介于<<- DOWNLOAD和之间的所有内容都DOWNLOAD将输入到lftp. 你会在互联网上看到带有<<符号的例子,但我更喜欢这个<<-版本,因为它支持缩进。

3. - lftp 命令

    user $USER "$PASS"
    cd $REMOTEDIR
    mget -E $REGEX
Run Code Online (Sandbox Code Playgroud)

这些分别是lftp该方法的内部命令,使用$USER登录名和"$PASS"密码验证用户,更改为$REMOTEDIR和批量下载带有$REGEX关键字的任何内容。您可以通过简单地输入 来学习它们lftp,一旦打开 lftp shell,输入?并按下Enter? 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
Run Code Online (Sandbox Code Playgroud)

与 know that mgetwill be right command inside有关的知识lftp来自阅读联机帮助页并搜索“bulk”、“multi”或“mass”等关键字,并且知道该ftp(1)命令也具有该mget命令,因此可能lftp会有等价物。

手册页: lftp(1)