вторник, 10 января 2012 г.

lftp - Синхронизация папок по ftp

Встала задача синхронизировать папки по ftp.
Еслиб можно  было синхронизировать по ssh, то использовал бы конечно rsync.
Выбор пал на самый простой вариант для nix систем - lftp

1. Установить lftp если его нет в системе

# Debian
apt-get install lftp
# Red Hat
yum install lftp
# Gentoo
emerge lftp
# FreeBSD
pkg_add -r lftp

Использовать ее крайне легко. Синхронизация текущей папки с папкой на удалённого сервера (синхронизировать локальный каталог с удалённым), т.е. закачка с сервера.
$ lftp -e 'mirror -e каталог-на-сервере локальный-каталог; bye;' -u логин,пароль удалённый.хост

Синхронизация папки на удалённом сервере с текущей папкой (синхронизировать удалённый каталог с локальным), т.е. закачка на сервера.
$ lftp -e 'mirror -R локальный-каталог каталог-на-сервере; bye;' -u логин,пароль удалённый.хост

Наиболее оптимальное использование опций для синхронизации папки на удалённом сервере с текущей папкой (синхронизировать удалённый каталог с локальным), т.е. закачка на сервера.
$ lftp -e 'mirror --verbose -с -R локальный-каталог каталог-на-сервере; bye;' -u логин,пароль удалённый.хост

Можно также использовать скрипты, например запуск команды
lftp -f sync_script.x

Где в скрипте находятся следующие данные:
open логин:пароль@удалённый.хост
mirror -R локальный-каталог каталог-на-сервере
exit

Конфигурация.
Конфигурационный файл .lftprc, предсталяет собой просто команды lftp которые даются ему перед запуском.
Основные установки производятся командой set (да-да, про них тоже есть в help'е).
Например пара строк, позволяющих лазить свободно на виндовые ФТП, с русскими именами файлов:

set ftp:charset cp1251
set mirror:set-permissions off
set ftp:use-telnet-iac no
а так же несколько алиасов, команд, для более быстрого набора этого дела:

alias 5.7 open 192.168.5.7
alias sserv open 192.168.61.193
alias localhost open 127.0.0.1

Полезные параметры:
-e commands - выполняет команду и не завершает соединение
-f script_file выполняет команды из файла и завершает соединение
-c commands выполняет команду и завершает соединение

mget filename позволяет скачать файл filename, опция -c как и в в wget'е позволяет "докачать" файл.

mirror dirname позволяет скачать директорию. mirror -c - докачать директорию.
           -c продолжать задание копирования, если это возможно
           --parallel[=N] -закачка параллельно  N файлов
           --verbose[=level] информативность вывода.
           --no-symlinks  Исключать симлинки
           --no-empty-dirs  -исключать пустые папки
           --only-newer   - копировать только новые файлы, сравнение размеров игнорируется. Старые заменяются новыми.
           --loop   - будет работать "по кругу", пока есть какие-то изменения
           --exclude - исключить список файлов (регулярное выражение, как в egrep)
           --include - включая список файлов регулярное выражение, как в egrep)
           --exclude-glob - исключить список файлов по образцу (например  '*.zip')
           --include-glob - включить список файлов по образцу (например '*.zip')
         --log=FILE - писать выполняемые команды в FILE
         --just-print, --dry-run  - тоже самое, что --script=FILE. Позволяет просмотреть, какие команды будут выполнены
         --script=FILE - пишет в FILE командны, но не авполняет их


Также, как альтернативу можно рассмотреть программу, написанную на perl - FTPSync, т.к. при необходимости ее можно достаточно просто переделать под себя или добавить нужный функционал. Есть хорошая статья по ее использованию - FTPSync. FTP-синхронизация без проблем.

Примечание: Если Вы передаете важные файлы в больших объемах, то лучше использовать другие средства синхронизации, например rsync, т.к.  работает быстрее и надежнее, а также имеет функцию проверки хеша фалов!. Грустный опыт показал, что скопированный файл имеющий размер идентичный исходному, может отличаться от него, что собственно и подтверждают их хеши :(. Вот Вам и надежная передача по TCP... Когда сам столкнулся с таким моментом, был очень сильно удивлен, т.к. считал, что в принципе такого быть не должно.

Ссылки:
Офф. сайт
Быстрое обновление проектов на клиентских серверах через FTP Использование lftp
Синхронизация каталогов по SSH и по FTP
lftp. Usage.
FTPSync. FTP-синхронизация без проблем

4 комментария:

  1. текст в рамках обрезался :(

    ОтветитьУдалить
  2. Неплохой обзор. Вообще, у таких программ куча особенностей. И это не только синхронизация по ftp. Например, как именно программы решают конфликтные ситуации с файлами. Допустим, один и тот же файл изменили в обоих местах. Как именно поступит программа. И так далее.
    Если вам интересно, то более подробно можно ознакомиться по адресу http://ida-freewares.ru/best-free-folder-synchronization-utility.html

    ОтветитьУдалить
  3. Сорри, но синхронизация это не скачка и не закачка. Синхронизация это еще и удаление ненужных файлов. Делает такое lftp? Нет? Кто делает?

    ОтветитьУдалить