Как инкрементно копировать (синхронизировать) папки с Linux на Windows?
Читатель сайта описывает свою любопытную проблему:
Что такое rsync?
Во-первых, rsync это утилита использующася только в Linux-системах. Для того, чтобы она работала в windows, её нужно устрановить там и настроить, например через cygwin. Во-вторых, почему вы пытаетесь отправлять файлы на localhost ? Localhost — это внутренний адрес-петля 127.0.0.1. При попытке отправить файлы туда, находясь в linux, вы пытаетесь подключиться с сервера на самого себя, т.е на сам сервер.
Как сделать синхронизацию папки c Linux на Windows?
Для того чтобы отправить файлы в windows c помощью rsync самый лучший способ — это смонтировать файловую систему локального windows-компьютера на сервер через ssh-туннель по smb. Тогда не потребуется устанавливать rsync на сам Windows и это решает проблему с доступом между сервером и домашним компьютером.
Для этого нужно подключаясь к серверу с локального компьютера сделать проброс R-типа. Пробрасывать нужно localhost:445. Затем, нужно чтобы в системе на сервере был установлен пакет cifs-utils. Расшариваете на локальном компьютере нужную папку, затем создаете точку монтирования на сервере, и монтируете туда уже c localhost. Кстати, на нашем сайте есть генератор-скриптов для бэкапов сайта, и в нем реализована генерация такого скрипта.
Пример скрипта для синхронизации папок
Давайте посмотрим на примере такого скрипта подобное копирование:
start /b d:plink.exe -pw rootpassword root@example.com -N -R 445:localhost:445
d:plink.exe -pw rootpassword root@example.com -C "mkdir /tmp/win&&mount -t cifs -o rw,nounix,soft,intr,username=user,password=windowspass //localhost/backup /tmp/win"
d:plink.exe -pw rootpassword root@example.com -C "rsync -a --no-p --no-o --no-o --no-t /var/www/example.com/ /tmp/win && umount /tmp/win&&rmdir /tmp/win"
taskkill /f /im plink.exe
Так он генерируется нашим сервисом для бэкап-скриптов.
В первой строке запускаем в фоне программу plink.exe (консольный ssh-клиент для Windows). Подключаемся на удаленный сервер example.com и туннелируем порт 445 с локальной машины на lo-интерфейс сервера. После подключения по ssh сервер будет «думать», что у него на localhost:445 есть windows-шара или запущен smb, сервер.
start /b d:plink.exe -pw rootpassword root@example.com -N -R 445:localhost:445
Здесь мы создаем точку монтирования, и монтируем расшаренную папку в созданную точку. После этого на сервере в созданной точке будет доступна файловая система локального компьютера. Сервер при этом «думает» что эта папка находится физически на нем самом. Соответственно он может выполнять любые операции над ней, запись и удаление файлов, так, как будто это его собственная папка.
d:plink.exe -pw rootpassword root@example.com -C "mkdir /tmp/win&&mount -t cifs -o rw,nounix,soft,intr,username=user,password=windowspass //localhost/backup /tmp/win"
Ну и здесь мы выполняем непосредственно синхронизацию папки сайта в эту папку. Все файлы отправляются на локальный компьютер, за это отвечает монтирование шары и туннель. Команде rsync передаем опции не сохранять атрибуты файлов — владельца и права, поскольку windows всё равно ничего не знает о таких атрибутах и не умеет с ними работать. По окончании синхронизации отмонтируем локальную шару от сервера.
d:plink.exe -pw rootpassword root@example.com -C "rsync -a --no-p --no-o --no-o --no-t /var/www/example.com/ /tmp/win && umount /tmp/win&&rmdir /tmp/win"
Здесь мы «убиваем» SSH-cессию, запущенную в фоне в самом начале.
taskkill /f /im plink.exe
Если вы поймете как это работает, то сможете аналогично использовать это на своих серверах. Или просто сделайте скрипт через наш сервис (вкладка rsync для бэкапа файлов) со своими данными и запустите его. Перед этим установите cifs-utils на сервер.