Эта тема на forum.dklab.ru


Дмитрий Котеров: RSync с Windows на Unix.
Решил тут настроить RSYNC, чтобы копировать файлы с Windows на удаленный сайт denwer.ru. Оказалось, нет ничего невозможного! Пара часов мучений, и теперь локальная и удаленная папка синхронизируются одним кликом. (Точнее, удаленная становится в точности равной локальной: все изменения, внесенные на удаленной стороне, теряются.)

Версии SSH

Для начала: существуют 2 популярных версии SSH-серверов и клиентов:
- SSH2 (коммерческая; стоит у net.ru, где сейчас denwer.ru лежит)
- OpenSSH (бесплатная, стоит очень у многих провайдеров - и правильно).
Они не совсем совместимы друг с другом на уровне ключей, но об этом позже.


Запуск RSync для Windows

Итак. На Windows-машине нужны программы rsync.exe и ssh.exe (из пакета OpenSSH), плюс куча DLL-ок, к ним прилагающиеся. Желательно все - последних версий (в предпоследних страшные глюки, проверено). После проверки 3-4 дистрибутивов я остановился вот на этом:

http://www.itefix.no/phpws/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=29&MMN_position=54:54
(качасть cwRsync).

Устанавливаем, копируем bin-директорию в папку, прописанную в PATH (хоть в C:\WINDOWS), и запускаем следующую команду:

rsync -e ssh -aHvv --delete --modify-window=10 html/www/ ЛОГИН@САЙТ.ru:~/html/test/

Здесь:
- html/www/ - имя локальной папки (относительно текущей; слэш в конце ОБЯЗАТЕЛЕН!)
- aHvv - передавать все, с включенным подробным режимом отчета
- --delete - удалять на внешнем сайте те файлы, которых нет на локальном (ОСТОРОЖНО! Если указать не ту папку назначения, можно случайно удалить ВСЕ с сайта!!! Лучше при экспериментировании не указывать, и только потом, когда будет уверенность, что все ОК, можно подключить)
- ЛОГИН - SSH-логин для сайта (да, SSH-доступ обязательно нужен, без него никак)
- ~/html/test/ - имя папки на удаленном сервере

Будет запрошен пароль для SSH-доступа, а потом начнется синхронизация (при первом запуске - довольно долго, но при следующих он, видимо, ориентируется по timestamp-ам и работает мгновенно!).


Беспарольный доступ

Чтобы пароль к сайту каждый раз не запрашивался, можно создать пару открытый+закрытый ключ (2 файла).
- Открытый (несекретный) следует положить в директорию ~/ssh (или ~/ssh2 - в случае использования не OpenSSH, а SSH2 - спросите у провайдера).
- Закрытый (секретный) - к себе в z:\home\denwer\.ssh\ (к примеру). (Про то, как создать ключи, см. ниже.)
Также необходимо установить переменную окружения HOME, чтобы ssh.exe понял, где ему искать свою директорию .ssh/ и ключи.

Например, у меня BAT-файл синхронизации выглядит так:

@echo off
set HOME=.
rsync -e ssh -aHvv --delete --modify-window=10 html/www/ ЛОГИН@denwer.ru:~/html/test/


Причем:
- В директории ./.ssh лежит файл id_rsa (закрытый ключ).
- Открытый ключ (который можно всем раздавать) лежит на сервере denwer.ru под именем ~/.ssh2/id_dsa.pub.
- Чтобы SSH2-сервер, установленный на denwer.ru, мог найти открытый ключ, в текстовом файле ~/.ssh2/authorization прописана строчка:

Key id_dsa.pub

(Напоминаю: на сервере стоит SSH2, не OpenSSH!)

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


Генерация пары ключей

Пару открытый+закрытый ключ генерируется, например, таким unix shell-скриптом:

# Видимо, можно тип "dsa" тоже использовать.
TYPE=dsa
PRIV=id_$TYPE
PUB=$PRIV.pub
# Удаляем старые ключи.
rm -f $PRIV $PUB authorization
# Генерируем пару ключей OpenSSH.
ssh-keygen -t $TYPE -f $PRIV
chmod 600 $PRIV $PUB
# Конвертируем открытый ключ OpenSSH в открытый ключ SSH2 (если нужно).
ssh-keygen -t $TYPE -e -f $PUB >$PUB.txt
mv -f $PUB.txt $PUB
# Создаем файл authorization для SSH2-сервера.
echo "Key $PUB" > authorization

Причем открытый ключ (который кладется на denwer.ru) преобразуется в формат, понятный SSH2 (утилита ssh-keygen принадлежит OpenSSH, и, кстати, в cwRsync она есть, можно использовать).


Если бы не SSH2, а OpenSSH...

Итак, финальный штрих. Если на denwer.ru стоял бы не SSH2, а OpenSSH, то тогда:
- Запускать ssh-keygen -e (конвертация открытого ключа OpenSSH в открытый ключ SSH2) не нужно (см. скрипт).
- Открытый ключ id*.pub надо просто положить (переименовать) в файл ~/.ssh/authorized_keys (его понимает OpenSSH).
- Остальное все так же.


P.S.

Наверное, потом по всему этому материалу напишу статью, пока публикую тут, чтобы по горячим следам не забыть.
Дмитрий Котеров:
На самом деле мой bat-файл для синхронизации выглядит так:

@echo off
set IN=html/www/
set OUT=~/html/test/
set LOGIN=ЛОГИН
set HOST=denwer.ru

set HOME=.

rsync -e ssh -rtzHvv --delete --modify-window=10 %IN% %LOGIN%@%HOST%:%OUT%
ssh %LOGIN%@%HOST% "chmod -R g+r %OUT%; for a in `find %OUT% -type d`; do chmod g+x $a; done"


Тут дело в том, что rsync по умолчанию принудительно ставит на директории и файлы права 700 (видимо, он считает, что в Windows они именно таковы), а для хостинга net.ru этого недостаточно:
- на директории должно стоять минимум 750 (rwxr-x---)
- на файлы (и особенно на .htaccess) - соответственно, 710 (rwxr-----)

Так что приходится после синхронизации вручную переставлять все нужные права.
Дмитрий Котеров:
Да, еще одно. Для того, чтобы rsync работал, на машине хостера должна быть утилита rsync. Она запускается через SSH-консоль, и без нее ничего не работает.

В принципе, совсем не обязательно, чтобы бинарник rsync лежал прямо в системной директории. Можно его самостоятельно откомпилировать (или взять готовый), положить в домашний каталог ~/bin/, а в .bashrc прописать:
PATH=~/bin:$PATH

Так тоже сработает.
Дмитрий Котеров:
Еще один трюк. Чтобы не было проблем с правами доступа, надо делать set CYGWIN=nontsec. Иначе на удаленной машине все файлы могут создаваться с атрибутомм "x", что нежелательно Пример bat-файла:

@echo off
set IN=forum
set OUT=~/dklab.ru/forum
set LOGIN=dklab
set HOST=dklab.ru
set EXCLUDE=--exclude=files --exclude=images/avatars
set CYGWIN=nontsec

set HOME=.

rsync -e ssh -prltzvv --delete --modify-window=10 %EXCLUDE% %IN%/ %LOGIN%@%HOST%:%OUT%/

Ant:
Ветка выделена в отдельную тему «Программы и методы для синхронизации файлов (в том числе и FTP).»,
расположенную в форуме Прочее (23 Ноября 2005, 22:42).
Ant:
Перенесено из форума: Прочее.
Перенесено в форум: Полезные советы :: Денвер.
Юрий Насретдинов:
Ага, вот ты какой строчкой синхронизируешь изменения... А каким образом файлы заменяются? Потому что, по идее, если они заменяются банальным «переписыванием поверх», то это может повлечь за собой ситуацию, известную как «белая страница» или «Fatal error: parse error...» в лучшем случае и порча данных в БД или в файловой системе в худшем.
davav:
Тут ы меня выдает следующее сообщение

The source and destination cannot both be remote.rsync error: syntax or usage error (code 1) at main.c(1135)

после такой комманды
rsync -e ssh -aHvv --delete --modify-window=10 C:/da/ усер@ип:/srv/foler/
konung:
Хмм, сама идея неплохая, но устаревшая. Зачем мучиться с rsync, если большенство современных систем контроля сырцов поддерживают ssh. Я пользуюсь Mercurial он же hg, но можно и чем-то другим пользоваться, в зависимости от того что вам нравится и какой поддреживается хостингом. ( На дримхосте у меня hg, git и svn работают без проблем).

Плюсы по сравнению с rsync:
* доплонительный бэкап нахаляву
* история всех изменений
* без проблем работает на windows ( и других оболочках тем более), нарпимер для hg, я ползуюсь TortoiseHG - и GUI и командная строка.
* поддерживается многими IDE и Bugtracker'ами
*если с кем-то надо поделиться сырцом и потом сообща соеденить изменения - то rsync вам не друг

Остольные функции схожи: ssh, и т.д.
qazvitall:
Еще один трюк. Чтобы не было проблем с правами доступа, надо делать set CYGWIN=nontsec. Иначе на удаленной машине все файлы могут создаваться с атрибутомм "x", что нежелательно Пример bat-файла:

@echo off
set IN=forum
set OUT=~/dklab.ru/forum
set LOGIN=dklab
set HOST=dklab.ru
set EXCLUDE=--exclude=files --exclude=images/avatars
set CYGWIN=nontsec

set HOME=.

rsync -e ssh -prltzvv --delete --modify-window=10 %EXCLUDE% %IN%/ %LOGIN%@%HOST%:%OUT%/


Попробовал, очень помогло! Спасибо! :)

Эта тема на forum.dklab.ru