Организация процесса обновления файлов на сервере в Windows

К сожалению, в связи с отсутствием Windows проверить всё это я уже не могу, пишу по памяти.

Вкратце:

  1. Устанавливаем ssh клиент — putty
  2. Создаём ключи
  3. Добавляем pageant в автозагрузку и запускаем
  4. Создаём командный файл для обновления сервера и запускаем

SSH клиент

В Windows основной SSH клиент — putty. В комплект входит:

  • putty.exe — собственно клиент, в котором можно работать как в обычном ssh терминале, аналог ssh в unix
  • plink.exe — command-line ssh клиент, аналог ssh в unix
  • pageant.exe — программа кэширования приватных ключей в памяти, аналог ssh-add в unix
  • puttygen.exe — генератор ключей, аналог ssh-keygen в unix
  • pscp.exe — клиентская программа протокола SCP, аналог scp в unix
  • psftp.exe — клиентская программа протокола SFTP, аналог sftp в unix

Совсем сначала надо прочитать документацию, но так как делать это никто не будет, опишу по шагам вкратце весь процесс.

Сначала устанавливаем сам putty — http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html. Я бы установил в c:\putty , так как потом это имя придётся использовать в командных файлах и оно желательно должно быть простым.

Потом создаём приватный/публичный ключ с помощью puttygen.exe. Процесс описан в https://the.earth.li/~sgtatham/putty/0.68/htmldoc/Chapter8.html#pubkey , обратить внимание надо на восемь моментов.

  1. Приватный ключ всегда должен создаваться с паролем. Сложным. НЕ qwertasdg1234
  2. Приватный ключ всегда должен создаваться с паролем. Сложным. НЕ йцукфыва1234
  3. Приватный ключ всегда должен создаваться с паролем. Сложным. НЕ 12345678
  4. Приватный ключ всегда должен создаваться с паролем. Сложным. НЕ ‘ ‘
  5. Приватный ключ всегда должен создаваться с паролем. Сложным. НЕ passw0rd
  6. Сохранять приватный/публичный ключ надо в директории, защищённой от всех кроме его владельца, и никогда не передавать никому приватный ключ (*.ppk) .
  7. Современные дистрибутивы Linux требуют ключ RSA 2048 бит (или больше), но НЕ 1024 бита. Ключ 1024 бита работать на сервере не будет.
  8. Для передачи на linux сервер и записи в файл ~/.ssh/authorized_keys публичный ключ должен быть сохранён в однострочном формате — он есть в текстовом поле puttygen, но не сохраняется автоматически, его надо вручную сохранить в той же директории что и публичный/приватный ключи, но с каким-то отличным от .ppk или .pub расширением. Пример такого ключа:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDO6FE+ejtICTMH8V1wtbHffP0A1NUV2JF8QB5iSyo9mLdrYofbiFtXpVUV9XuUe0pXNEUpHWWqFNd+AKl6fXOU2NiA3IgZ4dZ4/u/ii1GwhIqMPhaN9NlmXDKtfcvPPxPLBoJhijWxDurstPtSZacHlxptRPjP2iYDa7eyIzUU66KO68pCLL5fh0ccVWwY/173gRbR0svJJejo6j0/TCRidsUwJm6NHv0q9gUfRINvfFGEJZL0EKhcqUyk6iqK0o8Q8zOUShtYZryJGhnTqaTZ95OnzF7pDDXkIyaHcu/Huukjx6oQHkR3GHhtUt6ijl/tpGAf071aUJStJlY2FGWn test@test.host

test@test.host — имя, идентифицирующее происхождение ключа. Желательно указывать имя пользователя и сервер, с которого пришёл ключ. Напоминаю, что это ОДНА строка, без переноса слов и букв. Из стандартного для putty формата такой формат может быть создан без проблем в любом редакторе. Администратор Linux сервера примет и стандартный для putty формат и сам всё изменит, но Вы будете занесены в категорию подозрительных личностей, от которых можно ожидать любой пакости 🙂

pageant

pageant сохраняет в памяти загруженные приватные ключи и выдаёт их клиентам ssh без запроса пароля. Это крайне удобно. Запускать pageant надо от имени пользователя с административными правами. Проще всего создать командный файл, в который записать вызов pageant и указать список ключей, которые он должен загрузить.

c:\putty\pageant.exe c:\putty\user.ppk

Этот командный файл добавить в автозагрузку и не забыть отметить флажок «запускать с административными правами»

Копирование файлов

Для копирования достаточно pscp.exe , но в большинстве случаев лучший результат даёт использование rsync.exe — он умеет делать инкрементальное копирование, то есть передаёт только изменившиеся части файлов. С rsync под windows есть некоторая проблема совместимости, описанная ниже.

Создаём файл update.bat с содержимым:

c:\putty\pscp.exe -r c:\project\release\ user@host:/home/user/project/release

Запуск этого файла решит все проблемы обновления. Кроме одной. В windows/unix разные понятия о том какой файл надо считать выполнимым, поэтому некоторым файлам придётся установить дополнительные права, для этого в фомандный файл надо добавить несколько строк, например

c:\putty\pscp.exe -r c:\project\release\ user@host:/home/user/project/release
REM права читать ВСЕМ директорию и файлы
c:\putty\plink.exe user@host chmod -R ugoa+rX /home/user/project/release
REM права запускать ВСЕМ отдельный файл
c:\putty\plink.exe user@host chmod -R 755 /home/user/project/release/file.sh

Вопрос с правами сложный и его надо тщательно продумывать, особенно права на файлы, которые лишним процессам доступны быть не должны (пароли всякие).

rsync

rsync — программа синхронизации файлов, в частности между локальной файловой системой и сервером. Особенности — синхронизация инкрементальная, то есть копируются только изменённые части файлов. Для архивов это не очень актуально, кроме архивов gzip созданных с опцией —rsyncable, но в большинстве случаев всё равно удобнее чем scp — например, можно указать файлы или директории, которые не надо синхронизировать, можно удалять лишние файлы и так далее.

С какой-то версии putty или cygwin у rsync+pageant начались проблемы совместимости. Несколько лет назад этот вопрос был актуален, как сейчас не знаю. Во всяком случае есть инструкция как обойти проблему.

Предыдущий скрипт, в варианте rsync, будет выглядеть так:

c:\putty\rsync.exe --progress -avz /cygdrive/c/project/release user@host:/home/user/project

или

c:\putty\rsync.exe --progress -avz /cygdrive/c/project/release/* user@host:/home/user/project/other-release-dir/

rsync — программа из комплекта cygwin, поэтому пути в windows преобразуются в unix-like вид типа /cygdrive/c/project/release/ . Конечно, можно указывать и относительные пути, только не забывать менять ‘\’ на ‘/’ .

Leave a Reply