Executando o Agente SSH ao iniciar o Git Bash no Windows

152

Estou usando o git bash. Eu tenho que usar

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

toda vez que inicio um novo git bash.

Existe uma maneira de definir o agente ssh permanentemente? Ou o Windows tem uma boa maneira de gerenciar as chaves ssh?

Eu sou um cara novo, por favor me dê um tutorial detalhado, obrigado!

zchholmes
fonte
3
é /my/ssh/location/equivalente a algo como /c/Users/Foobar/.ssh/?
Nick
Um problema semelhante foi publicado em superuser.com/q/1238486/478378, que foi resolvido agora. A lista a seguir contém todos os detalhes gist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d . Obrigado.
Jignesh Gohel

Respostas:

138

Em uma sessão git bash, você pode adicionar um script para ~/.profileou ~/.bashrc( com ~sendo geralmente definida como%USERPROFILE% ), a fim de que referida sessão para iniciar automaticamente o ssh-agent. Se o arquivo não existir, basta criá-lo.

Isto é o que o GitHub descreve em " Trabalhando com as senhas das chaves SSH ".

A seção " Iniciando automaticamente o ssh-agent no Git for Windows " desse artigo possui um script robusto que verifica se o agente está em execução ou não. Abaixo está apenas um trecho, consulte o artigo do GitHub para obter a solução completa.

# 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

Outros recursos:

" Conseguir que o ssh-agent trabalhe com o git executado a partir do shell de comando do Windows " possui um script semelhante, mas eu me referiria ao artigo do GitHub acima, principalmente, que é mais robusto e atualizado.

VonC
fonte
Um pequeno aborrecimento que tive foi se soubesse que não usaria o git, que não entraria na frase secreta da chave ssh, então cada shell que abri pedia novamente. Esse é o estado 1, agente executando a chave sem chave, para que você possa remover o ssh-add desta seção e, se não digitar sua senha pela primeira vez, não será solicitado novamente até que você execute manualmente o ssh-add.
Andy2K11
@Gordon Qual parte do link help.github.com/articles/working-with-ssh-key-passphrases do GitHub foi alterada? Seu conteúdo ainda está lá e ainda parece relevante para esta resposta.
VonC
1
@ Andy2K11 Se você quiser digitar a senha da primeira vez que precisar, e não ao abrir um shell, a maneira mais limpa para mim é remover o ssh-add do .bash_profile, como você mencionou, e adicionar "AddKeysToAgent yes" a seu arquivo .ssh / config (consulte esta resposta: superuser.com/a/1114257/523133 ). Dessa forma, você nem precisa se lembrar de executar o ssh-add.
hardsetting
30

PS: Essas instruções estão no contexto de um shell Bash aberto no Windows 10 Linux Subsystem e não mencionam as chaves SSH de vinculação simbólica geradas no Windows com Bash no Ubuntu no Windows no Windows

1) Atualize seu .bashrc adicionando o seguinte

# 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) Em seguida, execute $ source ~/.bashrcpara recarregar sua configuração.

As etapas acima foram realizadas em https://github.com/abergs/ubuntuonwindows#2-start-an-bash-ssh-agent-on-launch

3) Crie um arquivo de configuração SSH, se não estiver presente. Use o seguinte comando para criar um novo:.ssh$ touch config

4) Adicione o seguinte a ~/.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) Adicione sua chave ao agente SSH usando o comando $ ssh-add ~/.ssh/id_work_gmaile, em seguida, você poderá se conectar à sua conta do github ou host remoto usando o ssh. Por exemplo, no contexto dos exemplos de código acima:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

ou

$ ssh <USER>@csexperimental.abc.com

Essa adição de chave ao agente SSH deve ser executada apenas uma vez.

6) Agora saia da sua sessão do Bash no Windows Linux Subsystem, ou seja, saia de todos os consoles do Bash novamente e inicie um novo console novamente e tente fazer o SSH no seu Github Host ou outro host conforme configurado no arquivo de configuração SSH e deve funcionar sem a necessidade de nenhum extra passos.

Nota:

Obrigado.

Jignesh Gohel
fonte
1
Alternativa interessante, usando WSL. +1
VonC 08/08/19
@JigneshGohel Obrigado, este script é perfeito e v. Clean! Eu só pensei, por que você tem >> "${SSH_ENV}"? Não deveria ser apenas > "${SSH_ENV}"? O seu funciona, é claro, mas ele acaba com um ~/.ssh/environmentarquivo cada vez mais lento , por (como eu atualmente penso !?) sem motivo ... Muitos, muito obrigado! Eu sinto que esse script deve ser incluído no padrão .bashrcdo WSL Ubuntu, é tão útil!
MikeBeaton
5

Eu achei a maneira mais fácil de conseguir isso usando o Pageant como agente SSH e plink.

Você precisa ter uma sessão de massa configurada para o nome do host usado em seu controle remoto.

Você também precisará do plink.exe, que pode ser baixado no mesmo site que o putty.

E você precisa do Pageant executando com a chave carregada. Eu tenho um atalho para concurso na minha pasta de inicialização que carrega minha chave SSH quando eu faço login.

Ao instalar o git-scm, você pode especificá-lo para usar o tartartoise / plink em vez do OpenSSH.

O efeito líquido é que você pode abrir o git-bash sempre que quiser e pressionar / puxar sem ser desafiado por senhas.

O mesmo se aplica às sessões de massa e WinSCP quando o concurso tem sua chave carregada. Isso torna a vida muito mais fácil (e segura).

Alasdair
fonte
2

Como não gosto de usar massa no Windows como solução alternativa, criei um utilitário muito simples ssh-agent-wrapper . Ele verifica suas pastas .ssh e adiciona todas as suas chaves ao agente. Você simplesmente precisa colocá-lo na pasta de inicialização do Windows para que ele funcione.

Pressupostos :

  • ssh-agent no caminho
  • caminho shh-add in (ambos escolhendo a opção "RED" ao instalar o git
  • chaves privadas estão na pasta% USERPROFILE% /. ssh
  • nomes de chaves privadas começam com id (por exemplo, id_rsa)
Erez A. Korn
fonte
Agradável! +1. Eu sempre trabalho com openssh (não putty), por isso é uma solução interessante para chaves privadas com senhas.
VonC 28/07
Como você já está no github, por que não fazer da fonte um repositório git?
Thorbjørn Ravn Andersen
Apenas remova os / releases do caminho. ;-)
Erez A. Korn
1

Não consegui fazer isso funcionar com base na melhor resposta, provavelmente porque sou um noob de PC e perdi algo óbvio. Mas apenas para sua informação, no caso de ajudar alguém tão desafiado quanto eu, o que FINALMENTE funcionou foi através de um dos links aqui (referenciado nas respostas). Isso envolveu simplesmente colar o seguinte no meu .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

Eu provavelmente tenho algo configurado estranho, mas não foi bem sucedido quando o adicionei ao meu .profileou .bashrc. O outro desafio real em que me deparei é que não sou administrador neste computador e não posso alterar as variáveis ​​de ambiente sem a aprovação da TI, portanto, essa é uma solução para aqueles que não podem acessar isso.

Você sabe que está funcionando se for solicitada sua senha ssh ao abrir o git bash. Aleluia, algo finalmente funcionou.

Ambrown
fonte
1

Coloque isso no seu ~ / .bashrc (ou em um arquivo que tenha origem), o que impedirá que seja executado várias vezes desnecessariamente por shell:

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

E então adicione "AddKeysToAgent yes" a ~ / .ssh / config:

Host *
    AddKeysToAgent yes

ssh para o seu servidor (ou git pull) normalmente e você será solicitado apenas com senha / senha uma vez por sessão.

mza
fonte
0

Crie um novo .bashrc arquivo no seu diretório ~.

Lá você pode colocar os comandos que deseja executar sempre que iniciar o bash

user2711262
fonte
Isso tem que funcionar. Tente colocar algo simples em tal .bashrcarquivo (como echo teste verifique se ele está carregado quando você executa o Git Bash.
David Ferenczy Rogožan
Observe também que ~ no PowerShell provavelmente é diferente de ~ no Git Bash / Cygwin, dependendo da versão instalada e das opções do usuário especificadas.
dragon788
@Yar No Windows, coloque .bashrcna sua pasta de usuário, por exemplo C:\Users\john.
Martin van Driel
0

Solução de dois seqüência simples de esta resposta :

Para sh , bash , etc:

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

Para csh , tcsh , etc:

# ~/.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
fonte