Почему git не может запомнить мою кодовую фразу под Windows

145

Я только начал использовать git, и я не могу заставить его запомнить мою кодовую фразу. Я использую cmd.exe с повышенными правами, а мой хост git - github, и я создал ssh-ключ, как это руководство на github

но я все еще получаю

*\subnus.mvc>git push origin master
Enter passphrase for key '/c/Users/Subnus/.ssh/id_rsa':
Nesizer
источник
Я сам не использовал msysgit, но агент аутентификации pageant может оказаться полезным.
Cebjyre
1
Я перепробовал все, а потом обнаружил, что это сработало.
Blake Niemyjski
1
Windows 10 уже некоторое время поставляется с OpenSSH. Включите службу ssh-agent, используйте ssh-add, чтобы добавить свой ключ в хранилище ssh, и установить GIT_SSHв своей среде (при необходимости), и git / ssh запомнит вашу парольную фразу через ssh-agent. См. Мой ответ ниже для получения более подробных инструкций.
d3r3kk
1
2019, только что установил git в Windows 10, и git один раз запрашивает пароль и запоминает его.
Жан-Франсуа Фабр
@ Jean-FrançoisFabre Возможно, вы не используете OpenSSL.
RoadRunner

Ответы:

208

Я понимаю, что этот вопрос возникает два года назад, но у меня была такая же проблема, и несколько ответов здесь не полностью ответили на вопрос для меня. Вот два пошаговых решения, в зависимости от того, используете ли вы TortoiseGit в дополнение к msysgit или нет.

Первое решение Предполагает Windows, msysgit и PuTTY.

  1. Установите msysgit и PuTTY в соответствии с инструкциями.
  2. (Необязательно) Добавьте PuTTY в свой путь. (Если вы этого не сделаете, то любые ссылки на команды PuTTY ниже должны начинаться с префикса с полным путем к соответствующему исполняемому файлу.)
  3. Если вы еще этого не сделали, сгенерируйте хеш ключа в соответствии с инструкциями на GitHub или в соответствии с инструкциями вашего хоста Git.
  4. Опять же, если вы еще этого не сделали, преобразуйте свой ключ для использования с PuTTY pageant.exe с помощью puttygen.exe . Инструкции находятся в документации PuTTY, в этом полезном руководстве и в нескольких других местах в киберпространстве.
  5. Запустите pageant.exe PuTTY , откройте ваш .ppk файл («Добавить ключ») и укажите кодовую фразу для вашего ключа.
  6. Откройте диалоговое окно переменных среды Windows (щелкните правой кнопкой мыши «Компьютер», щелкните «Свойства», щелкните «Дополнительные параметры системы» или вкладку «Дополнительно», щелкните «Переменные среды»). Добавьте следующую переменную среды:

    GIT_SSH = C: \ полный \ путь \ к \ plink.exe

    Замените «C: \ full \ path \ to» на полный путь установки к PuTTY, где находится plink.exe. Вероятно, лучше всего добавить его в раздел «Пользовательские переменные». Также убедитесь, что путь, который вы используете для plink.exe, совпадает с путем, который вы используете для Pageant (pageant.exe). В некоторых случаях у вас может быть несколько установок PuTTY, потому что он может быть установлен вместе с другими приложениями. Использование plink.exe из одной установки и pageant.exe из другой, скорее всего, вызовет у вас проблемы.

  7. Откройте командную строку.

  8. Если вы пытаетесь подключиться к репозиторию git, размещенному на Github.com, выполните следующую команду:

    plink.exe git@github.com

    Если репозиторий git, к которому вы пытаетесь подключиться, размещен в другом месте, замените git@github.com соответствующим именем пользователя и URL-адресом. (Предполагается, что Github) Вы должны быть проинформированы о том, что ключ хоста сервера не кэшируется, и спросить, доверяете ли вы ему. Ответьте y . Это добавит ключ хоста сервера в список известных хостов PuTTY. Без этого шага команды git не будут работать должным образом. После нажатия клавиши ввода Github сообщает вам, что Github не предоставляет доступ к оболочке. Ничего страшного ... нам это не нужно. (Если вы подключаетесь к какому-либо другому хосту, и он дает вам доступ к оболочке, вероятно, лучше разорвать связь, не делая ничего другого.)

  9. Все сделано! Команды Git теперь должны работать из командной строки. Вы можете захотеть, чтобы pageant.exe загружал ваш .ppk файл автоматически во время загрузки , в зависимости от того, как часто он вам понадобится.

Второе решение предполагает Windows, msysgit и TortoiseGit.

TortoiseGit поставляется с исполняемыми файлами PuTTY и специально модифицированной версией plink (называемой TortoisePlink.exe), которая упрощает работу.

  1. Установите msysgit и TortoiseGit в соответствии с инструкциями.
  2. Если вы еще этого не сделали, сгенерируйте хеш ключа в соответствии с инструкциями на GitHub или в соответствии с инструкциями вашего хоста Git.
  3. Опять же , если вы еще не сделали этого, конвертировать ключ для использования с pageant.exe TortoiseGit, используя TortoiseGit в puttygen.exe . Инструкции находятся в документации PuTTY, в полезном руководстве, на которое есть ссылка в первом решении, и в нескольких других местах в киберпространстве.
  4. Запустите файл pageant.exe TortoiseGit , откройте ваш .ppk файл («Добавить ключ») и укажите кодовую фразу для вашего ключа.
  5. Откройте диалоговое окно переменных среды Windows (щелкните правой кнопкой мыши «Компьютер», щелкните «Свойства», щелкните «Дополнительные параметры системы» или вкладку «Дополнительно», щелкните «Переменные среды»). Добавьте следующую переменную среды:

    GIT_SSH = C: \ полный \ путь \ к \ TortoisePlink.exe

    Замените «C: \ full \ path \ to» на полный путь установки TortoiseGit, где находится TortoisePlink.exe. Вероятно, лучше всего добавить его в раздел «Пользовательские переменные». Также убедитесь, что путь, который вы используете к TortoisePlink.exe, совпадает с путем, который вы используете для Pageant (pageant.exe). В некоторых случаях у вас может быть несколько установок PuTTY, потому что он может быть установлен вместе с другими приложениями. Использование TortoisePlink.exe из установки TortoiseGit и pageant.exe из другой установки другого приложения (или из автономной установки PuTTY), скорее всего, вызовет у вас проблемы.

  6. Все сделано! Команды Git теперь должны работать из командной строки. В первый раз, когда вы попытаетесь подключиться к своему репозиторию git, вы, вероятно, узнаете, что ключ хоста сервера не кэширован, и спросите, доверяете ли вы серверу. Щелкните «Да». (Это TortoisePlink.exe в действии.)

    Вы можете захотеть, чтобы pageant.exe автоматически загружал ваш .ppk файл во время загрузки , в зависимости от того, как часто он вам понадобится.

Третье решение предполагает наличие окна, msysgit и собственной командной строки.

  1. Установить msysgit
  2. Обязательно разрешите использование git в командной строке MS-DOS
  3. Бегать start-ssh-agent
  4. Введите парольные фразы SSH
  5. Все сделано! Команды Git теперь должны работать в собственной командной строке.
Мэтт Кларксон
источник
3
Если у вас есть и GitExtensions, и TortoiseGit, каждый из которых имеет свою собственную версию шпатлевки, убедитесь, что вы установили в переменной среды GIT_SSH путь к ссылке для конкурса, который вы фактически используете.
shovavnik
15
На всякий случай, если кто-то еще столкнется с этой глупой ошибкой: убедитесь, что вы используете формат удаленного URL-адреса SSH (git @ host: accountname / reponame.git), а не URL-адрес HTTPS, иначе он будет продолжать запрашивать этот пароль ...
dain
Когда я запускаю plink.exe git@github.com, я получаю «ФАТАЛЬНАЯ ОШИБКА: сервер неожиданно закрыл сетевое соединение»
Бретт
4
Примечание: третий метод был Третий передан в msysgit, поэтому вы можете просто ввести start-ssh-agentв командной строке, чтобы он сохранил парольную фразу SSH.
Мэтт Кларксон
6
Третье решение работает только до тех пор, пока командная строка не будет закрыта, и только для этой командной строки - все остальные CMD по-прежнему запрашивают кодовую фразу. Также все другие клиенты (VS, VS Code) не могут взаимодействовать с удаленным git.
Дима
31

Каждый раз, когда я настраиваю новый рабочий стол, я забываю эти инструкции, поэтому добавляю сюда еще один ответ, поскольку натыкаюсь на него одинаково часто!


Быстрые шаги для таких же нетерпеливых пользователей, как я

  1. Включите OpenSSH Authentication Agentслужбу и заставьте ее запускаться автоматически.
  2. Добавьте свой SSH-ключ к агенту с помощью ssh-addв командной строке.
  3. Протестируйте интеграцию с git, если он все еще запрашивает вашу парольную фразу, продолжайте.
  4. Добавьте переменную среды $ENV:GIT_SSH=C:\Windows\System32\OpenSSH\ssh.exeв сеанс или навсегда в пользовательскую среду.

Подробные шаги: обзор

Windows уже некоторое время поставляется с OpenSSH. Он включает в себя все необходимые биты для работы ssh вместе с Git, но, похоже, ему все еще требуется некоторый TLC, прежде чем он будет работать на 100% безупречно. Вот шаги, которые я успешно выполнил в версии Windows 10.0.18362.449 (вы можете увидеть свою версию Windows 10, открыв оболочку cmd.exe и набрав ver).

Я предполагаю, что у вас уже есть настройка ключа SSH, и он находится по адресу ~/.ssh/id_rsa

Включите службу ssh-agent на вашем компьютере с Windows 10.

  1. Пуск-> Введите «Службы» и щелкните появившееся приложение «Службы».
  2. Найди OpenSSH Authentication Agent услугу в списке.
  3. Щелкните правой кнопкой мыши OpenSSH Authentication Agent службу и выберите «Свойства».
  4. Изменение Startup type:ToAutomatic .
  5. Нажмите Startкнопку, чтобы изменить статус службы наRunning .
  6. Закройте диалоговое окно, щелкнув OK, и закройте приложение «Службы».

Добавьте свой ключ в ssh-agent

  1. Откройте предпочтительную оболочку (в этом примере я буду использовать Windows Powershell, применимо и к Powershell Core) .
  2. Добавьте свой SSH-ключ в ssh-agent: ssh-add (вы можете добавить путь к вашему ключу в качестве первого аргумента, если он отличается от значения по умолчанию) .
  3. Введите кодовую фразу, если / когда будет предложено это сделать.

Попробуйте Git + SSH

  1. Откройте оболочку (опять же, я использую Powershell) и клонируйте репо.git clone git@github.com:octocat/Spoon-Knife
  2. Если вы видите это приглашение, перейдите к следующему разделу:
Enter passphrase for key '/c/Users/your_user_name/.ssh/id_rsa':

Задайте GIT_SSHпеременную среды

В любом сеансе вы можете просто установить эту переменную среды, и запрос вашей парольной фразы перестанет появляться, а ssh будет использовать ssh-agent от вашего имени. В качестве альтернативы вы можете навсегда установить парольную фразу в среду своего пользователя.

Чтобы установить только GIT_SSHв текущей оболочке:

  1. Откройте оболочку предпочтений. (Powershell для меня)
  2. Задайте для переменной среды GIT_SSH соответствующее значение ssh.exe:$Env:GIT_SSH=$((Get-Command -Name ssh).Source)
  3. Повторите шаги, описанные выше в Попробовать Git + SSH .

Установить GIT_SSHнавсегда

  1. Откройте проводник. Пуск-> введите «Проводник» и щелкните его в списке.
  2. Щелкните правой кнопкой мыши «Этот компьютер» и выберите «Свойства».
  3. Щелкните «Расширенные настройки системы».
  4. Нажмите кнопку «Переменные среды ...».
  5. В разделе "Пользовательские переменные для your_user_name" нажмите New ...
  6. Установить Variable name:поле в GIT_SSH
  7. Установите в Variable value:поле значение path-to-ssh.exe (обычно C:\Windows\System32\OpenSSH\ssh.exe).
  8. Нажмите ОК, чтобы закрыть диалоговое окно «Новая пользовательская переменная».
  9. Щелкните OK, чтобы закрыть диалоговое окно Environment Variables.
  10. Повторите шаги, описанные выше в Попробовать Git + SSH .

Обратите внимание, что это, вероятно, изменится с появлением новых шагов / процедур по мере развития Windows 10 и по мере того, как я узнаю больше. Я постараюсь обновлять это, жду отзывов в комментариях.

d3r3kk
источник
3
Это наиболее полный ответ на 31.01.2020, по крайней мере, для Windows. Нет необходимости устанавливать PUTTY или что-то еще.
Джейк
Согласовано. Похоже, наконец-то появилась встроенная поддержка.
Эрон Ллойд,
Легенда! Это решило мою проблему. Некоторое время искал решение, пробовал разные вещи, и это, несомненно, наиболее полное решение этой проблемы
Коллин,
Спасибо за хороший ответ, который сэкономил мне, скорее всего, несколько часов возни. +1
Angry 84
Спасибо за это! Единственное, чего мне не хватало, это переменная окружения. Я не мог понять, почему это работает, и я мог ssh-add без ошибок, и агент работал, но он не запомнил мои учетные данные!
trnelson,
23

Если вы используете Git bash под Windows, вы можете выполнить следующее:

eval `ssh-agent -s`
ssh-add ~/.ssh/*_rsa

он запросит кодовую фразу во второй команде, и все. Каждое дополнительное действие, которое вам нужно будет выполнить (которое когда-то требовало парольной фразы), не будет запрашивать у вас парольную фразу (см. Пример на снимке экрана ниже):

добавление парольной фразы в Git bash в Windows

Гай Авраам
источник
2
Это также работает в подсистеме Ubuntu в Windows 10.
Встреча
1
обратите внимание, что если ваша пара ключей находится в другом месте, вы можете заменить ~ / .ssh / * _ rsa на путь к файлу * .pem
alex_danielssen
20

Для тех, кому нужны более подробные инструкции, см. Эту страницу: http://help.github.com/working-with-key-passphrases/

Франц
источник
Именно то, что мне нужно для использования msysgitоболочки.
arthurakay 03
1
Работал у меня при использовании настольного приложения Git Bash. Я использовал notepad ~/.profileи скопировал, вставил контент по этой ссылке, перезапустил Git Bash, ввел свой пароль, получил прибыль ...
Дарин
Я следил за разделом «Автозапуск ssh-agent в Git для Windows» (используя git 2.x в Win 10), но он все время спрашивал у меня пароль все время. Следующее первое решение (замазка) из принятого ответа исправило это для меня.
jakub.g 02
13

Одно дополнительное решение через 5 лет, 8 месяцев и 6 дней после публикации вопроса было бы неплохой идеей.

ПРИМЕЧАНИЕ. Предполагается, что вы используете компьютер с Windows.

  1. Загрузите git-credential-winstore .
  2. Запустить его! Если у вас есть GIT в PATHпеременной окружения, он должен работать. Если нет, беги git-credential-winstore -i C:\Path\To\Git.exe.

В следующий раз, когда вы попытаетесь выполнить фиксацию в репозитории, вам будет предложено ввести свои учетные данные. Так и должно быть. У вас больше не будут спрашивать ваши учетные данные, пока вы не измените свой пароль.


Просто для вашего сведения ... ваши учетные данные хранятся в хранилище учетных данных Windows

Где вы храните мои учетные данные?

Это приложение просто использует существующее хранилище учетных данных Windows для хранения ваших учетных данных. Вы можете увидеть сохраненные учетные данные, перейдя в Панель управления> Учетные записи пользователей> Диспетчер учетных данных и выбрав «Учетные данные Windows». Записи, начинающиеся с «git:», взяты из git-credential-winstore.

Алекс Эссильфи
источник
8
Это решение, похоже, не работает с репозиториями SSH, только с HTTPS. / angryface
JasonCoder
8

Если вы установили пароль для ключевого файла, вам всегда нужно будет вводить этот пароль при подключении. Если вы создадите ключ без пароля, вам не придется каждый раз вводить его, однако любой, у кого есть доступ к вашему ключевому файлу, теперь может подключиться к вашей учетной записи github.

ssh-agent также может работать. Попробуйте запустить его и посмотрите, запомнит ли он вашу кодовую фразу.

Грант Лимберг
источник
выполнение ssh-keygen -pдолжно позволить OP не устанавливать кодовую фразу
luchosrock
Все еще запрашивает пароль.
стихи
7

[edit - неправильно прочитал вопрос, это ответ на связанную проблему. оставив перефразированную версию для потомков]

В моем случае я пытался отправить репо, размещенное на одном из наших серверов. Всякий раз, когда я пытался выполнить push, git запрашивал у меня мой пароль (nb - пароль, а не кодовую фразу для моего закрытого ключа).

Добавив свой открытый ключ к авторизованным ключам на сервере, я смог получать запросы на этот сервер без пароля. И поскольку на моем закрытом ключе не было кодовой фразы (что, кстати, плохая практика!), Мне вообще не нужно было ничего вводить.

Вот команда для добавления вашего открытого ключа на сервер. Предполагается, что пользователь gitявляется пользователем сервера.

cat .ssh/id_rsa.pub | ssh git@GIT_MASTER_IP 'cat >> .ssh/authorized_keys'

Вы можете добиться того же, войдя на сервер и вручную добавив свой открытый ключ в файл по адресу ~/.ssh/authorized_keys

hwjp
источник
Не могли бы вы преобразовать это в описание, пригодное для использования кем-то, у кого нет доступа к оболочке? Например, что мы должны ввести в authorized_keys с помощью блокнота или подобного?
John Little
4

Я понимаю, что это запоздало на несколько лет, но я наткнулся на этот вопрос, пытаясь найти его решение, и нашел что-то, что подходит для всех уровней знаний, поэтому я подумал, что поделюсь.

GitHub предоставляет очень полезный установщик, который все упрощает и упрощает: https://help.github.com/articles/caching-your-github-password-in-git/

Roobeedeedada
источник
Обратите внимание, что это кеширует ваш пароль GitHub , а не ключевую фразу GPG.
Judge2020
4

Предположим, вы хотите использовать чистый Git Bash решение без использования TortoiseGit или PuTTY. Кроме того, вы не хотите постоянно хранить свои парольные фразы, поскольку это почти то же самое, как если бы вы изначально сгенерировали свой SSH-ключ без ключевой фразы. Но вы все равно хотите использовать кеширование.

Для кеширования используется ssh-agentпроцесс, который включен в дистрибутив Git Bash. По умолчанию этот процесс не запускается, поэтому его нужно запустить в первую очередь. Для кэширования любых ключей SSH их следует добавить в этот процесс с помощьюssh-add команды, которая предложит вам ключевую фразу и сохранить ее в памяти.

Недостатки других решений:

  • При автоматическом запуске, ssh-agentкак в статье GitHub, пароль запрашивается с самого начала, когда вы запускаете Git Bash, независимо от того, нужно ли вам использовать свой SSH-ключ в этом сеансе или нет. Если вы сегодня работаете со своим локальным репо, вы, вероятно, захотите предоставить парольную фразу только тогда, когда это действительно необходимо (например, при взаимодействии с удаленным репо).
  • Если вы запускаете ssh-agentлайк в статье GitLab,eval $(ssh-agent -s) вероятно, вы устали вводить это каждый раз. Скорее всего, в конечном итоге вы добавили эти две строки в свой.bashrc конфигурацию для автоматического запуска. Недостатки те же, что и выше, плюс еще один: каждый раз, когда вы запускаете новый терминал Git Bash, вы получаете дополнительный процесс ssh-agent (сценарий bash GitHub проверяет, запущен ли этот процесс).
  • Подобно двум вышеупомянутым, но особенно когда у вас есть отдельные ключи SSH для разных хостов, например, один для GitHub, а другой для GitLab, поэтому предоставление их всех одновременно раздражает и неудобно.

Итак, это решение для тех, кто задается вопросом, как заставить Git Bash запрашивать кодовую фразу только один раз за сеанс Windows и только тогда, когда это действительно необходимо. Это похоже на поведение управления паролями в GnuPG. автоматическое подписание с использованием default-cache-ttl.

Настройка SSH для однократного запроса парольной фразы при необходимости только с использованием Git Bash

  1. Во-первых, мы хотим, чтобы ssh-agentпри запуске оболочки Git Bash автоматически запускался . Для этого мы будем использовать модифицированный скрипт GitHub , поскольку он проверяет, запущен ли уже процесс, но мы не хотим, чтобы он ssh-addсразу запускал ключи. Этот скрипт переходит в ваш ~/.bashrcили ~/.profileили ~/.bash_profile( ~это домашний каталог вашего пользователя, например C:\Users\Username- запустите, cd ~а затем pwdGit Bash распечатает его):

    ### Start ssh-agent
    
    env=~/.ssh/agent.env
    
    agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
    
    agent_start () {
        (umask 077; ssh-agent >| "$env")  # use -t here for timeout
        . "$env" >| /dev/null ; }
    
    agent_load_env
    
    # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
    agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
    
    if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
        agent_start
    fi
    
    unset env
    
  2. Теперь отредактируйте или создайте ~/.ssh/configфайл и добавьте AddKeysToAgentпараметр для каждого раздела хоста, который вы хотите включить кеширование (вы также можете включить его глобально, поместив директиву в начало файла перед всеми объявлениями хоста):

    # GitHub.com
    Host github.com
      Preferredauthentications publickey
      IdentityFile ~/.ssh/id_ed25519_github
      AddKeysToAgent yes
    
    # GitLab.com
    Host gitlab.com
      Preferredauthentications publickey
      IdentityFile ~/.ssh/id_ed25519_gitlab
      AddKeysToAgent yes
    

    Из справочной страницы конфигурации ssh : если для этого параметра задано значение yes и ключ загружается из файла, ключ и его кодовая фраза добавляются к агенту со временем жизни по умолчанию, как если бы с помощью ssh-add (1).

Максимальное время жизни по умолчанию - вечно или до тех пор, пока ssh-agentпроцесс не будет убит (вручную из диспетчера задач или когда ваш компьютер выключен). Если вы хотите использовать конечный тайм-аут, вы можете установить его с помощью параметра ssh-agent -t. Измените строку в сценарии bash из первого шага выше, например, на 30 минут жизни ключевого кеша:

(umask 077; ssh-agent -t 30m >| "$env")

См. Здесь другие квалификаторы формата времени.

Николай Котляров
источник
3

Вы можете создать .bashrcфайл в домашнем каталоге вашего пользователя, например C:/Users/youruser, и поместить туда:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

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

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

Этот скрипт выполняется каждый раз после запуска bash. Таким образом, вам нужно будет ввести пароль только один раз при git-bashзапуске!

Некоторым версиям bash .bash_profileвместо этого требуется файл .bashrc, поэтому на всякий случай clone .bashrc:

copy .bashrc .bash_profile
Александр Гончаров
источник
1

можете попробовать добавить -k arg, когда вы это сделаете;

ssh-add -k ~/.ssh/id_rsa
тарикакьол
источник