Ausführen des SSH-Agenten beim Starten von Git Bash unter Windows

152

Ich benutze Git Bash. Ich muss benutzen

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

Jedes Mal, wenn ich eine neue Git-Bash starte.

Gibt es eine Möglichkeit, den SSH-Agenten dauerhaft einzustellen? Oder hat Windows eine gute Möglichkeit, die SSH-Schlüssel zu verwalten?

Ich bin ein neuer Typ, bitte gib mir ein detailliertes Tutorial, danke!

zchholmes
quelle
3
ist /my/ssh/location/gleichbedeutend mit so etwas /c/Users/Foobar/.ssh/?
Nick
Ein ähnliches Problem wurde unter superuser.com/q/1238486/478378 veröffentlicht, das jetzt behoben ist. Die folgende Liste enthält alle Details gist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d . Vielen Dank.
Jignesh Gohel

Antworten:

138

In einer git Bash - Sitzung können Sie einen Skript hinzufügen , ~/.profileoder ~/.bashrc( mit ~zu werden in der Regel festgelegt%USERPROFILE% ), um die Sitzung zu starten automatisch ssh-agent. Wenn die Datei nicht vorhanden ist, erstellen Sie sie einfach.

Dies beschreibt GitHub in " Arbeiten mit SSH-Schlüsselpassphrasen ".

Der Abschnitt " Automatischer Start von ssh-agent unter Git für Windows " in diesem Artikel enthält ein robustes Skript, das überprüft, ob der Agent ausgeführt wird oder nicht. Unten finden Sie nur einen Ausschnitt. Die vollständige Lösung finden Sie im GitHub-Artikel.

# 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

Andere Ressourcen:

" Ssh-agent dazu bringen, mit Git zu arbeiten, das von der Windows-Befehlsshell ausgeführt wird " hat ein ähnliches Skript, aber ich würde hauptsächlich auf den obigen GitHub-Artikel verweisen, der robuster und aktueller ist.

VonC
quelle
Ein kleiner Ärger, den ich hatte, war, wenn ich wusste, dass ich kein Git verwenden würde, würde ich nicht in die Passphrase des SSH-Schlüssels eingeben, dann fragte jede Shell, die ich öffnete, erneut danach. Dies ist Status 1, Agent, der ohne Schlüssel ausgeführt wird. Sie können also ssh-add aus diesem Abschnitt entfernen. Wenn Sie Ihre Passphrase nicht zum ersten Mal eingeben, werden Sie erst erneut gefragt, wenn Sie ssh-add manuell ausführen.
Andy2K11
@Gordon Welcher Teil dieser Hilfe.github.com/articles/working-with-ssh-key-passphrases GitHub-Link hat sich geändert? Sein Inhalt ist immer noch da und scheint für diese Antwort immer noch relevant zu sein.
VonC
1
@ Andy2K11 Wenn Sie die Passphrase beim ersten Mal eingeben möchten und nicht beim Öffnen einer Shell, ist es für mich am saubersten, das ssh-add aus dem .bash_profile zu entfernen, wie Sie erwähnt haben, und "AddKeysToAgent yes" hinzuzufügen Ihre .ssh / config-Datei (siehe diese Antwort: superuser.com/a/1114257/523133 ). Auf diese Weise müssen Sie sich nicht einmal daran erinnern, ssh-add ausgeführt zu haben.
Hardsetting
30

PS: Diese Anweisungen beziehen sich auf eine Bash-Shell, die im Windows 10 Linux-Subsystem geöffnet wurde, und erwähnen nicht die Verknüpfung von in Windows generierten SSH-Schlüsseln mit Bash unter Ubuntu unter Windows

1) Aktualisieren Sie Ihre .bashrc, indem Sie Folgendes hinzufügen

# 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) Führen Sie dann aus $ source ~/.bashrc, um Ihre Konfiguration neu zu laden.

Die oben genannten Schritte wurden von https://github.com/abergs/ubuntuonwindows#2-start-an-bash-ssh-agent-on-launch ausgeführt

3) Erstellen Sie eine SSH-Konfigurationsdatei, falls nicht vorhanden. Verwenden Sie den folgenden Befehl, um einen neuen zu erstellen:.ssh$ touch config

4) Fügen Sie Folgendes hinzu zu ~/.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) Fügen Sie Ihren Schlüssel mit dem Befehl zum SSH-Agenten hinzu, $ ssh-add ~/.ssh/id_work_gmailund dann sollten Sie in der Lage sein, mit ssh eine Verbindung zu Ihrem Github-Konto oder Remote-Host herzustellen. Zum Beispiel im Zusammenhang mit den obigen Codebeispielen:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

oder

$ ssh <USER>@csexperimental.abc.com

Dieses Hinzufügen eines Schlüssels zum SSH-Agenten sollte nur einmal durchgeführt werden müssen.

6) Melden Sie sich jetzt von Ihrer Bash-Sitzung unter Windows Linux Subsystem ab, dh beenden Sie alle Bash-Konsolen erneut und starten Sie eine neue Konsole erneut. Versuchen Sie, SSH auf Ihrem Github-Host oder einem anderen Host durchzuführen, wie in der SSH-Konfigurationsdatei konfiguriert, und es sollte ohne zusätzliche Funktionen funktionieren Schritte.

Hinweis:

Vielen Dank.

Jignesh Gohel
quelle
1
Interessante Alternative mit WSL. +1
VonC
@JigneshGohel Danke, dieses Skript ist perfekt und sehr sauber! Ich habe mich nur gefragt, warum hast du >> "${SSH_ENV}"? Sollte es nicht einfach so sein > "${SSH_ENV}"? Ihre funktioniert natürlich, aber es endet nur mit einer langsam längeren und längeren ~/.ssh/environmentDatei, und zwar (wie ich derzeit denke!?) Ohne Grund ... Vielen, vielen Dank! Ich denke, dieses Skript sollte nur in der Standardeinstellung .bashrcfür WSL Ubuntu enthalten sein, es ist so nützlich!
MikeBeaton
5

Ich fand den reibungslosesten Weg, dies zu erreichen, die Verwendung von Pageant als SSH-Agent und Plink.

Für den Hostnamen, der auf Ihrer Fernbedienung verwendet wird, muss eine Putty-Sitzung konfiguriert sein.

Sie benötigen außerdem plink.exe, das von derselben Site wie putty heruntergeladen werden kann.

Und Sie brauchen Pageant, der mit geladenem Schlüssel läuft. Ich habe eine Verknüpfung zum Festzug in meinem Startordner, die meinen SSH-Schlüssel lädt, wenn ich mich anmelde.

Wenn Sie git-scm installieren, können Sie festlegen, dass anstelle von OpenSSH Schildkröte / Plink verwendet wird.

Der Nettoeffekt ist, dass Sie Git-Bash jederzeit öffnen und drücken / ziehen können, ohne nach Passphrasen gefragt zu werden.

Gleiches gilt für Kitt- und WinSCP-Sitzungen, wenn bei einem Festzug Ihr Schlüssel geladen ist. Es macht das Leben verdammt viel einfacher (und sicherer).

Alasdair
quelle
2

Da ich Putty in Windows nicht gerne als Problemumgehung verwende, habe ich ein sehr einfaches Dienstprogramm ssh-agent-wrapper erstellt . Es durchsucht Ihre .ssh-Ordner und fügt dem Agenten alle Ihre Schlüssel hinzu. Sie müssen es nur in den Windows-Startordner legen, damit es funktioniert.

Annahmen :

  • SSH-Agent im Pfad
  • shh-add in path (beide durch Auswahl der Option "RED" bei der Installation von git
  • Private Schlüssel befinden sich im Ordner% USERPROFILE% / .ssh
  • Private Schlüsselnamen beginnen mit id (zB id_rsa)
Erez A. Korn
quelle
Nett! +1. Ich arbeite immer mit openssh (nicht putty), daher ist es eine interessante Lösung für private Schlüssel mit Passphrasen.
VonC
Da Sie bereits auf Github sind, warum machen Sie die Quelle dann nicht einfach zu einem Git-Repository?
Thorbjørn Ravn Andersen
Entfernen Sie einfach die / Releases aus dem Pfad. ;-)
Erez A. Korn
1

Ich konnte dies aufgrund der besten Antwort nicht zum Laufen bringen, wahrscheinlich weil ich so ein PC-Neuling bin und etwas Offensichtliches vermisse. Aber nur zu Ihrer Information, falls es jemandem hilft, der so herausgefordert ist wie ich, was ENDLICH funktioniert hat, war über einen der Links hier (in den Antworten angegeben). Dazu musste einfach Folgendes in meine eingefügt werden .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

Ich habe wahrscheinlich etwas Seltsames konfiguriert, war aber nicht erfolgreich, als ich es meinem .profileoder hinzufügte .bashrc. Die andere echte Herausforderung, der ich begegnet bin, ist, dass ich kein Administrator auf diesem Computer bin und die Umgebungsvariablen nicht ändern kann, ohne dass sie von der IT genehmigt wurden. Dies ist also eine Lösung für diejenigen, die nicht darauf zugreifen können.

Sie wissen, dass es funktioniert, wenn Sie beim Öffnen von git bash zur Eingabe Ihres SSH-Passworts aufgefordert werden. Halleluja, endlich hat etwas funktioniert.

Ambrown
quelle
1

Fügen Sie dies in Ihr ~ / .bashrc (oder eine Datei, die aus dem Quellcode stammt) ein, damit es nicht unnötig mehrmals pro Shell ausgeführt wird:

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

Und dann füge "AddKeysToAgent yes" zu ~ / .ssh / config hinzu:

Host *
    AddKeysToAgent yes

ssh auf Ihren Server (oder git pull) normalerweise und Sie werden nur einmal pro Sitzung nach Passwort / Passphrase gefragt.

mza
quelle
0

Erstellen Sie eine neue .bashrc- Datei in Ihrem ~ -Verzeichnis .

Dort können Sie Ihre gewünschten Befehle jedes Mal platzieren, wenn Sie die Bash starten

user2711262
quelle
Es muss funktionieren. Versuchen Sie, eine solche .bashrcDatei einfach zu gestalten (z . B. echo testund überprüfen Sie, ob sie geladen ist, wenn Sie Git Bash ausführen.
David Ferenczy Rogožan
Beachten Sie auch, dass sich ~ in PowerShell wahrscheinlich von ~ in Git Bash / Cygwin unterscheidet, je nachdem, welche Version installiert wurde und welche Benutzeroptionen angegeben wurden.
Dragon788
@Yar Legen Sie unter Windows .bashrcin Ihrem Benutzerordner z C:\Users\john.
Martin van Driel
0

Einfache Zwei-Zeichenfolgen-Lösung aus dieser Antwort :

Für sh , bash usw.:

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

Für csh , tcsh usw.:

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