Linux
Auf meinem Linux-System entschlüssele ich bei jedem Systemstart einen privaten SSH-Schlüssel. Nach dem Systemstart öffne ich ein Terminal und gebe Folgendes ein:
ssh-add ~/.ssh/id_rsa_some_key
git clone <git-url>
und ich bin bereit, Git-Operationen wie usw. auszuführen git pull -a
. Wenn ich ein anderes Terminal öffne und solche Befehle erneut eingebe, wird keine Eingabeaufforderung angezeigt, in der ich nach dem Kennwort des verschlüsselten SSH-Schlüssels gefragt werde. Zusammenfassend muss ich auf meinem Linux-System das Kennwort nur einmal eingeben.
Windows
Auf meiner Arbeit habe ich ein Windows-System. Nach dem Booten öffne ichGit-Bashund Problem:
eval $(ssh-agent)
und ssh-add ~/.ssh/private_key
, geben Sie das Passwort ein und geben Sie Git-Befehle ein, die mit dem Git-Repository kommunizieren können. Im Gegensatz zu meinem Linux-System erscheint, wenn ich ein neues Git-Bash öffne und Git-Befehle eingebe, eine Eingabeaufforderung, in der ich zur Eingabe des Passworts aufgefordert werde. Zusammenfassend lässt sich sagen, dass es möglich ist, mit dem Git-Repository zu interagieren, wenn der private Schlüssel in einem Git-Bash-Terminal entschlüsselt wurde, aber wenn ein neues Terminal geöffnet wird, sollte der SSH-Schlüssel erneut entschlüsselt werden.
Was habe ich versucht
Ich habe versucht, Pageant zu verwenden. Das erste Problem ist, dass die id_rsa nicht geeignet war. Mit Puttygen musste ein neuer Schlüssel erstellt werden, aber dann stellte sich heraus, dass es nicht möglich sein wird, die SSH-Git-URL zu verwenden, die mit git@ beginnt. Sie musste durch die https-URL ersetzt werden, aber das ist nicht das, was ich will.
Welche Antwort bevorzuge ich
Ich bevorzuge eine Antwort, die die folgenden Kriterien erfüllt:
- Der SSH-Schlüssel muss einmalig entschlüsselt werden, wenn das Windows-System gebootet wurde und ein Terminal geöffnet wird, um Git-Aktionen auszuführen
- Beim Öffnen eines neuen Terminals kann weiterhin mit dem Git-Repository interagiert werden, d. h. es wird keine Eingabeaufforderung zur Eingabe des Kennworts angezeigt.
- Ich bin kein Fan von Git-Bash. Wenn es unter Windows ein anderes Terminal gibt, das die ersten beiden Kriterien erfüllt, ist das für mich in Ordnung.
Antwort1
Der Befehl
eval $(ssh-agent)
startet den SSH-Agent-Prozess (entspricht Pageant) und erstellt normalerweise zwei Umgebungsvariablen: SSH_AUTH_SOCK und SSH_AGENT_PID (zumindest unter Linux, ich weiß nicht, ob Windows-Git-Bash hier einen Unterschied macht; wahrscheinlich nicht).
Wenn die Variable SSH_AUTH_SOCK gesetzt ist und auf einen gültigen Authentifizierungsagenten-Socket zeigt, kann jeder Prozess, der die Variable lesen kann, sie verwenden. Sie brauchen also nur eine Möglichkeit, den Wert dieser Variable von einer Git-Bash-Sitzung zur nächsten zu übertragen. Die Variable SSH_AGENT_PID ist nur eine Annehmlichkeit, damit der Agent bei Bedarf einfach beendet werden kann.
Wenn Sie diese Umgebungsvariablen (oder auch nur SSH_AUTH_SOCK) in einer Datei speichern können, sodass Ihre nachfolgenden Git-Bash-Fenster sie lesen können, können Sie ein Skript dafür folgendermaßen erstellen:
Immer wenn eine neue Git-Bash gestartet wird (also mit dem .bashrc
Skript oder seinem Git-Bash-Äquivalent)
- Überprüfen Sie, ob die Umgebungsvariablendatei des SSH-Agenten vorhanden ist.
- wenn die Datei existiert:
- Lies es
- Wenn der in der Datei aufgeführte Agent-Socket (und optional der Prozess) noch vorhanden ist, verwenden Sie die Variablen unverändert in Ihrer aktuellen Sitzung.
- sonst (d. h. wenn die Datei nicht vorhanden war oder ihre Informationen veraltet waren):
- laufen
eval $(ssh-agent)
- Erstellen Sie eine neue Umgebungsvariablendatei für den SSH-Agenten
- laufen
- Erledigt!
Außerdem müssen Sie möglicherweise die SSH-Git-URL vollständig eingeben, d. h. statt nur [email protected]/project.git
sollten Sie sie folgendermaßen eingeben:
ssh://[email protected]/project.git
Technisch gesehen ist die Form ohne ssh://
Präfix lediglich eine Abkürzung, die sich bequemer in die Befehlszeile eingeben lässt.