Периодически складывается такая ситуация, что нормальные инструменты для копирования бекапа на удаленный сервер — недоступны, а в распоряжении есть только ftp. К сожалению такое еще бывает…

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

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

Тут я поведаю, как написать скрипт для автоматизирования аплоада и кое-какие детали.

В случае работы с ftps, lftp может отваливаться с ошибкой:

Fatal error: Certificate verification: Not trusted

Тут понятно, что происходит, если сертификат на сервере используется самоподписной или неродной для используемого hostname, клиенту это очень не нравится. Отключить проверку доверенности серта можно так:

cat ~/.lftp/rc
set ssl:verify-certificate no

Не забываем исправить ~ на полный путь пользовательского хоума, из под которого запускается скрипт/команда.

Мне не хочется помещать в скрипт какие-либо пароли, поэтому делаем еще одну хитрость, создаем следующий файл с таким содержимым:

# cat /root/.netrc 
machine backup.host.name
login USERNAME
password PASSWORD

Также выставляем на него строгие права — 0600.

Здесь я предполагаю, что скрипт будет запускаться из под root-а. Если нет, соответственно кладете файлик в нужный home.

Далее создаем файлик с желаемым названием и вносим туда:

#!/bin/bash
lftp username@hostname << EOF
mput /path/to/archive.tgz /path/on/remote/ftp
mirror -Re /simple/dir/ /path/on/ftp
quit 0
EOF

Поясняю:

  • mput можно использовать когда вы последовали совету выше и производите копирование одного файла-архива.
  • mirror — это почти как rsync, т.е. полностью приводит удаленный каталог к виду заданного.

Опция -R — нужна чтобы сказать mirror-у, что надо копировать *локальный* каталог наружу, а не наоборот, тут будьте внимательны, а то затрете локальный.

-e — это как —delete в rsync, т.е. делает полную копию каталога, удаляя файлы на удаленном хосте, которых нет в локальном каталоге.

Вот и все, далее добавляете вызов скрипта в cron, на желаемую периодичность.