我想编写一个 lftp 脚本,该脚本将每隔 x 时间从服务器每 15 分钟下载一次文件。
有人可以建议我该怎么做吗?
谢谢
答案1
第一的:创建一个脚本。你可以随意称呼它。我会打电话给它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, sftp
和file
。 https 和 ftps 需要使用 OpenSSL 或 GNU TLS 支持来编译 lftp。URL
- 服务器的名称或 IP。如果您的服务器不使用正在使用的协议的默认端口,您甚至可以:PORT
在末尾添加。LOCALDIR
- 文件保存位置。REMOTEDIR
- 在远程服务器上的何处cd
获取文件。USER
和PASSWORD
- ftp 凭证。REGEX
- 正则表达式来过滤要下载的文件。例如,如果您只想下载确定扩展名的文件,它会很有用。*
如果您想下载所有内容,请使用。LOG
- 日志文件位置。
解释一下一些代码逻辑:
1.- 如果
if [ ! $? -eq 0 ]; then
fi
该$?
变量是一个特殊的 bash 变量,意思是“最后一个命令的状态代码”。 Bash 在成功执行命令时总是返回零,因此,将-eq
(等于)与!
a 上的起始(负)进行比较if
应该足以查看执行过程中是否cd
存在lftp
问题。如果您想要更好地记录所发生的情况,则必须浏览这些命令的文档。
2.- 这里文档
lftp $PROTOCOL://$URL <<- DOWNLOAD
DOWNLOAD
bash 此处文档。这是一种表达“使用此输入列表提供此命令”的方式。我已命名限制字符串DOWNLOAD
,因此<<- DOWNLOAD
和之间的所有内容DOWNLOAD
都将输入到lftp
.您将在互联网上看到带有<<
符号的示例,但我更喜欢该<<-
版本,因为它支持缩进。
3.-lftp命令
user $USER "$PASS"
cd $REMOTEDIR
mget -E $REGEX
这些是内部命令,分别表示使用登录名和密码lftp
对用户进行身份验证、更改为以及使用关键字批量下载任何内容。您只需键入 即可了解它们,一旦 lftp shell 打开,键入并按或并按。例子:$USER
"$PASS"
$REMOTEDIR
$REGEX
lftp
?
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
mget
与知道这将是内部正确命令相关的知识lftp
来自阅读联机帮助页并搜索“bulk”、“multi”或“mass”等关键词,并知道ftp(1)
命令也有mget
命令所以,可能lftp
会有一个等效的命令。
联机帮助页: lftp(1)