Линукс
На моей системе 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, но это не то, что мне нужно.
Какой ответ я предпочитаю?
Я предпочитаю ответ, удовлетворяющий следующим критериям:
- Ключ SSH необходимо расшифровать один раз при загрузке системы Windows и открытии терминала для выполнения действий git.
- При открытии нового терминала можно продолжить взаимодействие с репозиторием git, т.е. не будет появляться запрос на ввод пароля.
- Я не фанат 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://
префикса — это просто сокращение, которое удобнее вводить в командной строке.