Пакетный скрипт передает переменную в стандартный ввод с помощью ключей git и ssh - PullRequest
2 голосов
/ 07 июня 2011

Я пытаюсь написать пакетный скрипт для клонирования нескольких хранилищ. Моя проблема в том, что у пользователя есть защищенный паролем ключ SSH. Поэтому каждый раз, когда я запускаю call git clone blah@blah/blah.git в моем командном файле, я должен вводить пароль пользователя. Я знаю, что могу получить пароль от них как set \p userpwd=[Enter ssh pwd], но как мне передать это каждому вызову?

Ответы [ 7 ]

3 голосов
/ 08 июня 2011

Лучший способ избежать ввода ключевой фразы для ключа ssh каждый раз, когда это необходимо, это использовать ssh-agent.Большинство дистрибутивов Linux запускают ssh-agent как часть пользовательского сеанса.Чтобы начать использовать ssh-agent, запустите ssh-add и введите ключевую фразу для своего ключа один раз.Когда вы запускаете команду, использующую ssh, она получает дешифрованный ключ от ssh-agent, а не запрашивает пароль.В некоторых дистрибутивах даже есть функция, где она будет хранить вашу фразу-пароль в связке ключей и настраивать ssh-agent для вас как часть вашего логина.

2 голосов
/ 20 июля 2011

Вот способ получить тот же эффект, но с шагами, отличными от того, что вы намекнули в своем вопросе:

  1. Старт ssh-agent
  2. Добавьте ключ с помощью ssh-add (он запросит пароль, только один раз)
  3. Запустите столько git clone <url>, сколько вам нужно
  4. Очистите

На втором этапе будет запрошенпароль, вместо использования set /p.Следующий пакетный файл является своего рода портом основных правил ssh для github .Я протестировал его с помощью ssh-подключения к gitorious, работающему git версии 1.7.6.msysgit.0 под cmd.exe в Windows Vista.

@rem Do not use "echo off" to not affect any child calls.
@setlocal

@:: Find out where is git installed
@where git > __wheregit.txt

@:: Under XP, there is no where command. Use this (thanks to Raymond Chen)
@:: http://blogs.msdn.com/b/oldnewthing/archive/2005/01/20/357225.aspx
@:: (for %%e in (%PATHEXT%) do @for %%i in (git%%e) do @if NOT "%%~$PATH:i"=="" echo %%~$PATH:i) > __wheregit.txt

@:: Move it to a environment variable, we will need to manipulate the string
@set /p wheregit= <__wheregit.txt
@del __wheregit.txt

@:: Parse the full file name of git.cmd to find the the path
@for /F "delims=" %%I in ("%wheregit:~0,-7%..") do @set git_install_root=%%~fI
@set PATH=%git_install_root%\bin;%git_install_root%\mingw\bin;%PATH%

@:: The keys are in the home directory.
@if not exist "%HOME%" @set HOME=%HOMEDRIVE%%HOMEPATH%
@if not exist "%HOME%" @set HOME=%USERPROFILE%

@ ::start ssh-agent, and save its output
@ssh-agent > __ssh-agent.out

@ ::parse the output and set environment vars needed by ssh-add
@FOR /F "eol=; tokens=1* delims=;" %%i in ('findstr /v echo __ssh-agent.out') do @set %%i
@del __ssh-agent.out

@ ::add the key to the agent (this will ask for the password)
@ssh-add %HOME%\.ssh\id_rsa

@ ::Call git. When it's time to use the key, its password will be provided by ssh-agent
@ ::Obviously you will put your git clone url here
@call git clone git@gitorious.org:siaki-sso/siaki-sp.git
@call git clone git@gitorious.org:siaki-sso/siaki-idp.git

@ ::Kill ssh-agent
@ssh-agent -k

@endlocal
1 голос
/ 21 июля 2011

Итак, как и все остальные, использование ssh-agent является реальным рекомендуемым способом.

Но если вы действительно хотите испортить сценарии, и пароль одинаков для всех ключей / репозиториев, вы можете использовать специальную переменную среды SSH_ASKPASS.Это позволяет настроить «программу» на выполнение, когда SSH хочет запросить пароль.Вы всегда можете указать на какой-нибудь скрипт на диске, который просто выплевывает пароль, который вы взяли у пользователя в начале.

По сути, взять пароль пользователя, записать его в файл tmp, который просто выведет его на экран.установите переменную окружения SSH_ASKPASS для этого сценария, а затем продолжите операции git / ssh.

См. http://dovetail.com/forum/viewtopic.php?t=822 и http://git.661346.n2.nabble.com/SSH-ASKPASS-td2137400.html для связанных потоков.

0 голосов
/ 21 июля 2011

ssh-agent это хорошо, но для скриптов я предпочитаю функцию ControlMaster OpenSSH.

В режиме ControlMaster вы можете один раз подключить ваш скрипт, оставить его запущенным в фоновом режиме, а затем заставить другие экземпляры ssh (включая scp, rsync, git и т. Д.) Повторно использовать существующие подключение. Это позволяет пользователю вводить пароль только один раз (при настройке мастера управления), даже если выполняется несколько команд ssh.

Поиск ControlMaster в man ssh_config для деталей.

Преимущества перед ssh-agent:

  • Пользователи не должны понимать, что такое ssh-ключи или как ssh-agent работает.
  • Пользователям не нужно генерировать пару открытых / закрытых ключей ssh, что важно, если сценарий будет запускаться многими пользователями. (Большинство людей не понимают ssh-ключей, поэтому создание большой группы людей для их генерации - утомительное упражнение.)
  • Пользователям не нужно копировать свой открытый ключ на удаленный сервер.
  • Пользователи не должны забывать запускать ssh-agent
  • Пользователи не должны забывать запускать ssh-add
  • В зависимости от того, как он настроен, ssh-agent может тайм-аут ключей пользователя в процессе выполнения сценария; это не будет
  • Запускается только один сеанс TCP, поэтому гораздо быстрее, если сценарий подключается снова и снова (например, копируя множество небольших файлов по одному)

Недостатки:

  • Сложнее кодировать. Мой ответ на аналогичный вопрос содержит пример кода оболочки UNIX.
  • Это только облегчает дополнительные подключения к одному и тому же серверу (ssh-agent может использоваться для подключения ко многим различным серверам)
  • OpenSSH был разработан для использования в UNIX-подобных системах; Я не знаю, работает ли функция ControlMaster в Windows
0 голосов
/ 19 июля 2011

Давайте посмотрим, правильно ли я понимаю (я не использовал git, так что простите меня, если я далеко отсюда) Вам нужно передать команду pw в команду пакетного файла? http://dos.rsvs.net/DOSPAGE/BATCHCOM.HTM#3
Это довольно хорошее объяснение по поводу ввода входных данных в файлы .bat, которые должны позволять вам автоматически вводить направления.

0 голосов
/ 08 июня 2011

Взгляните на http://mah.everybody.org/docs/ssh. Мы смогли успешно использовать это с клиентом Putty ssh для Windows.

Это предотвратит запрос пользователя на ввод пароля.Это было бы лучше, чем передавать пароль на звонок, imho.

0 голосов
/ 07 июня 2011

Добавьте их открытый ключ в файл аутентифицированных хостов на сервере. Вам не нужно беспокоиться о подсказке вообще. --- и используйте ключи без парольных фраз.

...