Запуск агента SSH при запуске Git Bash в Windows

152

Я использую Git Bash. Я должен использовать

eval `ssh-agent.exe`
ssh-add /my/ssh/location/

каждый раз, когда я начинаю новый git bash.

Есть ли способ установить агент SSH навсегда? Или Windows имеет хороший способ управления ключами SSH?

Я новый парень, пожалуйста, дайте мне подробное руководство, спасибо!

zchholmes
источник
3
это /my/ssh/location/equalivent к чему - то вроде /c/Users/Foobar/.ssh/?
Ник
Похожая проблема была размещена по адресу superuser.com/q/1238486/478378, и теперь она решена. Следующая таблица содержит все подробности gist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d . Спасибо.
Джинеш Гоэль,

Ответы:

138

В мерзавец Баш сессии, вы можете добавить сценарий ~/.profileили ~/.bashrc( с ~будучи обычно устанавливается%USERPROFILE% ), для того , чтобы упомянутой сессии запуска автоматически ssh-agent. Если файл не существует, просто создайте его.

Это то, что GitHub описывает в « Работа с ключевыми словами SSH ».

Раздел « Автоматический запуск ssh-agent в Git для Windows » этой статьи содержит надежный скрипт, который проверяет, работает агент или нет. Ниже приведен фрагмент кода, смотрите статью GitHub для полного решения.

# This is just a snippet. See the article above.
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

Другие источники:

« Получение ssh-agent для работы с git run из командной оболочки Windows » имеет похожий сценарий, но я бы прежде всего обратился к статье GitHub, которая является более надежной и актуальной.

VonC
источник
Одно небольшое раздражение, которое у меня было, было то, что если бы я знал, что не собираюсь использовать git, я не буду вводить ключевую фразу ssh-ключа, то каждая открытая оболочка снова запрашивает его. Это состояние 1, агент работает без ключа, поэтому вы можете удалить ssh-add из этого раздела, тогда, если вы не введете свою фразу-пароль с первого раза, вас больше не спросят, пока вы не запустите ssh-add вручную.
Andy2K11
@Gordon Какая часть этой help.github.com/articles/working-with-ssh-key-passphrases ссылки на GitHub изменилась? Его содержание все еще там, и все еще кажется уместным для этого ответа.
VonC
1
@ Andy2K11 Если вы хотите ввести ключевую фразу в первый раз, когда она вам нужна, а не при открытии оболочки, самый чистый способ для меня - удалить ssh-add из .bash_profile, как вы упомянули, и добавить «AddKeysToAgent yes» в Ваш файл .ssh / config (см. этот ответ: superuser.com/a/1114257/523133 ). Таким образом, вам даже не нужно запоминать запуск ssh-add.
Hardsetting
30

PS: Эти инструкции относятся к оболочке Bash, открытой в Windows 10 Linux Subsystem и не упоминают о символьных ссылках SSH-ключей, сгенерированных в Windows с помощью Bash в Ubuntu в Windows

1) Обновите ваш .bashrc , добавив в него следующее

# Set up ssh-agent
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initializing new SSH agent..."
    touch $SSH_ENV
    chmod 600 "${SSH_ENV}"
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' >> "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add
}

# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    kill -0 $SSH_AGENT_PID 2>/dev/null || {
        start_agent
    }
else
    start_agent
fi

2) Затем запустите, $ source ~/.bashrcчтобы перезагрузить ваш конфиг.

Вышеуказанные шаги были сделаны из https://github.com/abergs/ubuntuonwindows#2-start-an-bash-ssh-agent-on-launch

3) Создайте файл конфигурации SSH, если его нет. Используйте следующую команду для создания новой:.ssh$ touch config

4) Добавить следующее к ~/.ssh/config

Host github.com-<YOUR_GITHUB_USERNAME> 
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes


Host csexperimental.abc.com
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes

<More hosts and github configs can be added in similar manner mentioned above>

5) Добавьте ключ к агенту SSH, используя команду, $ ssh-add ~/.ssh/id_work_gmailи тогда вы сможете подключиться к вашей учетной записи github или удаленному хосту, используя ssh. Например, в контексте приведенных выше примеров кода:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

или

$ ssh <USER>@csexperimental.abc.com

Это добавление ключа к агенту SSH должно выполняться только один раз.

6) Теперь выйдите из сеанса Bash в подсистеме Windows Linux, то есть снова выйдите из всех консолей Bash и снова запустите новую консоль и попробуйте подключиться к SSH к вашему хосту Github или другому хосту, как настроено в конфигурационном файле SSH, и он должен работать без каких-либо дополнительных шаги.

Примечание:

Спасибо.

Джинеш Гоэль
источник
1
Интересная альтернатива, использующая WSL. +1
VonC
@JigneshGohel Спасибо, этот сценарий идеален и чист! Я просто удивился, почему у вас есть >> "${SSH_ENV}"? Разве это не должно быть просто > "${SSH_ENV}"? Ваш, конечно, работает, но он просто заканчивается более длинным и длинным ~/.ssh/environmentфайлом, потому что (как я сейчас думаю !?) нет причин ... Хотя, большое, большое спасибо! Я считаю, что этот скрипт должен быть включен в стандартную .bashrcверсию WSL Ubuntu, это очень полезно!
MikeBeaton
5

Я нашел самый плавный способ добиться этого, используя Pageant в качестве агента SSH и plink.

Вам необходимо настроить сеанс замазки для имени хоста, используемого в вашем пульте.

Вам также понадобится plink.exe, который можно скачать с того же сайта, что и putty.

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

Когда вы устанавливаете git-scm, вы можете указать его для использования tortoise / plink, а не OpenSSH.

Чистый эффект в том, что вы можете открывать git-bash в любое время и нажимать / тянуть, не сталкиваясь с парольными фразами.

То же самое относится и к сеансам putty и WinSCP, когда в pageant загружен ваш ключ. Это делает жизнь намного проще (и безопаснее).

Алэсдэйр
источник
2

Поскольку я не люблю использовать замазку в Windows в качестве обходного пути, я создал очень простую утилиту ssh-agent-wrapper . Он сканирует ваши папки .ssh и добавляет все ваши ключи к агенту. Вам просто нужно поместить его в папку автозагрузки Windows, чтобы он работал.

Предположения :

  • ssh-agent в пути
  • shh-add in path (оба выбирают опцию «RED» при установке git
  • закрытые ключи находятся в папке% USERPROFILE% /. ssh
  • имена личных ключей начинаются с идентификатора (например, id_rsa)
Эрез А. Корн
источник
Ницца! +1. Я всегда работаю с openssh (не замазкой), поэтому это интересное решение для закрытых ключей с парольными фразами.
VonC
Поскольку вы уже находитесь на github, то почему бы просто не сделать исходный код git-репозиторием?
Торбьерн Равн Андерсен
Просто удалите / Releases из пути. ;-)
Эрез А. Корн
1

Я не мог заставить это работать, основываясь на лучшем ответе, вероятно, потому что я - такой noob PC и пропускаю что-то очевидное. Но только к вашему сведению, если это поможет кому-то так же, как мне, то, что НАКОНЕЦ работало, было по одной из ссылок здесь (ссылка в ответах). Это включало просто вставку следующего к моему .bash_profile:

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

Возможно, что-то настроено странно, но не удалось, когда я добавил его в свой .profileили.bashrc . Другая реальная проблема, с которой я столкнулся, заключается в том, что я не являюсь администратором на этом компьютере и не могу изменять переменные среды, не получив одобрения ИТ, поэтому это решение для тех, кто не может получить к нему доступ.

Вы знаете, что это работает, если у вас запросят пароль ssh при открытии git bash. Аллилуйя, что-то наконец-то сработало.

Ambrown
источник
1

Поместите это в ваш ~ / .bashrc (или в файл с исходным кодом), что предотвратит ненужный запуск несколько раз для каждой оболочки:

if [ -z "$SSH_AGENT_PID" ]; then
        eval `ssh-agent -s`
fi

А затем добавьте «AddKeysToAgent yes» в ~ / .ssh / config:

Host *
    AddKeysToAgent yes

ssh на ваш сервер (или git pull) в обычном режиме, и вам будет предложено ввести пароль / пароль только один раз за сеанс.

МЗА
источник
0

Создайте новый файл .bashrc в вашей директории ~.

Там вы можете поместить свои команды, которые вы хотите выполнять при каждом запуске bash

user2711262
источник
Это должно работать. Попытайтесь поместить что-то простое в такой .bashrcфайл (например, echo testи проверьте, загружен ли он при выполнении Git Bash.
David Ferenczy Rogožan
Также обратите внимание, что ~ в PowerShell, вероятно, отличается от ~ в Git Bash / Cygwin в зависимости от того, какая версия была установлена ​​и какие параметры пользователя указаны.
dragon788 21.09.16
@ Яр В Windows, поместите .bashrcв свою папку пользователя, например C:\Users\john.
Мартин ван
0

Простое двухстрочное решение из этого ответа :

Для sh , bash и т.д .:

# ~/.profile
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi
. ~/.ssh-agent.sh

Для csh , tcsh и т.д .:

# ~/.schrc
sh -c 'if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -c > ~/.ssh-agent.tcsh; fi'
eval `cat ~/.ssh-agent.tcsh`
oklas
источник