Як запобігти введенню пароля для розшифровки приватного ключа щоразу під час використання 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%".
Хокі Паркер

14
Для мене цей синтаксис не працює. Мені довелося писати eval $(ssh-agent)замість цього.
зіткнення

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

1
copy > ~/.bashrcв git bash, щоб створити файл bashrc у Windows, ігноруйте помилку
Ruben

61

Ця відповідь пояснює, як отримати постійне збереження імені користувача та пароля GitHub, а не парольну фразу ключа SSH.

У Windows просто запустіть

$ git config --global credential.helper wincred

Це означає, що наступного разу, коли ви натиснете, ви введете своє ім’я користувача та пароль, як зазвичай, але вони будуть збережені в облікових даних Windows. Після цього вам більше не доведеться вводити їх.

Як і раніше, натисніть на GitHub, не вводячи кожного разу ім’я користувача та пароль (Git Bash для Windows) .


2
після цієї команди потрібно ввести своє ім’я користувача та пароль.
Стівен Тун Аун

5
Чи стосується це ключів SSH або лише автентифікації HTTPS (ім’я користувача та пароль)? Здається, питання стосується використання ключів SSH.
Шон

Я працював ідеально для мене, я думаю, я використовую аутентифікацію HTTPS (ім’я користувача та пароль).
Джонатан

Запуск цього не дав жодного результату.
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-агент:

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 і відкрив новий, мені знову запропонували ввести пароль.
Тушар Радж

5

Якщо я правильно розумію питання, ви вже використовуєте авторизований ключ SSH в службі збірки, але ви хочете уникнути необхідності вводити пароль для кожного клону?

Я можу придумати два способи цього:

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

  2. Якщо ви хочете взагалі не вводити парольні фрази, ви завжди можете видалити фрази з ключів SSH, як це описано в /server/50775/how-do-i-change-my- приватний ключ-пароль , встановивши порожню нову фразу. Це має повністю усунути підказку пароля, але це навіть менш безпечно, ніж попередній варіант.


Дякую за другий варіант, мені це було потрібно.
Станіслав Вержиковський

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: 'poverIVE-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 \ Ім'я користувача
beduin

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

1
Гаразд, ніколи раніше не чув про "git bash". До жаль щодо цього
sehe

Я припускаю, що для цього використовується msysgit. Я додаю тег.
Адам Дімітрук

3
Увага! Використання cat id_rsa.pub > .ssh/authorized_keysперезаписує всі існуючі дозволені ключі. Використовуйте >>для додавання замість перезапису.
David Pärsson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.