Wie kann verhindert werden, dass das Kennwort zum Entschlüsseln des privaten Schlüssels jedes Mal eingegeben werden muss, wenn Git Bash unter Windows verwendet wird?

125

Ich habe einen automatischen Gebäudetechnikdienst, der von einem privaten Git-Repository heruntergeladen wird. Das Problem ist, dass beim Versuch, das Repository zu klonen, das Kennwort angegeben werden muss, da es nicht gespeichert wird. Da es keine menschliche Interaktion gibt, wartet es für immer auf das Passwort. Wie kann ich erzwingen, dass er sich an id_rsa.pub erinnert?

D. Giunchi
quelle

Antworten:

255

Für Windows-Benutzer nur ein Hinweis, dass ich auf diese Weise die Git Bash-Umgebung so eingerichtet habe, dass ich mich beim Start einmal anmelde. Ich bearbeite meine ~/.bashrcDatei:

eval `ssh-agent`
ssh-add

Wenn ich Git Bash starte, sieht es so aus:

Welcome to Git (version 1.7.8-preview20111206)
(etc)
Agent pid 3376
Enter passphrase for /c/Users/starmonkey/.ssh/id_dsa:
Identity added: /c/Users/starmonkey/.ssh/id_dsa (/c/Users/starmonkey/.ssh/id_dsa)

Und jetzt kann ich auf andere Server ssh, ohne mich jedes Mal anzumelden.

Starmonkey
quelle
9
Wenn Sie keine ~ / .bashrc-Datei haben, erstellen Sie einfach eine neue Textdatei (Editor oder einen anderen Editor) und fügen Sie die beiden genannten Zeilen starmonkey hinzu.
pbz
7
'~' bezieht sich auf Ihr "Home-Verzeichnis". In Windows können Sie dies finden, indem Sie eine Befehlsshell (cmd) öffnen und "echo% USERPROFILE%" eingeben.
Hawkeye Parker
14
Bei mir funktioniert diese Syntax nicht. Ich musste eval $(ssh-agent)stattdessen schreiben .
Zusammenstoß
1
Mein Problem war, dass ich die Datei angeben musste, die ssh-add verwenden soll. Wahrscheinlich, weil ich mehr als einen habe und nicht den Standardnamen verwendet habe. Beispielssh-add ~/.ssh/myfile_rsa
Syntaxfehler
1
copy > ~/.bashrcin git bash, um die bashrc-Datei in Windows zu erstellen, ignorieren Sie den Fehler
Ruben
61

In dieser Antwort wird erläutert, wie der GitHub-Benutzername und das Kennwort dauerhaft gespeichert werden und nicht die Passphrase für den SSH-Schlüssel.

Führen Sie unter Windows einfach aus

$ git config --global credential.helper wincred

Dies bedeutet, dass Sie beim nächsten Drücken wie gewohnt Ihren Benutzernamen und Ihr Kennwort eingeben, diese jedoch in den Windows-Anmeldeinformationen gespeichert werden. Danach müssen Sie sie nicht mehr eingeben.

Drücken Sie wie in Push auf GitHub, ohne jedes Mal Benutzername und Passwort einzugeben (Git Bash unter Windows) .

Stephen Tun Aung
quelle
2
Nach diesem Befehl müssen Sie Ihren Benutzernamen und Ihr Passwort eingeben.
Stephen Tun Aung
5
Betrifft dies SSH-Schlüssel oder nur die HTTPS-Authentifizierung (Benutzername und Passwort)? Die Frage scheint die Verwendung von SSH-Schlüsseln zu sein.
Sean
Hat perfekt für mich funktioniert, ich denke ich verwende die HTTPS-Authentifizierung (Benutzername & Passwort).
Jonatan
Wenn Sie dies ausführen, wird überhaupt keine Ausgabe erzeugt.
user9993
@ user9993 Wird es nicht. Es handelt sich um eine Konfigurationsänderung. Obwohl keine Ausgabe erfolgt, gitändert sich das Verhalten gemäß der festgelegten Konfigurationsanweisung.
Starbeamrainbowlabs
9

Ich möchte meine SSH-Passphrase beim Öffnen neuer Terminals nicht eingeben müssen. Leider erfordert die Lösung von starmonkey, dass das Passwort für jede Sitzung eingegeben wird. Stattdessen habe ich Folgendes in meiner .bash_profileDatei:

# Note: ~/.ssh/environment should not be used, as it
#       already has a different purpose in SSH.

env=~/.ssh/agent.env

# Note: Don't bother checking SSH_AGENT_PID. It's not used
#       by SSH itself, and it might even be incorrect
#       (for example, when using agent-forwarding over SSH).

agent_is_running() {
    if [ "$SSH_AUTH_SOCK" ]; then
        # ssh-add returns:
        #   0 = agent running, has keys
        #   1 = agent running, no keys
        #   2 = agent not running
        ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]
    else
        false
    fi
}

agent_has_keys() {
    ssh-add -l >/dev/null 2>&1
}

agent_load_env() {
    . "$env" >/dev/null
}

agent_start() {
    (umask 077; ssh-agent >"$env")
    . "$env" >/dev/null
}

if ! agent_is_running; then
    agent_load_env
fi

# If your keys are not stored in ~/.ssh/id_rsa or ~/.ssh/id_dsa, you'll need
# to paste the proper path after ssh-add
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

unset env

Dies wird sich auch an meine Passphrase für neue Terminalsitzungen erinnern. Ich muss es nur einmal eingeben, wenn ich mein erstes Terminal nach dem Booten öffne.

Ich würde gerne gutschreiben, woher ich das habe. Es ist eine Modifikation der Arbeit eines anderen, aber ich kann mich nicht erinnern, woher sie kam. Danke anonymer Autor!

Update 2019-07-01: Ich denke nicht, dass dies alles notwendig ist. Ich arbeite jetzt konsequent daran, indem ich sicherstelle, dass in meiner .bash_profileDatei der ssh-Agent ausgeführt wird:

eval $(ssh-agent)

Dann habe ich eine sshKonfigurationsdatei wie folgt eingerichtet:

touch ~/.ssh/config
chmod 600 ~/.ssh/config
echo 'AddKeysToAgent yes' >> ~/.ssh/config
Conan
quelle
Ich werde immer noch jedes Mal nach meiner Passphrase gefragt.
Ryan
1
@ Ryan hoffentlich wird das Update, das ich gerade hinzugefügt habe, Ihr Problem beheben. Ich halte die Informationen in einem Blog-Beitrag unter conan.is/blogging/clojure-on-windows.html auf dem neuesten Stand und habe die gleiche Frage selbst unter stackoverflow.com/questions/52423626/… gestellt
Conan
Danke, ich werde das überprüfen.
Ryan
@Conan Die aktualisierte Lösung funktioniert pro Bash-Sitzung. Nachdem ich meine laufende Bash-Sitzung geschlossen und eine neue geöffnet hatte, wurde ich erneut aufgefordert, ein Passwort einzugeben.
Tushar Raj
5

Wenn ich die Frage richtig verstehe, verwenden Sie bereits einen autorisierten SSH-Schlüssel im Build-Service, möchten aber vermeiden, dass Sie die Passphrase für jeden Klon eingeben müssen?

Ich kann mir zwei Möglichkeiten vorstellen, dies zu tun:

  1. Wenn Ihr Build-Service interaktiv gestartet wird: Beginnen Sie ssh-agentmit einem ausreichend langen Timeout ( -tOption), bevor Sie den Build-Service starten . Verwenden Sie dann ssh-add(msysGit sollte diese haben), um alle privaten Schlüssel hinzuzufügen, die Sie benötigen, bevor Sie Ihren Build-Service starten. Sie müssten immer noch alle Passphrasen eingeben, jedoch nur einmal pro Dienststart.

  2. Wenn Sie vermeiden möchten, dass die Passphrasen überhaupt eingegeben werden müssen, können Sie die Passphrasen jederzeit aus den SSH-Schlüsseln entfernen, wie unter /server/50775/how-do-i-change-my- beschrieben. Private-Key-Passphrase , indem eine leere neue Passphrase festgelegt wird. Dies sollte die Passwortabfrage vollständig beseitigen, ist jedoch noch weniger sicher als die vorherige Option.

Millimoose
quelle
Danke für die 2. Option, ich brauchte es.
Stanislav Verjikovskiy
1

Beim Versuch, meinen Code zu pushen, wurde der folgende Fehler angezeigt:

$ git push origin dev

remote: Too many invalid password attempts. Try logging in through the website with your password.
fatal: unable to access 'https://[email protected]/xxxx/xxxx-api.git/': The requested URL returned error: 403

Nach einigen Stunden Recherche stellte ich fest, dass ich den folgenden Befehl verwenden muss:

$ git config --global credential.helper cache

Nachdem ich den obigen Befehl ausgeführt hatte, wurde ich aufgefordert, meinen GitHub-Benutzernamen und mein Passwort einzugeben. Nachdem ich die richtigen Anmeldeinformationen angegeben habe, kann ich meinen Code weitergeben.

Naushad Qamar
quelle
Dies erzeugte gerade "git: 'credential-cache' ist kein git-Befehl." "Git config --global credential.helper store" hat jedoch funktioniert - dies ist möglicherweise nicht das Beste, aber ich bin gezwungen, HTTPS anstelle meines bevorzugten SSH zu verwenden und möchte nur, dass es funktioniert.
Terry Brown
0

Die richtige Lösung ist:

  1. Führen Sie das Windows-Standardterminal - cmd aus und rufen Sie das Verzeichnis Ihres Masterprofils ab

    echo %USERPROFILE%
    
  2. Führen Sie Git Bash im obigen Verzeichnis aus und erstellen Sie die .bashrcDatei mit dem Befehl

    echo "" > .bashrc
    
  3. Öffnen Sie die .bashrcDatei mit Ihrem bevorzugten Texteditor und fügen Sie Code aus der GitHub-Hilfe in diese Datei ein:

    env=~/.ssh/agent.env
    ...
    COPY WHOLE CODE FROM URL - I can't add it to Stack Overflow because it breaks layout... OMG!
    
  4. Starten Sie Git Bash neu und Sie werden nach Ihrem Passwort gefragt (nur beim ersten Mal) und fertig. Kein Passwort mehr störend.

Manische Depression
quelle
-1

Sie müssen die authorized_keysDatei unter dem .sshOrdner des Benutzers erstellen, unter dem Sie eine Verbindung zum Repository-Server herstellen möchten. Zum Beispiel, vorausgesetzt , Sie verwenden Benutzernamen buildserviceauf repo.serverSie ausführen können:

cd ~buidservice
mkdir ./ssh
cat id_rsa.pub >> .ssh/authorized_keys

Dann müssen Sie folgende Dinge überprüfen:

  1. Der entsprechende id_rsaprivate Schlüssel wird in dargestellt [email protected]:~/.shh/id_rsa.

  2. Dieser Fingerabdruck von repo.server wird in der [email protected]:~/.ssh/known_hostsDatei gespeichert . In der Regel erfolgt dies nach dem ersten Versuch ssh, eine Verbindung zum herzustellen repo.server.

Beduin
quelle
Ich vergesse zu sagen. Unter Windows haben Sie wahrscheinlich Home - Verzeichnis wäre C: \ Users \ Benutzername
beduin
5
Mmm .. Git Bash hat alles, lesen Sie den Titel der Frage genauer durch. Ebenfalls aus der Frage ging ich davon aus, dass das Schlüsselpaar bereits generiert wurde (weil gefragt wurde, wie der Repo-Server gezwungen werden soll, sich an id_rsa.pub zu erinnern). Entschuldigung für die Formatierung.
beduin
1
Ok, ich habe noch nie von 'git bash' gehört. Entschuldigung
Sie den
Ich gehe davon aus, dass dies msysgit verwendet. Ich füge das Tag hinzu.
Adam Dymitruk
3
Warnung! Mit cat id_rsa.pub > .ssh/authorized_keyswird alle vorhandenen autorisierten Schlüssel überschrieben. Verwenden Sie, >>um hinzuzufügen, anstatt zu überschreiben.
David Pärsson