Esecuzione di SSH Agent all'avvio di Git Bash su Windows


152

Sto usando Git Bash. Devo usare

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

ogni volta che inizio una nuova git bash.

C'è un modo per impostare permanentemente l'agente ssh? O Windows ha un buon modo per gestire i tasti SSH?

Sono un ragazzo nuovo, per favore dammi un tutorial dettagliato, grazie!


3
è /my/ssh/location/equivalente a qualcosa del genere /c/Users/Foobar/.ssh/?
Nick,

Un problema simile è stato pubblicato su superuser.com/q/1238486/478378 che ora è stato risolto. La seguente sintesi contiene tutti i dettagli gist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d . Grazie.
Jignesh Gohel,

Risposte:


138

In una sessione git bash, puoi aggiungere uno script a ( ~/.profileo con di solito essere impostato su ), in modo che detta sessione si avvii automaticamente . Se il file non esiste, basta crearlo.~/.bashrc~%USERPROFILE%ssh-agent

Questo è ciò che GitHub descrive in " Lavorare con le passphrase della chiave SSH ".

La sezione " Avvio automatico di ssh-agent su Git per Windows " di quell'articolo ha uno script robusto che controlla se l'agente è in esecuzione o meno. Di seguito è riportato solo uno snippet, consultare l'articolo GitHub per la soluzione 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

Altre risorse:

" Far funzionare ssh-agent con git run dalla shell dei comandi di Windows " ha uno script simile, ma farei riferimento principalmente all'articolo GitHub sopra, che è più robusto e aggiornato.


Un leggero fastidio che avevo era se sapessi che non avrei usato git, non avrei inserito la passphrase della chiave ssh, quindi ogni shell che avevo aperto lo chiedeva di nuovo. Questo è lo stato 1, agente in esecuzione senza chiave, quindi è possibile rimuovere ssh-add da questa sezione, quindi se non si immette la passphrase per la prima volta non verrà richiesto di nuovo fino a quando non si esegue ssh-add manualmente.
Andy2K11,

@Gordon Quale parte di questo help.github.com/articles/working-with-ssh-key-passphrases il link GitHub è cambiato? Il suo contenuto è ancora lì e sembra ancora rilevante per questa risposta.
VonC,

1
@ Andy2K11 Se vuoi inserire la passphrase la prima volta che ne hai bisogno, e non quando apri una shell, il modo più pulito per me è rimuovere l'ssh-add dal .bash_profile, come hai detto, e aggiungere "AddKeysToAgent yes" a il tuo file .ssh / config (vedi questa risposta: superuser.com/a/1114257/523133 ). In questo modo non devi nemmeno ricordare di aver eseguito ssh-add.
dura dal

30

PS: Queste istruzioni sono nel contesto di una shell Bash aperta nel sottosistema Linux di Windows 10 e non menzionano il collegamento simbolico di chiavi SSH generate in Windows con Bash su Ubuntu su Windows

1) Aggiorna il tuo .bashrc aggiungendo il seguente in esso

# 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) Quindi corri $ source ~/.bashrcper ricaricare la tua configurazione.

I passaggi precedenti sono stati presi da https://github.com/abergs/ubuntuonwindows#2-start-an-bash-ssh-agent-on-launch

3) Creare un file di configurazione SSH, se non presente. Utilizzare il comando seguente per crearne uno nuovo:.ssh$ touch config

4) Aggiungi seguente 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) Aggiungi la tua chiave all'agente SSH usando il comando $ ssh-add ~/.ssh/id_work_gmaile poi dovresti essere in grado di connetterti al tuo account github o host remoto usando ssh. Ad esempio nel contesto di esempi di codice sopra:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

o

$ ssh <USER>@csexperimental.abc.com

Questa aggiunta di chiave all'agente SSH dovrebbe essere richiesta per essere eseguita una sola volta.

6) Ora disconnettiti dalla tua sessione Bash sul sottosistema Windows Linux, ovvero esci di nuovo da tutte le console Bash e riavvia una nuova console e prova a SSH sul tuo host Github o altro host come configurato nel file di configurazione SSH e dovrebbe funzionare senza bisogno di alcun extra passi.

Nota:

Grazie.


1
Alternativa interessante, usando WSL. +1
VonC

@JigneshGohel Grazie, questo script è perfetto e v. Pulito! Mi chiedevo solo, perché hai >> "${SSH_ENV}"? Non dovrebbe essere > "${SSH_ENV}"? Il tuo funziona, ovviamente, ma finisce con un file lentamente sempre più lungo ~/.ssh/environment, perché (come penso attualmente !?) senza motivo ... Molte, molte grazie però! Sento che questo script dovrebbe essere incluso nel valore predefinito .bashrcper Ubuntu WSL, è così utile!
MikeBeaton

5

Ho trovato il modo più semplice per raggiungere questo obiettivo era usare Pageant come agente SSH e plink.

Devi avere una sessione di stucco configurata per il nome host utilizzato nel tuo telecomando.

Sarà inoltre necessario plink.exe che può essere scaricato dallo stesso sito di putty.

E hai bisogno di Pageant in esecuzione con la chiave caricata. Ho un collegamento da sfilare nella mia cartella di avvio che carica la mia chiave SSH quando eseguo l'accesso.

Quando installi git-scm puoi quindi specificarlo per usare tortoise / plink anziché OpenSSH.

L'effetto netto è che puoi aprire git-bash quando vuoi e spingere / tirare senza essere sfidato per le passphrase.

Lo stesso vale per le sessioni putty e WinSCP quando a pageant è stata caricata la chiave. Rende la vita molto più facile (e sicura).


2

Dato che non mi piace usare putty in Windows come soluzione alternativa, ho creato un'utility ssh-agent-wrapper molto semplice . Esegue la scansione delle cartelle .ssh e aggiunge tutte le chiavi all'agente. Devi semplicemente metterlo nella cartella di avvio di Windows per farlo funzionare.

Ipotesi :

  • ssh-agent nel percorso
  • shh-add in path (entrambi scegliendo l'opzione "ROSSO" durante l'installazione di git
  • le chiavi private si trovano nella cartella% USERPROFILE% /. ssh
  • i nomi delle chiavi private iniziano con id (ad es. id_rsa)

Bello! +1. Lavoro sempre con openssh (non putty), quindi è una soluzione interessante per le chiavi private con passphrase.
VonC,

Dato che sei già su github, allora perché non trasformare la fonte in un repository git?
Thorbjørn Ravn Andersen,

Rimuovi semplicemente le / release dal percorso. ;-)
Erez A. Korn,

1

Non sono riuscito a farlo funzionare basandomi sulla risposta migliore, probabilmente perché sono un tale sostenitore del PC e mi manca qualcosa di ovvio. Ma solo FYI nel caso in cui aiuti qualcuno così sfidato come me, ciò che ha FINALMENTE funzionato è stato tramite uno dei link qui (indicato nelle risposte). Ciò implicava semplicemente incollare quanto segue sul mio .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

Probabilmente ho configurato qualcosa di strano, ma non ho avuto successo quando l'ho aggiunto al mio .profileo .bashrc. L'altra vera sfida che ho incontrato è che non sono un amministratore di questo computer e non posso cambiare le variabili di ambiente senza averlo approvato dall'IT, quindi questa è una soluzione per coloro che non possono accedervi.

Sai che funziona se ti viene richiesta la tua password ssh quando apri git bash. Alleluia qualcosa finalmente funzionò.


1

Inseriscilo nel tuo ~ / .bashrc (o in un file che è stato originato da esso) che ne impedirà l'esecuzione più volte inutilmente per shell:

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

E quindi aggiungi "AddKeysToAgent yes" a ~ / .ssh / config:

Host *
    AddKeysToAgent yes

ssh sul tuo server (o git pull) normalmente e ti verrà richiesta una password / passphrase una sola volta per sessione.


0

Crea un nuovo file .bashrc nella tua directory ~.

Lì puoi inserire i tuoi comandi che desideri vengano eseguiti ogni volta che avvii la bash


Deve funzionare. Prova a mettere qualcosa di semplice in tale .bashrcfile (come echo teste controlla se è caricato quando esegui Git Bash.
David Ferenczy Rogožan

Si noti inoltre che ~ in PowerShell è probabilmente diverso da ~ in Git Bash / Cygwin a seconda della versione installata e delle opzioni utente specificate.
dragon788,

@Yar Su Windows, inserisci la .bashrctua cartella utente ad es C:\Users\john.
Martin van Driel,

0

Semplice soluzione a due stringhe da questa risposta :

Per sh , bash , ecc:

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

Per csh , tcsh , ecc:

# ~/.schrc
sh -c 'if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -c > ~/.ssh-agent.tcsh; fi'
eval `cat ~/.ssh-agent.tcsh`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.