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

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


person D.Giunchi    schedule 20.04.2011    source источник


Ответы (7)


Для пользователей 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 без входа в систему каждый раз.

person starmonkey    schedule 25.01.2012
comment
Это :) Спасибо. Не знал о .bashrc. - person Ry-♦; 26.01.2012
comment
Если у вас нет файла ~/.bashrc, просто создайте новый текстовый файл (блокнот или какой-либо другой редактор) и добавьте две упомянутые строки starmonkey. - person pbz; 27.04.2012
comment
'~' относится к вашему домашнему каталогу. В Windows вы можете найти это, открыв командную оболочку (cmd) и набрав echo %USERPROFILE%. - person Hawkeye Parker; 29.08.2012
comment
Для меня этот синтаксис не работает. Вместо этого мне пришлось написать eval $(ssh-agent). - person clash; 27.01.2014
comment
Все в порядке, но теперь мне нужно вводить свою парольную фразу + каждую команду git, которую я должен вводить пароль для подключения к оболочке сервера. В общем - не работает. - person versedi; 28.04.2015
comment
Моя проблема заключалась в том, что мне нужно было указать файл для использования ssh-add. Вероятно, потому что у меня их несколько, и я не использовал имя по умолчанию. Пример ssh-add ~/.ssh/myfile_rsa - person Syntax Error; 30.06.2015
comment
Работает отлично. Используя комментарий @versedi, я смог добавить несколько ключей, добавив несколько строк ssh-add /<drive_letter>/path/to/mykey_rsa. - person gligoran; 13.10.2015
comment
Ницца ! Некоторое время я искал, чтобы кэшировать свою парольную фразу в Windows, теперь это сделано, THX :) - person altore; 14.10.2015
comment
Это не сработало для меня. Я выбрал маршрут, аналогичный clash, и использовал eval $('ssh-agent'), затем ssh-add, затем дал ему свой пароль, и теперь меня больше не спрашивают мой пароль. - person Rockin4Life33; 14.05.2016
comment
Не работает для меня. Ответ Стивена Тун Аунга на использование credential.helper wincred действительно работает. - person Michael Freidgeim; 19.11.2016
comment
copy > ~/.bashrc в git bash для создания файла bashrc в Windows, игнорируйте ошибку - person Ruben; 30.05.2017
comment
Инструкции отлично работают для меня в Windows 7 и git bash. Единственная деталь, мне нужно было изменить файл bash.bashrc в каталоге установки - в моем случае C:\Program Files\Git\etc\bash.bashrc - person Dimitar Ivanov; 23.08.2018
comment
Не уверен, что есть возможность сохранить парольные фразы после выхода/повторного открытия git bash (Windows 10). Существует множество руководств по ключу SSH, но никто не разрешает парольные фразы, которые все еще спрашивают каждый раз, когда вы открываете git bash, это довольно раздражает. - person Loc_rabbirt; 05.01.2021

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

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

$ git config --global credential.helper wincred

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

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

person Stephen Tun Aung    schedule 07.12.2015
comment
после этой команды вам нужно ввести имя пользователя и пароль. - person Stephen Tun Aung; 15.02.2016
comment
Относится ли это к ключам SSH или только к аутентификации HTTPS (имя пользователя и пароль)? Похоже, вопрос касается использования ключей SSH. - person Sean; 02.05.2016
comment
У меня сработало отлично, я думаю, я использую аутентификацию HTTPS (имя пользователя и пароль). - person Jonatan; 11.07.2016
comment
Запуск этого не дал никакого результата. - person user9993; 18.05.2017
comment
@ user9993 Не будет. Это изменение конфигурации, поэтому, хотя вывод не производится, git изменит свое поведение в соответствии с набором директив конфигурации. - person starbeamrainbowlabs; 31.07.2017

Я предпочитаю не вводить свою парольную фразу 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
person Conan    schedule 02.11.2016
comment
Меня до сих пор каждый раз спрашивают пароль. - person Ryan; 20.01.2017
comment
@Ryan, надеюсь, обновление, которое я только что добавил, решит вашу проблему. Я обновляю информацию в блоге по адресу conan.is/blogging/clojure- on-windows.html, и я сам задал тот же вопрос по адресу stackoverflow.com/questions/52423626/ - person Conan; 07.01.2019
comment
@Conan Обновленное решение работает для каждого сеанса bash. После того, как я закрыл запущенный сеанс bash и открыл новый, мне снова было предложено ввести пароль. - person Tushar Raj; 07.02.2019

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

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

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

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

person millimoose    schedule 15.05.2011
comment
Спасибо за второй вариант, он мне нужен. - person Stanislav Verjikovskiy; 05.12.2014

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

$ git push origin dev

remote: Too many invalid password attempts. Try logging in through the website with your password.
fatal: unable to access 'https://[email protected]/xxxx/xxxx-api.git/': The requested URL returned error: 403

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

$ git config --global credential.helper cache

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

person Naushad Qamar    schedule 02.04.2017
comment
Это только что сгенерированное git: 'credential-cache' не является командой git. Однако сработало хранилище git config --global credential.helper - возможно, это не самое лучшее, но я вынужден использовать HTTPS, а не предпочитаемый мной SSH, и просто хочу, чтобы он работал. - person Terry Brown; 30.05.2018

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

  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, он запросит ваш пароль (только в первый раз) и готово. Пароль снова не беспокоит.

person Manic Depression    schedule 22.07.2018

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

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

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

  1. Этот соответствующий закрытый ключ id_rsa представлен в [email protected]:~/.shh/id_rsa.

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

person beduin    schedule 20.04.2011
comment
Я забыл сказать. В Windows ваш домашний каталог, вероятно, будет C:\Users\Username - person beduin; 20.04.2011
comment
Ммм .. В Git bash есть все, прочитайте внимательнее заголовок вопроса. Также из вопроса я предположил, что пара ключей уже сгенерирована (потому что был задан вопрос, как заставить сервер репо запомнить id_rsa.pub.) Извините за форматирование. - person beduin; 20.04.2011
comment
Хорошо, никогда раньше не слышал о «git bash». Прости за это - person sehe; 20.04.2011
comment
Я предполагаю, что это использует msysgit. Я добавляю тег. - person Adam Dymitruk; 21.04.2011
comment
Предупреждение! Использование cat id_rsa.pub > .ssh/authorized_keys перезапишет все существующие авторизованные ключи. Используйте >> для добавления вместо перезаписи. - person David Pärsson; 23.10.2016