Script LFTP para baixar arquivos

3

Eu quero escrever um script lftp que baixará arquivos a cada 15 minutos de um servidor a cada x quantidade de tempo.

Alguém pode me aconselhar sobre como posso fazer isso?

Obrigado

    
por gurpsone 12.01.2016 / 12:59

1 resposta

7

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 e file . 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 - Onde cd no servidor remoto para obter os arquivos.
  • USER e PASSWORD - 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)

    
por 12.01.2016 / 14:02