Появилась необходимость зеркалировать часть данных с системы, которая позволяет их скачать только по SFTP протоколу. Все файлы с данными имеют шаблон имени в который входит определенный идентификатор. На сервере таких идентификаторов - несколько тысяч, но для наших целей нам нужно зеркалировать только некоторые их них. Поскольку мы ограничены протоколом SFTP, то решения вроде Rsync не подходят.
В общем случае клиент должен подключиться к серверу и получить список директорий верхнего уровня, а затем в зависимости от максимально разрешенного уровня вложенности обойти нужные директории и свериться со списоком файлов, которые уже есть локально, скачать недостающие и удалить файлы, которых уже нет на исходном SFTP сервере (там хранятся данные только за несколько дней).
Для решения этой задачи подошла утилитка lftp, которая поддерживает много протоколов включая SFTP. Список шаблонов для синхронизации записали в файлик, который служит аргументом для --include-glob-from
. Закачка самих файлов идет в несколько потоков (--parallel
) с удалением тех файлов, которых больше нет на источнике (--delete
).
#!/bin/bash LFTP_PROTOCOL=sftp LFTP_HOST=sftp.example.com LFTP_PORT=22 LFTP_USERNAME=sftpuser SFTP_PASSWORD=sftppass REMOTE_DIR=/remote/path LOCAL_DIR=/local/path INCLUDE_LIST=$(dirname $(readlink -f $0))/sftp-mirror.include lftp -u ${LFTP_USERNAME},${LFTP_PASSWORD} ${LFTP_PROTOCOL}://${LFTP_HOST}:${LFTP_PORT} <<_EOF_ cd ${REMOTE_DIR} lcd ${LOCAL_DIR} mirror --recursion=always --no-empty-dirs --delete --parallel=8 --include-glob-from=${INCLUDE_LIST} close _EOF_
Файл sftp-mirror.include
с шаблонами имен по одному на строку, которые нужно зеркалировать
*Element=ABA090*.xml.gz *Element=BAC105*.xml.gz *Element=DOM288*.xml.gz
Расчет разницы и выкачивание новых файлов происходит очень быстро.
Комментариев нет:
Отправить комментарий