FTPSync. FTP-синхронизация без проблем






Рано или поздно, но, думаю, каждый системный администратор сталкивается с необходимостью синхронизации содержимого каталогов, расположенных на разных удалённых системах. Хорошо, если есть возможность использовать rsync или хотя бы возможность смонтировать удалённый ресурс средствами NFS или Samba. Но что делать, если в вашем распоряжении не имеется больше ничего, кроме старого доброго FTP? Выход, конечно же есть, и по традиции мира Open Source, их немало. Перебрав несколько я остановился на утилите FTPSync. Она написана на Perl и теоретически должна работать в любой системе, имеющей в своём распоряжении Perl-интерпретатор. Я же расскажу об опыте установки и использования FTPSync в своей Ubuntu 10.04 Server.


Требования

На данный момент последняя версия программы — 1.3.03. Для её корректной работы необходимо следующее:

  • Perl 5.6+
  • File::Find, IO::Handle (идут в стандартной поставке Perl)
  • Net::FTP (часть пакета libnet-perl)
  • File::Listing (часть пакета libwww-perl)

Установка

Собственно установка, как вы уже догадались, заключается в размещении скрипта программы в удобном нужном месте файловой системы вашего компьютера. Получить последнюю версию исходного кода программы вы сможете, посетив страницу проекта на SourceForge или же по прямой ссылке отсюда: http://ftpsync.sourceforge.net/ftpsync-latest.tar.bz2. Итак, поехали.

Получим архив с исходными кодами, сохранив его пока что во временный каталог, поскольку в архиве  помимо файла скрипта содержатся другие файлы, которые полезны в ознакомительных целях но совсем не нужны в месте, где мы будем располагать программу.

mkdir -p ~/tmp
cd ~/tmp
wget http://ftpsync.sourceforge.net/ftpsync-latest.tar.bz2

Теперь распакуем содержимое полученного архива в текущий каталог:

bunzip2 -c ./ftpsync-latest.tar.bz2 | tar -xv
ls -l
drwxr-xr-x 2 ashep users 4096 2009-07-03 16:02 ftpsync-1.3.03
-rw-r--r-- 1 ashep users 17191 2009-07-03 16:02 ftpsync-latest.tar.bz2

Мы видим появившийся каталог с файлами FTPSync версии 1.3.03. Посмотрим, что там есть:

cd ftpsync-1.3.03
ls -l
-rwxr-xr-x 1 ashep users 6006 2009-07-03 16:02 Changes
-rwxr-xr-x 1 ashep users 18009 2006-08-30 22:28 COPYING
-rwxr-xr-x 1 ashep users 31562 2009-07-03 16:02 ftpsync.pl
-rwxr-xr-x 1 ashep users 4430 2009-07-03 15:58 README
-rwxr-xr-x 1 ashep users 64 2009-04-15 17:02 TODO

Забавная ситуация, все файлы исполняемые. Похоже, под Windows архивировали. Но не суть, собственно, нам нужен файл скрипта и он здесь есть! :) Теперь скопируем файл скрипта в нужное нам место. Я подобные вещи предпочитаю хранить в каталоге /usr/local/bin:

sudo cp ./ftpsync.pl /usr/local/bin/

И последний штрих. Проверьте, чтобы путь к интерпретатору Perl, указанный в первой строчке скрипта /usr/local/bin/ftpsync.pl совпадал с реальным размещением интерпретатора в вашей системе. По умолчанию в скрипте используется путь /usr/bin/perl, что в большинстве случаев соответствует действительности. Узнать, где у вас находится perl, можно так:

which perl

Использование

FTPSync умеет работать в обоих направлениях, то есть выполнять синхронизацию как с локального каталога в удалённый, так и наоборот. Направление синхронизации FTPSync определят из параметров командной строки. Общий формат вызова FTPSync таков:

ftpsync [опции] [источник получатель]

Либо источник, либо получатель должны содержать путь к локальному каталогу, в то время как противоположный параметр должен содержать URL удалённого ресурса. Обратите внимание, что параметр источник имеет значение по умолчанию — это текущий каталог. При этом, по ещё одному умолчанию, FTPSync выполняет синхронизацию в направлении «из локального ресурса в удалённый». Таким образом, если вы запустите программу, передав ей только URL удалённого ресурса, на FTP-сервер будет отправлено содержимое текущего каталога. Помните об этом при использовании FTPSync в командных сценариях.

Формат URL при определении удалённого FTP-ресурса такой:

ftp://[пользователь[:пароль]@]хост/каталог

Что ж, предлагаю попробовать FTPSync в деле. Пока что не будем лезть  в дебри опций,  которых, кстати, не так и много. Вот так у меня выглядело копирование содержимого каталога с исходными текстами FTPSync на сервер:

/usr/local/bin/ftpsync.pl ~/tmp/ftpsync-1.3.03/ ftp://guest:guest@aserver.ashep//

Обратите внимание на дополнительный слеш в конце URL. Он указывает программе не перемещаться ни в какой каталог, а использовать тот, в который FTP-сервер «выбрасывает» пользователя после логина.

Determine s offset.
 Clock sync offset: 0:00:00
 Building local file tree.
 Building remote file tree.
 Starting synchronization.
 Creating new remote directories.
 Copying new(er) local files.
 New: ftpsync.pl (31562 bytes)
 New: COPYING (18009 bytes)
 New: Changes (6006 bytes)
 New: README (4430 bytes)
 New: TODO (64 bytes)
 Deleting obsolete remote files.
 Deleting obsolete remote directories.
 Done.

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

rm ~/tmp/ftpsync-1.3.03/README
/usr/local/bin/ftpsync.pl ~/tmp/ftpsync-1.3.03/ ftp://guest:guest@aserver.ashep//
Determine s offset.
 Clock sync offset: 0:00:00
 Building local file tree.
 Building remote file tree.
 Starting synchronization.
 Creating new remote directories.
 Copying new(er) local files.
 Deleting obsolete remote files.
 README
 Deleting obsolete remote directories.
 Done.

FTPSync успешно удалила файл README, отсутствующий в локальном каталоге, но всё ещё существующий на FTP-сервере.

Теперь, предварительно вручную удалив файл TODO на сервере, попробуем выполнить синхронизацию в обратном направлении:

/usr/local/bin/ftpsync.pl ftp://guest:guest@aserver.ashep// ~/tmp/ftpsync-1.3.03/
Determine s offset.
Building local file tree.
Building remote file tree.
Starting synchronization.
Creating new local directories.
Copying new(er) remote files.
Deleting obsolete local files.
TODO
Deleting obsolete local directories.
Done.

Опции

Опций FTPSync предлагает достаточно немного, но лично моя практика использования этой программы показала, что больше и не нужно.

  • -c | -C заставит программу спрашивать вашего разрешения на выполнение каждого своего действия;
  • -d | -D включает вывод отладочной информации. В частности вы увидите лог FTP-сессии, который может оказаться весьма полезным в некоторых ситуациях;
  • -f | -F отключает рекурсивное копирование;
  • -g | -G при указании этой опции FTPSync будет выполнять синхронизацию в направлении «с сервера в локальный каталог»;
  • -h | -H справка по работе с программой;
  • -i | -I вывод основной информации в процессе работы, включено по умолчанию;
  • -n | -N не удалять в получателе отсутствующие файлы и каталоги источника;
  • -l | -L рассматривать локальные символические ссылки в качестве каталогов;
  • -p | -P при указании этой опции FTPSync будет выполнять синхронизацию в направлении «из локального каталога на сервер»;
  • -q | -Q отключает вывод информации;
  • -s | -S включает сравнение времени доступа файлов и каталогов. Без этой опции при сравнении  используются только размеры файлов;
  • -t | -T отключает обновление меток времени для локальных файлов;
  • -v | -V включает многословный вывод;
  • cfg= указывает FTPSync считывать параметры из файла, указанного в значении этого параметра:
  • ftpserver= имя хоста FTP-сервера. По умолчанию это «localhost»;
  • ftpdir= каталог FTP-сервера. По умолчанию это текущий каталог;
  • ftpuser= имя пользователя FTP-сервера, по умолчанию это «ftp».
  • ftppasswd= пароль пользователя FTP-сервера, по умолчанию это «anonymous».
  • ignoremask= регулярное выражение, определяющее имена файлов, игнорируемые при синхронизации.




FTPSync. FTP-синхронизация без проблем: 5 комментариев

  1. а как поправить кодировку? на локальном utf-8 на удаленном — виндовая 1251. в результате на удаленном получаются кракозябры...

  2. Спасибо. Пригодился скрипт. Попробовал несколько программ, в основном хотят денег или не стартуют как сервер. Оказалось проще установить perl и добавить батник в задания. Спасибо.

  3. Жаль только что если размер файла не изменился он его не обновит :( но тут уже протокол фтп виноват

Комментарии запрещены.