Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

RSync с Windows на Unix. (Дмитрий Котеров)
Author Message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Dec 28, 2004 4:03 am (написано за 25 минут 46 секунд)
   Post subject: RSync с Windows на Unix.
Reply with quote

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

Версии SSH

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


Запуск RSync для Windows

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

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-файл синхронизации выглядит так:
Code (any language): скопировать код в буфер обмена
@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 прописана строчка:
Code (any language): скопировать код в буфер обмена
Key id_dsa.pub
(Напоминаю: на сервере стоит SSH2, не OpenSSH!)

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


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

Пару открытый+закрытый ключ генерируется, например, таким unix shell-скриптом:
Code (Bash): скопировать код в буфер обмена
#
TYPE=dsa
PRIV=id_$TYPE
PUB=$PRIV.pub
#
rm -f $PRIV $PUB authorization
#
ssh-keygen -t $TYPE -f $PRIV
chmod 600 $PRIV $PUB
#
ssh-keygen -t $TYPE -e -f $PUB >$PUB.txt
mv -f $PUB.txt $PUB
#
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.

Наверное, потом по всему этому материалу напишу статью, пока публикую тут, чтобы по горячим следам не забыть.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Dec 28, 2004 4:45 am (спустя 41 минуту; написано за 3 минуты 8 секунд)
   Post subject:
Reply with quote

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

Так что приходится после синхронизации вручную переставлять все нужные права.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Dec 29, 2004 1:37 am (спустя 20 часов 52 минуты; написано за 2 минуты 44 секунды)
   Post subject:
Reply with quote

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

В принципе, совсем не обязательно, чтобы бинарник rsync лежал прямо в системной директории. Можно его самостоятельно откомпилировать (или взять готовый), положить в домашний каталог ~/bin/, а в .bashrc прописать:
Code (Bash): скопировать код в буфер обмена
PATH=~/bin:$PATH
Так тоже сработает.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Thu Jan 13, 2005 12:33 pm (спустя 15 дней 10 часов 55 минут; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

Еще один трюк. Чтобы не было проблем с правами доступа, надо делать set CYGWIN=nontsec. Иначе на удаленной машине все файлы могут создаваться с атрибутомм "x", что нежелательно Пример bat-файла:
Code (Windows BAT file): скопировать код в буфер обмена
@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%/
Back to top
View user's profile Send private message Send e-mail
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 131
   поощрить/наказать


PostPosted: Wed Nov 23, 2005 10:42 pm (спустя 10 месяцев 10 дней 10 часов 8 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Программы и методы для синхронизации файлов (в том числе и FTP).»,
расположенную в форуме Прочее (23 Ноября 2005, 22:42).
Back to top
View user's profile Send private message Send e-mail
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 131
   поощрить/наказать


PostPosted: Wed Nov 23, 2005 10:46 pm (спустя 4 минуты)
   Post subject:
Reply with quote


М

Перенесено из форума: Прочее.
Перенесено в форум: Полезные советы :: Денвер.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon May 04, 2009 11:11 pm (спустя 3 года 5 месяцев 11 дней 24 минуты; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

Ага, вот ты какой строчкой синхронизируешь изменения... А каким образом файлы заменяются? Потому что, по идее, если они заменяются банальным «переписыванием поверх», то это может повлечь за собой ситуацию, известную как «белая страница» или «Fatal error: parse error...» в лучшем случае и порча данных в БД или в файловой системе в худшем.
Back to top
View user's profile Send private message Send e-mail
davav
Заглянувший



Joined: 07 Jul 2009
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Thu Jul 09, 2009 12:16 pm (спустя 2 месяца 4 дня 13 часов 5 минут; написано за 1 минуту 9 секунд)
   Post subject:
Reply with quote

Тут ы меня выдает следующее сообщение

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

после такой комманды
rsync -e ssh -aHvv --delete --modify-window=10 C:/da/ усер@ип:/srv/foler/
Back to top
View user's profile Send private message
konung
Заглянувший



Joined: 22 Oct 2009
Posts: 6
Карма: 0
   поощрить/наказать

Location: рождённый в Северодвинске

PostPosted: Sat Oct 24, 2009 1:32 am (спустя 3 месяца 14 дней 13 часов 15 минут; написано за 7 секунд)
   Post subject:
Reply with quote

Хмм, сама идея неплохая, но устаревшая. Зачем мучиться с rsync, если большенство современных систем контроля сырцов поддерживают ssh. Я пользуюсь Mercurial он же hg, но можно и чем-то другим пользоваться, в зависимости от того что вам нравится и какой поддреживается хостингом. ( На дримхосте у меня hg, git и svn работают без проблем).

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

Остольные функции схожи: ssh, и т.д.
Back to top
View user's profile Send private message Send e-mail
qazvitall
Заглянувший



Joined: 05 Aug 2010
Posts: 1
Карма: 0
   поощрить/наказать

Location: Москва

PostPosted: Thu Aug 05, 2010 12:54 pm (спустя 9 месяцев 12 дней 11 часов 22 минуты; написано за 1 минуту 35 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Еще один трюк. Чтобы не было проблем с правами доступа, надо делать set CYGWIN=nontsec. Иначе на удаленной машине все файлы могут создаваться с атрибутомм "x", что нежелательно Пример bat-файла:
Code (Windows BAT file): скопировать код в буфер обмена
@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%/
Попробовал, очень помогло! Спасибо! :)
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML