Primeiro: crie um script. Você pode chamá-lo do que quiser. Vou chamá-lo de 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
Segundo : adicione-o ao crontab. Se você quiser executá-lo a cada 15 minutos em uma hora:
45,30,15,00 * * * * /home/user/downloader.sh >/dev/null 2>&1
Se você quiser executá-lo a cada 15 minutos, não importa qual seja o minuto inicial:
*/15 * * * * /home/user/downloader.sh >/dev/null 2>&1
Explicando as variáveis:
-
PROTOCOL
- Qual protocolo usar.lftp
suporta um bom intervalo deles:ftp, ftps, http, https, hftp, fish, sftp
efile
. https e ftps requerem que o lftp seja compilado com suporte a OpenSSL ou GNU TLS. -
URL
- Nome ou IP do servidor. Você pode até adicionar:PORT
no final se o seu servidor não usar a porta padrão do protocolo que está sendo usado. -
LOCALDIR
- Onde salvar os arquivos. -
REMOTEDIR
- Ondecd
no servidor remoto para obter os arquivos. -
USER
ePASSWORD
- credenciais de ftp. -
REGEX
- Expressão regular para filtrar arquivos para download. Pode ser útil se você quiser baixar apenas arquivos de uma determinada extensão, por exemplo. Use*
se você quiser baixar tudo. -
LOG
- Localização do arquivo de log.
Explicando alguma lógica de código:
1. - se
if [ ! $? -eq 0 ]; then
fi
A variável $?
é uma variável bash especial que significa "código de status do último comando". Bash sempre retorna zero em execuções bem-sucedidas de comandos, portanto, comparar -eq
(igual a) com o início !
(negativo) em if
deve ser suficiente para ver se cd
e lftp
tiveram problemas durante a execução. Se você quiser um registro melhor do que aconteceu, terá que rastrear a documentação desses comandos.
2. - heredocs
lftp $PROTOCOL://$URL <<- DOWNLOAD
DOWNLOAD
basear heredocs . É uma maneira de dizer "alimente este comando com esta lista de entrada". Eu nomeei a string de limite DOWNLOAD
assim, tudo entre <<- DOWNLOAD
e DOWNLOAD
será inserido em lftp
. Você verá exemplos na internet com o símbolo <<
, mas eu prefiro a versão <<-
, pois ela suporta recuo.
3. - comandos lftp
user $USER "$PASS"
cd $REMOTEDIR
mget -E $REGEX
Estes são comandos internos de lftp
que significam respectivamente, auth o usuário com $USER
login e "$PASS"
password, altere para $REMOTEDIR
e faça o download em massa de qualquer coisa com as palavras-chave $REGEX
. Você pode aprendê-las simplesmente digitando lftp
, e assim que um shell lftp for aberto, digite ?
e pressione Enter ou ? lftp-command-you-want
e pressione Enter . Exemplo:
[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
O conhecimento relacionado a saber que mget
seria o comando certo dentro de lftp
veio de páginas de leitura de leitura e pesquisar palavras-chave como "em massa", "multi" ou "massa" e saber que o ftp(1)
command também tem o comando mget
, provavelmente lftp
teria um equivalente.
Página principal: lftp(1)