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

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

Линукс

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

ssh-add ~/.ssh/id_rsa_some_key

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

Окна

У меня на работе стоит система Windows. После загрузки я открываюgit-баши проблема:

eval $(ssh-agent)

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

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

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

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

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

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

решение1

Команда

eval $(ssh-agent)

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

Если переменная 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 в полной форме, то есть вместо просто [email protected]/project.git, вы должны ввести его следующим образом:

ssh://[email protected]/project.git

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

Связанный контент