Еще пользуетесь FTP? Настройте двустороннюю синхронизацию сайта (и не только) за 5 минут – Rsync через SSH

от автора

С одной стороны, 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *