Получение ssh-agent для работы с git запускается из командной оболочки Windows

У меня установлен msysgit с OpenSSH. Я подключаюсь к репозиторию gitosis. Из git bash я создал файл .profile, который запускает ssh-agent (если он еще не запущен) каждый раз, когда открывается git bash, используя этот скрипт

SSH_ENV=$HOME/.ssh/environment

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

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . ${SSH_ENV} > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

Я также использую расширения git, которые запускают команду git из командной строки Windows, а не git bash. Итак, ssh не видит запущенный ssh-агент. Можно ли это исправить?


person Jacko    schedule 08.09.2010    source источник
comment
Для информации: мне не удалось обеспечить надежную работу ssh-agent в Windows 10 с git bash 2.x (следуя руководство по github), но с замазкой мне повезло больше. См. этот удивительный ответ: Почему git не может запомнить мою парольную фразу под Windows   -  person jakub.g    schedule 02.08.2018


Ответы (7)


У меня была та же проблема, что и у вас, затем я попытался добавить этот код

#! /bin/bash 
eval `ssh-agent -s` 
ssh-add ~/.ssh/*_rsa

в файл .bashrc в моем домашнем каталоге. И это работает!

person Fery W    schedule 05.11.2013
comment
Это сработало для меня. Я думаю, что моя конкретная проблема заключалась в том, что мне нужно было указать файл _rsa, который мне нужно было использовать. - person Syntax Error; 30.06.2015
comment
Спасибо @bricklore :) - person Fery W; 19.01.2016
comment
Многократный выход и открытие новых сеансов bash приводили к созданию нового ssh-agent.exe с каждым новым сеансом. Решение в статье, связанной с ответом @Braiam, предотвращает это для меня. - person Sean; 30.03.2017

Для msysgit вам, возможно, придется немного изменить решение, предлагаемое https://help.github.com/articles/working-with-ssh-key-passphrases

declare -x SSH_ENV="$HOME/.ssh/environment"

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

# test for identities
function test_identities {
    # test whether standard identities have been added to the agent already
    ssh-add -l | grep "The agent has no identities" > /dev/null
    if [ $? -eq 0 ]; then
        ssh-add
        # $SSH_AUTH_SOCK broken so we start a new proper agent
        if [ $? -eq 2 ];then
            start_agent
        fi
    fi
}

# check for running ssh-agent with proper $SSH_AGENT_PID
if [ -n "$SSH_AGENT_PID" ]; then
    ps -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
    if [ $? -eq 0 ]; then
  test_identities
    fi
else
    if [ -f "$SSH_ENV" ]; then
    . "$SSH_ENV" > /dev/null
    fi
    ps -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
    if [ $? -eq 0 ]; then
        test_identities
    else
        start_agent
    fi
fi

Как вы могли заметить, единственное изменение, которое я сделал, было в вызове ps, так как msysgit не использует -U, но -u

person Braiam    schedule 08.04.2013
comment
Обратите внимание, что статья на GitHub предоставляет более простая (вероятно, более надежная) версия этого скрипта. - person Ignitor; 19.03.2015
comment
Кажется, они обновили свой код. Интересно, нужна ли еще ваша кастомизированная версия? Я рекомендую просто сначала попробовать решение в статье. - person Sean; 30.03.2017

Даже если вы, вероятно, решили эту проблему... используйте команду eval, чтобы закрепить процесс ssh_agent:

eval `ssh-agent.exe`

Затем используйте ssh-add, чтобы добавить нужные вам ключи.

person Cu7l4ss    schedule 10.11.2011
comment
Это порождает новый процесс верхнего уровня ssh-agent каждый раз, когда вы открываете git bash. - person Der Hochstapler; 27.09.2013
comment
Ах, видите ли, не совсем, по крайней мере, когда я проверял это, если я правильно помню, он проверяет, есть ли уже запущенный процесс, иначе он порождает процесс. в настоящее время они исправили это, так что нет причин использовать это больше - person Cu7l4ss; 13.10.2013
comment
@Cu7l4ss Если они это исправили, то почему у меня возникла эта проблема??? -- Я могу запустить ssh-agent и просто добавить ключ... но затем он мгновенно исчезнет, ​​и 'ssh-add -l' вернет, что агент не имеет идентификаторов. Единственный способ, которым я зашел так далеко, - это команда, которую вы указали. -- К вашему сведению, все еще актуальная проблема. - person Zeveso; 04.11.2013
comment
Многократный выход и открытие новых сеансов bash приводили к созданию нового ssh-agent.exe с каждым новым сеансом. Решение в статье, связанной с ответом @Braiam, предотвращает это для меня. - person Sean; 30.03.2017

В Windows 10 это сработало для меня

  1. запустить git bash
  2. touch ~/.profile
  3. start ~/.profile чтобы открыть .profile
  4. добавьте следующее к .profile
#! /bin/bash 
eval `ssh-agent -s` 
ssh-add ~/.ssh/*_rsa

Это основано на этом ответе. Разница только в том, что .bashrc не сработало, вместо этого сработало .profile.

person Thoran    schedule 04.05.2016

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

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

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

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

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

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

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

person Alasdair    schedule 04.03.2015

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

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

person Andrew Aylett    schedule 03.06.2011

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

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