![](http://habrastorage.org/storage2/110/cf9/66c/110cf966c250f1a0f386bb0edb4ea808.png)
С одной стороны, FTP привычно. С другой стороны, FTP удобно, если его поддерживает файловый менеджер типа FAR или Midnight Commander. Но, есть и еще более удобный и безопасный метод.
Если заморачиваться только по поводу безопасности и пересылки пароля в открытом виде по незашифрованному каналу, то тогда можно было бы пользоваться SFTP, но он все равно не решает задачи ручной работы с файлами.
Когда же цель сэкономить время на минимизации ручного труда, то на помощь приходит простой и быстрый способ – синхронизация файлов с помощью специальной утилиты rsync.
Использование rsync не только полностью устраняет ручную работу по заливке сайта на сервер или наоборот. Он позволяет проводить полноценную двустороннюю синхронизацию без необходимости ввода пароля и имеет множество гибких настроек и фишек, исключение файлов по маскам, экономия трафика не только на сжатии, но и на передаче только измененной части данных. Все это делает его применимым во многих других сферах.
Конспект по настройке и готовый скрипт берем под катом.
Во многие операционные системы популярные у веб-разработчиков, такие как, например, Ubuntu, различные дистрибутивы Linux, даже Mac OS X, утилита rsync входит по умолчанию – а если и не входит, то легко ставится из установочного пакета, поэтому сразу перейдем к настройке rsync.
Со стороны сервера обычно также не требуется никаких специальных настроек, которые должен сделать провайдер. Достаточно просто, чтобы он был там установлен. Нет необходимости даже запускать rsync-сервер. Коммуникация осуществляется через защищенный протокол SSH. Что должно быть у любого уважающего себя провайдера хостинга.
Для начала, чтобы во время синхронизации не требовался ввод пароля, нужно сгенерировать криптографическую пару ключей для авторизации по SSH и закачать его публичную часть в специальное место на сервере – в папку .ssh в домашней директории пользователя.
Сначала создадим ключи с пустым паролем выполнив команду в шелле, для чего при запросе пароля просто нажимаем клавишу Enter:
ssh-keygen -t dsa -f key
Теперь закачаем публичную часть ключа на сервер – это последний раз, когда нужно вводить пароли перед переходом на авторизацию по ключам:
scp -r -P 2200 user@ssh.site.com:.ssh .ssh mkdir -p .ssh cat key.pub >> .ssh/authorized_keys2 scp -r -P 2200 .ssh user@ssh.site.com:.ssh
Здесь мы сначала попытаемся скопировать папку .ssh с сервера, если она там есть, используя scp – аналог обычной утилиты копирования файлов cp, только через SSH. Если папки с ключами на сервере нет, то создадим ее локально. В этом случае, если на сервере уже имеются какие-то ключи, мы просто добавим наш ключ в список авторизованных не удаляя старые и зальем измененные файлы на сервер также через scp.
Как вы уже могли догадаться:
2200 – нестандартный порт SSH-сервера
user – пользователь с SSH-доступом на сервер
ssh.site.com – доменное имя сервера для SSH-доступа
Это практически все – осталось настроить приведенный ниже скрипт, сохранив его, например, в файл sync.sh:
#!/bin/bash K=key/key U=user P=2200 H=ssh.site.com D='cgi-bin htdocs' S=web if [ "$S" = '' ] || [ ! -e "$S" ] ; then echo ERROR: no local storage fi if [ "$1" = '' ] || [ "$1" = 'sync' ] || [ "$1" = 's' ] ; then for F in $D ; do echo === Synchronizing [ $F ] === rsync -avz -e "ssh -i $K -p $P -l $U" --exclude-from=sync.exclude $S/$F/ $H:$F/ rsync -avz -e "ssh -i $K -p $P -l $U" --exclude-from=sync.exclude $H:$F/ $S/$F/ done fi if [ "$1" = 'download' ] || [ "$1" = 'd' ] ; then for F in $D ; do echo === Synchronizing [ $F ] === rsync -avz --delete -e "ssh -i $K -p $P -l $U" --exclude-from=sync.exclude $H:$F/ $S/$F/ done fi if [ "$1" = 'upload' ] || [ "$1" = 'u' ] ; then for F in $D ; do echo === Synchronizing [ $F ] === rsync -avz --delete -e "ssh -i $K -p $P -l $U" --exclude-from=sync.exclude $S/$F/ $H:$F/ done fi
Здесь:
K – путь к приватной части ключа
U – пользователь с SSH-доступом на сервер
P – нестандартный порт SSH-сервера
H – доменное имя сервера для SSH-доступа
D – список папок для синхронизации разделенный символом пробела
S – локальная папка, в которой находятся папки из переменной D
Записав скрипт не забудьте ему назначить права на запуск:
chmod 755 sync.sh
В файл sync.exclude можно вписать то, что синхронизировать не нужно, что особенно актуально для OS X, которая любит создавать хитрые файлы в папках – например:
.DS_Store stats
Таким образом скрипт приведенный выше будет синхронизировать локальные папки cgi-bin и htdocs, которые находятся в локальной папке web с такими же папками cgi-bin и htdocs в домашней директории пользователя user на сервере ssh.site.com через SSH запущенный на порту 2200 – тому, у кого структура папок на сервере другая, нужно будет поправить путь в скрипте после имени сервера и символа двоеточия "$H:".
Как пользоваться скриптом:
# синхронизация без удаления, преимущество файлам на сервере ./sync.sh # закачка на сервер с удалением лишних файлов ./sync.sh upload ./sync.sh u # скачка с сервера с удалением лишних файлов ./sync.sh download ./sync.sh d
При использовании этого скрипта нужно быть осторожным. Неверно зададите направление синхронизации и можете потерять сделанные изменения. Со мной такое иногда бывало. Спасал, конечно, backup. Но в целом дело привычки и тренировки.
Синхронизируются и передаются через сеть только измененные файлы, а для больших файлов только их части.
Синхронизируются все параметры файла, права доступа, время и так далее, что можно изменить задав rsync другие опции — если новый залитый файл не будет виден на сайте, то проверьте права доступа файла на локальной машине 🙂
Мелкие бонусы включают:
# вход на сервер без пароля по ключу ssh -i key -l user -p 2200 ssh.site.com
Использовать подобный подход можно еще много где.
Я, например, аналогичным образом синхронизирую свой ноутбук и большой рабочий компьютер. Не все домашнюю папку, но почту, настройки, кэш, закладки браузеров, рабочие файлы, музыку, фильмы и все, что еще нужно. На OS X это бывает намного удобнее чем iCloud. Это позволяет полностью контролировать процесс и синхронизировать только то, что нужно – при этом не засвечивая приватные данные в неконтролируемом облаке. Также использую для периодического backup на внешние носители, помимо Time Machine по сети, но скрипт для этого несколько более сложный.
ссылка на оригинал статьи http://habrahabr.ru/post/177123/
Добавить комментарий