Как предотвратить, чтобы ключ ssh, который используется для выполнения действий git, расшифровывался только один раз и при последующем открытии новых терминалов в Windows?

218
030

Linux

В моей системе Linux я расшифровываю закрытый ключ ssh каждый раз, когда загружаю систему. После загрузки я открываю терминал и выдаю:

ssh-add ~/.ssh/id_rsa_some_key 

и я готов к выполнению операций GIT, как git clone <git-url>, git pull -aи так далее. Когда я открываю другой терминал и снова выполняю такие команды, не появляется подсказка, запрашивающая ввод пароля зашифрованного ssh-ключа. Таким образом, в моей системе Linux я должен ввести пароль только один раз.

Windows

На моей работе у меня есть система Windows. После загрузки я открываю git-bash и выдаю:

eval $(ssh-agent) 

и ssh-add ~/.ssh/private_keyвведите пароль и выполните команды git, которые могут взаимодействовать с репозиторием git. В отличие от моей системы Linux, когда я открываю новый git-bash и выполняю команды git, появляется подсказка, в которой предлагается ввести пароль. Таким образом, когда секретный ключ был дешифрован в терминале git-bash, то возможно взаимодействие с репозиторием git, но когда новый терминал открыт, ssh-ключ должен быть дешифрован снова.

Что я попробовал

Я пытался использовать конкурс. Первая проблема в том, что id_rsa не подходит. Новый ключ нужно было создать с помощью puttygen, но потом оказалось, что использовать ssh git url, начинающийся с git @, будет невозможно. Это должно было быть заменено на URL https, но это не то, что я хочу.

Какой ответ я предпочитаю

Я предпочитаю ответ, который удовлетворяет следующим критериям:

  1. Ключ Ssh должен быть дешифрован один раз, когда система Windows была загружена и открыт терминал для выполнения действий git
  2. Когда новый терминал открыт, можно продолжать взаимодействовать с Git-репозиторием, то есть не будет появляться подсказка, запрашивающая ввод пароля.
  3. Я не предан git-bash. Если на окнах есть другой терминал, который соответствует первым двум критериям, то это нормально для меня.
1

1 ответ на вопрос

1
telcoM

Команда

eval $(ssh-agent) 

запускает процесс агента SSH (эквивалентный Pageant) и создает, как правило, две переменные среды: SSH_AUTH_SOCK и SSH_AGENT_PID (по крайней мере, в Linux, не знаю, имеет ли какое-то значение Windows git-bash; вероятно, нет).

Если переменная SSH_AUTH_SOCK установлена ​​и указывает на действительный сокет агента аутентификации, любой процесс, который может прочитать переменную, может использовать ее. Так что вам просто нужен способ, чтобы значение этой переменной распространялось от одного сеанса git-bash к другому. Переменная SSH_AGENT_PID - это просто удобство, позволяющее легко убивать агента, если / когда это необходимо.

Если вы можете сохранить эти переменные окружения (или даже просто SSH_AUTH_SOCK) в файле, чтобы ваши последующие окна git-bash могли его прочитать, вы можете написать их так:

Всякий раз, когда запускается новый git-bash (т. .bashrcЕ. Со сценарием или его эквивалентом git-bash)

  • проверить наличие файла переменной среды агента SSH
  • если файл существует:
    • прочитай это
    • если сокет агента (и, возможно, процесс), указанный в файле, все еще существует, используйте переменные как есть в текущем сеансе
  • иначе (то есть, если файл не был там или его информация устарела):
    • бежать eval $(ssh-agent)
    • создать новый файл переменной среды агента SSH
  • сделанный!

Кроме того, вам может потребоваться ввести URL-адрес SSH git в полной форме, то есть вместо простого git@server.name/project.gitвведите его следующим образом:

ssh://git@server.name/project.git 

Технически форма без ssh://префикса - это просто сокращение, которое удобнее набирать в командной строке.