#post-id: 5311-11-54 #original-date: 9.02.2015 Mon #original-time: 11:54 AM #original-day: 5311 #original-host: WinXP Prof SP3 (Build 2600) Придумала как статичные сайты без лишних проблем выгружать на сервер через SSH. Сначала хотела заюзать rsync, но это привело к бешенству, о котором я писала ранее. PuTTY с его SSH.EXE тоже не годился, поскольку там туговато с кириллицей и командами (программа эмулирует FTP.EXE). Ещё я использовала для этого BTSync, но признала это решение непрактичным, поскольку я не каждые пять минут меняю файлы сайта, а синхронизация идёт постоянно, BTSync кушает память. В итоге мой выбор пал на WinSCP, который умеет SFTP (передача файлов через SSH), который виндовый и который без закидонов. Он похож на те же FTP.EXE и PuTTY, но обладает большим набором команд. Ранее я пыталась его заюзать для подобной задачи, но отчего-то у меня ничего не получилось. В этот раз я воспользовалась всей мощью его команд, которых нет у PuTTY, и решила задачу. Итак, задача. Есть папка с файлами, представляющими из себя сайт. В папке могут быть подкаталоги, в них какие-то другие файлы. Файлы меняются локально, на сервере ничего не меняется. Нужно обеспечить синхронизацию с сервером, а именно заливку изменившихся файлов на сервер в автоматическом режиме, а также удаление всех файлов, которые удалены локально. Допустим, сайт расположен в каталоге E:\Site. На сервере же каталог сайта - /var/www/hosts/serenareem.net. Для решения юзаем WinSCP. Допустим, установленную, можно и в портабельном варианте. Допустим, её каталог - C:\Utils\WinSCP. Для начала нам нужно создать профиль в WinSCP. Вомзожно, такой уже есть (если программа юзается постоянно). В нём настраивается хост, пароль и/или ключ, параметры передачи всё такое прочее. Тоесть оно должно работать. Теперь делаем файл, скажем, Upload.BAT. Примерно такого содержания: > @ECHO OFF > SETLOCAL > > SET EXE_PATH=C:\Utils\WinSCP > SET SCRIPT_FILE_NAME=E:\Site\Upload.TXT > > PUSHD "%EXE_PATH%" > WinSCP.com /script="%SCRIPT_FILE_NAME%" > POPD Я использовала две переменные на случай, если компьютеров будет больше, и папки-файлы на них будут расположены по-разному. Тогда можно добавить условия и использовать переменные гибко. EXE_PATH - это каталог, который содержит файлы WinSCP. Я не вызываю исполняемые файлы напрямую, а перехожу в каталог с ними (команда PUSHD работает как CD, но позволяет потом вернуться назад командой POPD), поскольку в случае портабельной установки WinSCP INI файл начинает искать в текущем каталоге, куда может закинуть и winscp.rnd, который нам в каталоге сайта не нужен. Отсюда же вытекает переменная SCRIPT_FILE_NAME, которая указывает абсолютный путь к командами, которые нужно выполнить. Так как каталог с командами больше не является текущим, нужно указать путь к файлу полностью. Заметьте, что скрипт лежит в каталоге сайта. Об этом будет сказано ниже. В качестве исполняемого файла вызывается winscp.com, который потом всё равно вызывает winscp.exe, но по крайней мере гарантируется, что будет консоль ^^' А вот как выглядит упомянутый выше Upload.TXT. > option reconnecttime 5 > option batch continue > > echo Connecting to SHH server... > open "My Site" > > echo Synchronizing directories... > synchronize -mirror -delete -criteria=either remote "E:\Site\" "/var/www/hosts/serenareem.net" > > echo Removing upload scripts! > rm "/var/www/hosts/serenareem.net/Upload.BAT" > rm "/var/www/hosts/serenareem.net/Upload.TXT" > > echo Bye-bye! > exit Первые две строки указывают, как будем работать дальше. Первая говорит ждать пять секунд перед переподключением (на всякий случай, мне ни разу ещё не пригождалось), а вторая говорит игнорировать ошибки и продолжать выполнение. Без этой опции при любой ошибке произойдёт выход. Например, в настройках профиля последним запомнился локальный каталог C:\Test, который ужеудалён? "Can't switch to local directory" - на выход. Та же фигня и с удалённым каталогом. Возможно, после команды open стоит переключить этот режим обратно, но я не уверена. Команда echo просто выдаёт сообщение в консоль, а вот команда open конектится к серверу. Там можно указать удалённый адрес, а можно - имя профиля, что мы и делаем ("My Site"). Если профиль находится в подкаталоге, то нужно указать полный путь к нему, например, "Sites/Static/My Site". Слэш должен быть прямым. После подключения начинается синхронизация. В соответствующей команде указывается сначала локальный каталог нашего сайта, а потом - каталог а сервере. Параметры указывают ведущей использовать локальную сторону и полностью зеркалить её состояние на той стороне. При сравнении используются тайм стампы и размер файлов, так что на сервере время должно быть правильным. WinSCP покажет, какие каталоги сверяет, потом покажет что удаляет и что копирует. Это займёт некоторое время. Дальше идут две строки с командами rm, котоыре удаляют файлы на удалённом сервере. Они нужны только если файлы Upload.BAT и Upload.TXT лежат в каталоге сайта. WinSCP не умеет фильтровать по атрибутам выгружаемые файлы, так что скрыть эти файлы не удастся. Поэтому разу после синхронизации мы их удалим, чтобы не мешались. После этого выполняется команда exit, которая разрывает соединение и завершает выполнение скрипта. Собственно на этом всё. После внесения изменений в файлы сайта на локальном компьютере достаточно запустить Upload.BAT и дождаться завершения процесса синхронизации. Кстати о переменных. Допустим, мы используем выгрузку на двух машинах, PC1 и PC2. Допустим, каталог сайта синхронизируется через тот же BTSync или через FreeFileSync периодически. Каталоги с WinSCP и самим сайтом могут иметь разный путь, так что мы заюзаем переменные и условия. С другой стороны переменные не работают в Upload.TXT. Придётся делать несколько таких файлов с индентичным содержимым, но с разным каталогом сайта. Чтобы не путаться, носить они будут названия с именем машины. Вот так будет выглядеть Upload.BAT: > @ECHO OFF > SETLOCAL > > IF "%USERDOMAIN%"=="PC1" ( > SET EXE_PATH=C:\Utils\WinSCP > SET SCRIPT_FILE_NAME=E:\Site\Upload.PC1.TXT > ) ELSE IF "%USERDOMAIN%"=="PC2" ( > SET EXE_PATH=D:\Utils\WinSCP > SET SCRIPT_FILE_NAME=C:\My Documents\Works\Sites\serenareem.net\Upload.PC2.TXT > ) > > PUSHD "%EXE_PATH%" > WinSCP.com /script="%SCRIPT_FILE_NAME%" /rawconfig LocalDirectory=C%5C RemoteDirectory=/tmp > POPD Для PC1 скрипт Upload.PC1.TXT будет выглядеть так: > option reconnecttime 5 > option batch continue > > echo Connecting to SHH server... > open "My Site" > > echo Synchronizing directories... > synchronize -mirror -delete -criteria=either remote "E:\Site\" "/var/www/hosts/serenareem.net" > > echo Removing upload scripts! > rm "/var/www/hosts/serenareem.net/Upload.BAT" > rm "/var/www/hosts/serenareem.net/Upload.TXT" > > echo Bye-bye! > exit Для PC2 скрипт Upload.PC2.TXT будет выглядеть так: > option reconnecttime 5 > option batch continue > > echo Connecting to SHH server... > open "My Site" > > echo Synchronizing directories... > synchronize -mirror -delete -criteria=either remote "C:\My Documents\Works\Sites\serenareem.net\" "/var/www/hosts/serenareem.net" > > echo Removing upload scripts! > rm "/var/www/hosts/serenareem.net/Upload.BAT" > rm "/var/www/hosts/serenareem.net/Upload.TXT" > > echo Bye-bye! > exit Кавычки в команде synchronize не обязательны, но в данном случае нежны, так как путь содержит пробел. Короче, указывайте их всегда - вреда не будет ^^' Как видно, эти скрипты идентичны. Различие заключается только в строке с командой synchronize. Так что если в будущем будете вносить правки в скрипт, имейте это в виду. Собственно, всё. При запуске Upload.BAT на одной машине будет вызвана одна версия скрипта, а на другой - другая. Сделают они одно и то же, но каждыя найдёт файлы в правильном каталоге.