Сценарий LFTP для загрузки файлов

Если вы используете - net = host , контейнер совместно использует сетевой стек хоста и все интерфейсы из хост будет доступен для контейнера , ( согласно справочнику по запуску для докера )

Если вы уже предоставили общий доступ ко всему, вам не нужно явно сопоставлять 8777 с 8777. {{1} } На самом деле реализация сопоставления была бы странной: сопоставление 1234 с 8777 заставило бы хост также прослушивать 8777? Вот почему вы не видите назначенных портов.

Просто оставьте - net = host и попробуйте подключиться на хосте к 8777, он будет соединен с 8777 в контейнере. Убедитесь, что ваш контейнер не зависит от фактического IP-адреса, который он использует. Внешний мир будет видеть только IP-адреса хостов.

4
12.01.2016, 13:59
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 требуют, чтобы lftp был скомпилирован с поддержкой OpenSSL или GNU TLS.
  • URL- Имя или IP сервера. Вы можете даже добавить :PORT в конце, если ваш сервер не использует порт по умолчанию для используемого протокола.
  • LOCALDIR - место сохранения файлов.
  • REMOTEDIR - Куда cd на удаленном сервере, чтобы получить файлы.
  • USER и PASSWORD - учетные данные ftp.
  • REGEX - регулярное выражение для фильтрации файлов для загрузки. Это может быть полезно, если вы хотите загрузить только файлы определенного расширения, например. Используйте *, если вы хотите скачать все.
  • LOG - Расположение файла журнала.

Объяснение некоторой логики кода:

1. - if

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

Переменная $? - это специальная переменная bash, которая означает "код состояния последней команды". Bash всегда возвращает ноль при успешном выполнении команды, поэтому, сравнивая -eq (равно) с начальным ! (отрицательный) на if должно быть достаточно, чтобы понять, были ли у cd и lftp проблемы во время выполнения. Если вам нужен более точный журнал того, что произошло, вам придется порыться в документации к этим командам.

2. - heredocs

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

bash heredocs. Это способ сказать "подайте эту команду с этим списком входных данных". Я назвал предельную строку DOWNLOAD, так что все между <<- DOWNLOAD и DOWNLOAD будет введено в lftp. В интернете можно встретить примеры с символом <<, но я предпочитаю версию <<-, поскольку она поддерживает отступы.

3. - команды lftp

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

Это внутренние команды lftp, которые означают, соответственно, аутентификацию пользователя с $USER логином и "$PASS" паролем, переход на $REMOTEDIR и массовую загрузку чего-либо с помощью ключевых слов $REGEX. Вы можете узнать их, просто набрав lftp, и как только откроется оболочка 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, пришли из чтения manpages и поиска ключевых слов типа "bulk", "multi" или "mass", и знания того, что в ftp(1) команде также есть команда mget, поэтому, вероятно, lftp будет иметь эквивалент.

Manpage: lftp(1)

9
27.01.2020, 20:49

Теги

Похожие вопросы