1

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

Команда

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:// - это просто сокращение, которое удобнее вводить в командной строке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .