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

Встала задача синхронизировать папки по ftp. Если бы можно было синхронизировать по ssh, то использовал бы конечно rsync. Выбор пал на самый простой вариант для nix систем - 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 позволяет скачать директорию.
    • -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… Когда сам столкнулся с таким моментом, был очень сильно удивлен, т.к. считал, что в принципе такого быть не должно.

Примечание 2: На больших каталогах работает долго!(

sinxronizacija_papok_po_ftp.txt · Последние изменения: 2013/10/29 17:18 (внешнее изменение)
GNU Free Documentation License 1.3
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Яндекс.Метрика