Как предотвратить ввод пароля для расшифровки закрытого ключа каждый раз при использовании Git Bash в Windows?


125

У меня есть служба автоматического создания, которая загружается из частного репозитория git. Проблема в том, что когда он пытается клонировать репозиторий, ему нужно предоставить пароль, потому что он не запоминается; поэтому, поскольку здесь нет человеческого взаимодействия, он вечно ждет пароля. Как заставить его запомнить из id_rsa.pub?

Ответы:


255

Для пользователей Windows просто обратите внимание, что именно так я настроил среду Git Bash для входа в систему один раз при запуске. Я редактирую свой ~/.bashrcфайл:

eval `ssh-agent`
ssh-add

Итак, когда я запускаю Git Bash, это выглядит так:

Welcome to Git (version 1.7.8-preview20111206)
(etc)
Agent pid 3376
Enter passphrase for /c/Users/starmonkey/.ssh/id_dsa:
Identity added: /c/Users/starmonkey/.ssh/id_dsa (/c/Users/starmonkey/.ssh/id_dsa)

И теперь я могу подключаться по ssh к другим серверам, не входя каждый раз в систему.


9
Если у вас нет файла ~ / .bashrc, просто создайте новый текстовый файл (блокнот или другой редактор) и добавьте две упомянутые строки starmonkey.
pbz

7
'~' относится к вашему "домашнему каталогу". В Windows это можно найти, открыв командную оболочку (cmd) и набрав «echo% USERPROFILE%».
Hawkeye Parker,

14
Для меня этот синтаксис не работает. eval $(ssh-agent)Вместо этого я должен был написать .
столкновение

1
Моя проблема заключалась в том, что мне нужно было указать файл для использования ssh-add. Вероятно, потому что у меня их несколько, и я не использовал имя по умолчанию. Примерssh-add ~/.ssh/myfile_rsa
синтаксическая ошибка

1
copy > ~/.bashrcв git bash, чтобы создать файл bashrc в Windows, игнорируйте ошибку
Рубен

61

В этом ответе объясняется, как обеспечить постоянное хранение имени пользователя и пароля GitHub, а не ключевой фразы SSH.

В Windows просто запустите

$ git config --global credential.helper wincred

Это означает, что в следующий раз, когда вы нажмете, вы будете вводить свое имя пользователя и пароль как обычно, но они будут сохранены в учетных данных Windows. После этого вам не придется вводить их снова.

Например, нажмите на GitHub, не вводя каждый раз имя пользователя и пароль (Git Bash в Windows) .


2
после этой команды вам нужно ввести свое имя пользователя и пароль.
Стивен Тун Аунг,

5
Относится ли это к SSH-ключам или только к аутентификации HTTPS (имя пользователя и пароль)? Вопрос, похоже, связан с использованием ключей SSH.
Шон

У меня отлично сработало, думаю, я использую аутентификацию HTTPS (имя пользователя и пароль).
Jonatan

Выполнение этого не дало никаких результатов.
user9993

@ user9993 Не будет. Это изменение конфигурации, поэтому, хотя никаких выходных данных не будет, gitизменится свое поведение в соответствии с набором директив конфигурации.
starbeamrainbowlabs

9

Я предпочитаю не вводить мою парольную фразу SSH при открытии новых терминалов; к сожалению , решение starmonkey требует, чтобы пароль вводился для каждой сессии. Вместо этого в моем .bash_profileфайле есть:

# Note: ~/.ssh/environment should not be used, as it
#       already has a different purpose in SSH.

env=~/.ssh/agent.env

# Note: Don't bother checking SSH_AGENT_PID. It's not used
#       by SSH itself, and it might even be incorrect
#       (for example, when using agent-forwarding over SSH).

agent_is_running() {
    if [ "$SSH_AUTH_SOCK" ]; then
        # ssh-add returns:
        #   0 = agent running, has keys
        #   1 = agent running, no keys
        #   2 = agent not running
        ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]
    else
        false
    fi
}

agent_has_keys() {
    ssh-add -l >/dev/null 2>&1
}

agent_load_env() {
    . "$env" >/dev/null
}

agent_start() {
    (umask 077; ssh-agent >"$env")
    . "$env" >/dev/null
}

if ! agent_is_running; then
    agent_load_env
fi

# If your keys are not stored in ~/.ssh/id_rsa or ~/.ssh/id_dsa, you'll need
# to paste the proper path after ssh-add
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

unset env

Это также запомнит мою парольную фразу для новых сеансов терминала; Мне нужно ввести его только один раз, когда я открываю свой первый терминал после загрузки.

Я хочу отдать должное, где я это взял; это модификация чужой работы, но я не могу вспомнить, откуда она взялась. Спасибо анонимному автору!

Обновление 2019-07-01: я не думаю, что все это необходимо. Теперь у меня это постоянно работает, гарантируя, что мой .bash_profileфайл запускает ssh-agent:

eval $(ssh-agent)

Затем я настроил такой sshфайл конфигурации:

touch ~/.ssh/config
chmod 600 ~/.ssh/config
echo 'AddKeysToAgent yes' >> ~/.ssh/config

Меня по-прежнему каждый раз просят ввести кодовую фразу.
Райан

1
@Ryan надеюсь, что только что добавленное обновление решит вашу проблему. Я обновляю информацию в блоге на conan.is/blogging/clojure-on-windows.html , и я сам задал тот же вопрос на stackoverflow.com/questions/52423626/…
Конан

Спасибо, я это проверю.
Райан

@Conan Обновленное решение работает за сеанс bash. После того, как я закрыл текущий сеанс bash и открыл новый, мне снова было предложено ввести пароль.
Tushar Raj

5

Если я правильно понял вопрос, вы уже используете авторизованный ключ SSH в службе сборки, но не хотите вводить кодовую фразу для каждого клона?

Я могу придумать два способа сделать это:

  1. Если ваша служба сборки запускается в интерактивном режиме: перед запуском службы сборки начните ssh-agentс достаточно долгого тайм-аута ( -tопция). Затем используйте ssh-add(они должны быть в msysGit), чтобы добавить все необходимые закрытые ключи, прежде чем запускать службу сборки. Вам все равно придется вводить все парольные фразы, но только один раз за запуск службы.

  2. Если вы не хотите вообще вводить парольные фразы, вы всегда можете удалить парольные фразы из ключей SSH, как описано в /server/50775/how-do-i-change-my- private-key-passphrase , задав новую пустую парольную фразу. Это должно полностью избавить от запроса пароля, но это даже менее безопасно, чем предыдущий вариант.


Спасибо за 2-й вариант, он мне был нужен.
Станислав Вержиковский 05

1

Когда я попытался отправить свой код, я получил следующую ошибку:

$ git push origin dev

remote: Too many invalid password attempts. Try logging in through the website with your password.
fatal: unable to access 'https://naushadqamar-1@bitbucket.org/xxxx/xxxx-api.git/': The requested URL returned error: 403

После нескольких часов исследований я обнаружил, что мне нужно использовать следующую команду:

$ git config --global credential.helper cache

После выполнения указанной выше команды я получил приглашение ввести имя пользователя и пароль GitHub. После предоставления правильных учетных данных я могу отправить свой код.


Это только что сгенерированный «git: 'credential-cache' не является командой git». Однако «git config --global credential.helper store» работал - возможно, это не лучший вариант, но я вынужден использовать HTTPS, а не предпочитаемый мной SSH, и просто хочу, чтобы он работал.
Терри Браун

0

Правильное решение:

  1. Запустите терминал Windows по умолчанию - cmd и получите каталог вашего основного профиля

    echo %USERPROFILE%
    
  2. Запустите Git Bash в каталоге выше и создайте .bashrcфайл с помощью команды

    echo "" > .bashrc
    
  3. Откройте .bashrcфайл в своем любимом текстовом редакторе и вставьте в него код из справки GitHub :

    env=~/.ssh/agent.env
    ...
    COPY WHOLE CODE FROM URL - I can't add it to Stack Overflow because it breaks layout... OMG!
    
  4. Перезапустите Git Bash, и он попросит вас ввести пароль (только в первый раз) и готово. Пароль снова не беспокоил.


-1

Вам необходимо создать authorized_keysфайл в .sshпапке пользователя, под которым вы собираетесь подключиться к серверу репозитория. Например, если вы используете имя пользователя buildserviceна repo.serverвы можете запустить:

cd ~buidservice
mkdir ./ssh
cat id_rsa.pub >> .ssh/authorized_keys

Затем вы должны проверить следующее:

  1. Соответствующий id_rsaзакрытый ключ представлен в формате builservice@build.server:~/.shh/id_rsa.

  2. Этот отпечаток repo.server хранится в buildservice@build.server:~/.ssh/known_hostsфайле. Обычно это делается после первой попытки sshподключения к repo.server.


Забываю сказать. Под Windows ваш домашний каталог, вероятно, будет C: \ Users \ Username
beduin

5
Ммм .. В Git bash есть все, читайте внимательнее заголовок вопроса. Также из вопроса я предположил, что пара ключей уже была сгенерирована (потому что спросили, как заставить сервер репо запоминать id_rsa.pub.) Извините за форматирование.
бедуин

1
Хорошо, никогда раньше не слышал о git bash. Извините за это
sehe

Я предполагаю, что это использует msysgit. Добавляю тег.
Адам Димитрук

3
Предупреждение! Использование cat id_rsa.pub > .ssh/authorized_keysперезапишет все существующие авторизованные ключи. Используйте >>для добавления вместо перезаписи.
Давид Парссон,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.