Konfigurieren von Git über SSH für die einmalige Anmeldung

195

Ich habe mein Git-Repository über ssh geklont. Jedes Mal, wenn ich durch Drücken oder Ziehen mit dem Ursprungsmaster kommuniziere, muss ich mein Passwort erneut eingeben. Wie kann ich git so konfigurieren, dass ich mein Passwort nicht mehrmals eingeben muss?

Umprogrammierer
quelle
7
Scheint ein Sicherheitsproblem zu sein, Sie müssen keine Passwörter verwenden, um normale Commits durchzuführen, aber ein Push ist die Art von Dingen, mit denen Sie sich erneut authentifizieren möchten, aber vielleicht bin ich altmodisch.
Alex Sexton

Antworten:

104

Versuchen Sie ssh-add, Sie müssen ssh-agentIhren privaten Schlüssel ausführen und halten

(Ok, wenn Sie auf die aktualisierte Frage antworten, führen Sie zuerst ssh-keygeneinen öffentlichen und einen privaten Schlüssel aus, wie Jefromi erklärt hat . Sie legen den öffentlichen Schlüssel auf dem Server ab. Sie sollten eine Passphrase verwenden, wenn Sie nicht das Äquivalent einer Ebene haben -text Passwort in Ihrem privaten Schlüssel. Aber wenn Sie dies tun, dann brauchen Sie als praktische Angelegenheit ssh-agentwie unten erklärt.)

Sie möchten beim ssh-agentAnmelden im Hintergrund ausgeführt werden. Sobald Sie sich angemeldet haben, sollten Sie ssh-addeinmal und nur einmal ausgeführt werden, um dem Agenten Ihre Passphrase zu geben und Ihren Schlüssel zu dekodieren. Der Agent sitzt dann einfach im Speicher, Ihr Schlüssel ist entsperrt und geladen und kann jedes Mal verwendet werden, wenn Sie irgendwo ssh.

Alle Befehle der ssh-Familie 1 konsultieren dann den Agenten und können automatisch Ihren privaten Schlüssel verwenden.

Unter OSX (err, macOS ) werden GNOME- und KDE-Systeme ssh-agentnormalerweise automatisch für Sie gestartet. Ich werde die Details durchgehen, falls Sie wie ich auch eine Cygwin- oder andere Windows-Umgebung haben, in der dies mit Sicherheit nicht für Sie erledigt wird.

Beginnen Sie hier : man ssh-agent.

Es gibt verschiedene Möglichkeiten, den Agenten automatisch auszuführen. Wie in der Manpage erläutert, können Sie es so ausführen, dass es übergeordnet zu allen anderen Prozessen Ihrer Anmeldesitzung ist. Auf diese Weise befinden sich die bereitgestellten Umgebungsvariablen automatisch in allen Ihren Shells. Wenn Sie (später) aufrufen ssh-addoder sshbeide Zugriff auf den Agenten haben, haben alle Umgebungsvariablen mit magischen Socket-Pfadnamen oder was auch immer.

Alternativ können Sie den Agenten als normales untergeordnetes Element ausführen, die Umgebungseinstellungen in einer Datei speichern und diese Datei beim Start in jeder Shell als Quelle verwenden.

Meine OSX- und Ubuntu-Systeme führen automatisch die Einrichtung zum Starten des Agenten durch. Ich muss sie also nur ssh-addeinmal ausführen . Versuchen Sie es auszuführen ssh-addund prüfen Sie, ob es funktioniert. Wenn ja, müssen Sie dies nur einmal pro Neustart tun.

Mein Cygwin-System musste manuell erstellt werden, also habe ich dies in meinem .profileund ich habe .bashrcQuelle .profile:

. .agent > /dev/null
ps -p $SSH_AGENT_PID | grep ssh-agent > /dev/null || {
        ssh-agent > .agent
        . .agent > /dev/null
}

Die .agentDatei wird automatisch vom Skript erstellt. Es enthält die Definitionen und Exporte der Umgebungsvariablen. Das obige versucht, die .agent-Datei als Quelle zu erstellen, und versucht dann, sie an ps(1)den Agenten weiterzuleiten . Wenn es nicht funktioniert, startet es einen Agenten und erstellt eine neue Agentendatei. Sie können auch einfach ausführen ssh-addund bei einem Fehler einen Agenten starten.


1. Und sogar lokal und fern sudomit der richtigen Pam-Erweiterung.

DigitalRoss
quelle
1
Anstatt die Ausgabe von ssh-agentzu beziehen, ist es wahrscheinlich ordentlicher zu verwenden:eval `ssh-agent`
schottisch
285

Hatte ein ähnliches Problem mit dem GitHub, weil ich das HTTPS-Protokoll verwendete. Um zu überprüfen, welches Protokoll Sie verwenden, führen Sie es einfach aus

git config -l

und schauen Sie sich die Zeile an, die mit beginnt remote.origin.url. So wechseln Sie Ihr Protokoll

git config remote.origin.url [email protected]:your_username/your_project.git
Muein Muzamil
quelle
12
Ich denke das sollte die offizielle Antwort sein, ^ 5 @Muein!
Fer Martin
14
Dies funktioniert nicht, wenn Repo privat ist und Sie nicht der Eigentümer sind. Ich habe gerade einen Permission deniedFehler gemacht.
ogzd
7
Dies ist nur für ein Repo. Wie kann ich es global machen?
onmyway133
2
@ogzd GitHub (oder welcher Dienst auch immer Sie verwenden) benötigt Ihren öffentlichen SSH-Schlüssel, bevor dies funktioniert, aber dies ist immer noch die richtige Lösung.
MattM
eine Alternative istgit remote set-url origin [email protected]:your_username/your_project.git
icosamuel
24

Hier geht es darum, ssh zu konfigurieren, nicht git. Wenn Sie dies noch nicht getan haben, sollten Sie ssh-keygen(mit einer leeren Passphrase) ein Schlüsselpaar erstellen. Anschließend kopieren Sie den öffentlichen Schlüssel mit auf das Remote-Ziel ssh-copy-id. Wenn Sie nicht mehrere Schlüssel benötigen (z. B. einen sichereren mit einer Passphrase für andere Zwecke) oder einige wirklich seltsame Dinge mit mehreren Identitäten vor sich haben, ist dies ganz einfach:

ssh-keygen   # enter a few times to accept defaults
ssh-copy-id -i ~/.ssh/id_rsa user@host

Bearbeiten: Sie sollten eigentlich nur die Antwort von DigitalRoss lesen, aber: Wenn Sie Schlüssel mit Passphrasen verwenden, müssen Sie ssh-add <key-file>diese hinzufügen ssh-agent(und natürlich eine starten, ssh-agentwenn in Ihrer Distribution noch keine für Sie ausgeführt wird).

Cascabel
quelle
2
Ich bin mir nicht sicher, ob dies die Frage beantwortet, er muss das bereits getan haben, sonst könnte er die Site nicht erreichen. Die Antwort, die er braucht, ist: ssh-agentDa er das Problem der Passphrase jedes Mal umgehen möchte. Kein Downvoting, aber ich denke, Sie müssen diese Antwort verbessern, es sei denn, ich bin derjenige, der falsch verstanden hat ...
DigitalRoss
2
@ DigitalRoss: Ah, ich war mir beim Lesen der Frage nicht sicher, ob das OP tatsächlich die Schlüssel eingerichtet hatte. Sie haben wahrscheinlich Recht, und ich habe absichtlich versucht, keine Passphrase zu verwenden. Sie haben jedoch natürlich Recht ssh-agent. +1 für dich!
Cascabel
Ich bin verwirrt, ob ich ssh-keygen oder ssh-add verwenden muss. In meinem Verzeichnis ~ / .ssh / habe ich nur zwei Dateien: config und unknown_hosts. Es scheint, dass ssh-add eine andere Datei ~ / .ssh / id_rsa erfordert. Sollte ich diese Datei zuerst mit ssh-keygen erstellen, wie @Jefromi erklärt hat?
Umprogrammierer
Ja, Sie müssen den Schlüssel erstellen, bevor Sie ihn auf den Remote-Server kopieren können. Ich denke, wir waren vielleicht verwirrt, als Sie das Wort "Passphrase" verwendeten - das ssh-*nennt man die Passphrase, die zur Verwendung des Schlüssels benötigt wird -, wo Sie wirklich Ihr tatsächliches Benutzerkennwort auf der Fernbedienung gemeint haben?
Cascabel
Ja, ich hätte das Passwort anstelle der Passphrase sagen sollen.
Reprogrammierer
23

Stellen Sie sicher, dass Sie beim Klonen des Repositorys die SSH-URL und nicht das HTTPS verwendet haben. Wählen Sie im Feld Klon-URL des Repos das SSH-Protokoll aus, bevor Sie die URL kopieren. Siehe Bild unten:

Geben Sie hier die Bildbeschreibung ein

Zorayr
quelle
23

Wenn Sie mit HTTPS geklont haben (empfohlen), dann: -

git config --global credential.helper cache

und dann

git config --global credential.helper 'cache --timeout=2592000'
  • timeout = 2592000 (30 Tage in Sekunden), um das Caching für 30 Tage zu aktivieren (oder was auch immer für Sie geeignet ist).

  • Führen Sie nun einen einfachen git-Befehl aus, für den Sie Ihren Benutzernamen und Ihr Kennwort benötigen.

  • Geben Sie Ihre Anmeldeinformationen einmal ein und jetzt ist das Caching für 30 Tage aktiviert.

  • Versuchen Sie es erneut mit einem git-Befehl, und jetzt benötigen Sie keine Anmeldeinformationen mehr.

  • Für weitere Informationen: - Zwischenspeichern Ihres GitHub-Passworts in Git

Hinweis : Sie benötigen Git 1.7.10 oder neuer, um den Helfer für Anmeldeinformationen zu verwenden. Beim Neustart des Systems müssen wir möglicherweise das Kennwort erneut eingeben.

Nishant Thapliyal
quelle
1
Sie sind ein Retter und hatten es satt, jedes Mal ein Passwort für den Benutzernamen einzugeben. Danke :)
Dave Ranjan
Bitte geben Sie an, ob dies nur für Linux oder nur für Windows oder für beide gilt.
Joedotnot
@joedotnot für alle Betriebssysteme. Sie können auch den genannten Link durchsuchen und dort finden Sie die Betriebssystemoption direkt unter der Überschrift.
Nishant Thapliyal
Dies! Funktioniert in jedem Fall.
Akaisteph7
@ Charles Hallo, ich habe gerade das gleiche getestet und es funktioniert wie erwartet.
Nishant Thapliyal
8

Erweiterung von Mueins Gedanken für diejenigen, die es vorziehen, Dateien direkt zu bearbeiten, anstatt Befehle in Git-Bash oder Terminal auszuführen.

Wechseln Sie in das .git-Verzeichnis Ihres Projekts (Projektstamm auf Ihrem lokalen Computer) und öffnen Sie die Konfigurationsdatei. Suchen Sie dann nach [remote "origin"] und stellen Sie die URL-Konfiguration wie folgt ein:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = [email protected]:<username>/<projectname>.git
uchamp
quelle
1
Das hat wirklich geholfen. Sichere und saubere Methode zur Behebung des Problems. Ich denke, jemand sollte Mueins Antwort mit dieser verbessern.
Luis Ortega Araneda
1
"Gehen Sie zum .git-Verzeichnis Ihres Projekts" und versuchen Sie es zum ersten Mal
eigentümlichen
Erhalten dieses Fehlers "fatal: Ich behandle nicht das Protokoll '[email protected]: <Benutzername> / https'"
Shivam Bharadwaj
@ShivamBharadwaj eine schnelle Suche ergab diesen Thread stackoverflow.com/questions/30474447/… . Gibt es eine Möglichkeit, dass Sie den Befehl git clone von einer Website kopieren und auf dieses Problem stoßen? Wenn ja, geben Sie stattdessen den vollständigen Befehl ein.
Uchamp
6

Ich denke, hier gibt es zwei verschiedene Dinge. Die erste ist, dass bei der normalen SSH-Authentifizierung der Benutzer das Kennwort des Kontos eingeben muss (wobei das Kennwort des Kontos je nach sshd-Konfiguration anhand verschiedener Methoden authentifiziert wird).

Sie können vermeiden, dieses Kennwort mithilfe von Zertifikaten zu verwenden. Bei Zertifikaten müssen Sie noch ein Passwort eingeben, diesmal jedoch das Passwort Ihres privaten Schlüssels (das unabhängig vom Passwort des Kontos ist).

Befolgen Sie dazu die Anweisungen von steveth45:

Mit öffentlicher Schlüsselauthentifizierung .

Wenn Sie vermeiden möchten, das Kennwort des Zertifikats jedes Mal einzugeben, können Sie ssh-agent verwenden, wie von DigitalRoss hervorgehoben

Die genaue Vorgehensweise hängt von Unix und Windows ab. Im Wesentlichen müssen Sie jedoch ssh-agent im Hintergrund ausführen, wenn Sie sich anmelden. Wenn Sie sich zum ersten Mal anmelden, führen Sie ssh-add aus, um dem Agenten Ihre Passphrase zu geben. Alle Befehle der ssh-Familie konsultieren dann den Agenten und nehmen automatisch Ihre Passphrase auf.

Beginnen Sie hier: man ssh-agent.

Das einzige Problem von ssh-agent ist, dass Sie zumindest unter * nix das Zertifikatspasswort für jede neue Shell eingeben müssen. Dann wird das Zertifikat "geladen" und Sie können es zur Authentifizierung bei einem SSH-Server verwenden, ohne ein Kennwort einzugeben. Aber das ist auf dieser speziellen Hülle.

Mit Schlüsselbund können Sie dasselbe tun wie mit ssh-agent, jedoch "systemweit". Sobald Sie Ihren Computer einschalten, öffnen Sie eine Shell und geben das Kennwort des Zertifikats ein. Und dann verwendet jede andere Shell dieses "geladene" Zertifikat und Ihr Passwort wird nie wieder abgefragt, bis Sie Ihren PC neu starten.

Gnome hat eine ähnliche Anwendung namens Gnome Keyring , die bei der ersten Verwendung nach dem Kennwort Ihres Zertifikats fragt und es dann sicher speichert, damit Sie nicht erneut gefragt werden.

Gaston
quelle
Ich benutze den Schlüsselbund selbst: sehr nützlich.
Jakub Narębski
Es gibt noch einen Weg durch Schreiben AddKeysToAgent yes in .ssh / config . Dann wird es in den Speicher geladen, bis Sie den Computer
ausschalten
4
ssh-keygen -t rsa

Wenn Sie nach einer Passphrase gefragt werden, lassen Sie diese leer, drücken Sie einfach die Eingabetaste. so einfach ist das!!

Srinivas Kattimani
quelle
4
Beachten Sie, dass in diesem Fall jeder, der Zugriff auf Ihren Entwicklungsclient hat, Zugriff auf den Repository-Server hat, ohne ein Kennwort zu benötigen. Die Kombination ssh-agent / ssh-add bietet eine viel bessere Sicherheit.
Peter V. Mørch
3

Versuchen Sie dies aus der Box, aus der Sie schieben

    ssh [email protected]

Sie sollten dann eine willkommene Antwort von Github erhalten und es wird in Ordnung sein, dann zu pushen.

zu senden
quelle
2
Es funktioniert für mich Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.Aber irgendwie fragt mich Git immer noch nach dem Passwort, wenn ich versuche zu pushen
gkucmierz
2

Ich musste ein Git-Repo von einem Server klonen, der keine Anmeldung über den SSH-Schlüssel erlaubte, sondern nur mit einem Benutzer / Passwort. Ich habe keine Möglichkeit gefunden, das Git-Plugin für die Verwendung einer einfachen Benutzer- / Kennwortkombination zu konfigurieren. Daher habe ich den folgenden Shell-Befehl als Pre-Build-Schritt auf einem Linux-Build-Computer hinzugefügt, der vom erwarteten Tool abhängt (apt-get install require):

Dies ist keine gute Möglichkeit, dieses Problem zu lösen, da Ihr Passwort als klarer Text in der Konfiguration und den Protokollen des Jenkins-Jobs angezeigt wird. Verwenden Sie es nur, wenn es keine Möglichkeit gibt, die RSA-KEY-Authentifizierung oder andere Konfigurationsmöglichkeiten zu konfigurieren!

rm -rf $WORKSPACE &&
expect -c 'set timeout -1; spawn git clone USER@MYHOST:/MYPATH/MYREPO.git $WORKSPACE; expect "password:" {send "MYPASSWORD\r"}; expect eof'
Jan.
quelle
1

Fügen Sie AddKeysToAgent yesoben in der .ssh / config-Datei eine einzelne Zeile hinzu . Natürlich muss ssh-agent vorher laufen. Wenn es nicht läuft (check by prep ssh-agent), dann führen Sie es einfach auseval $(ssh-agent)

Jetzt wird der Schlüssel systemweit in den Speicher geladen und Sie müssen die Passphrase nicht erneut eingeben.

Die Quelle der Lösung ist /ubuntu/362280/enter-ssh-passphrase-once/853578#853578

infoclogged
quelle
0

Ich habe versucht zu vermeiden, die Passphrase ständig einzugeben, auch weil ich ssh unter Windows verwende. Ich habe meine .profile-Datei so geändert, dass ich in einer bestimmten Sitzung meine Passphrase eins eingebe. Das ist also der Code:

    SSH_ENV="$HOME/.ssh/environment"

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
        echo succeeded
        chmod 600 "$SSH_ENV"
        . "$SSH_ENV" > /dev/null
        ssh-add
    }

    # test for identities
    function test_identities {
        # test whether standard identities have been added to the agent already
        ssh-add -l | grep "The agent has no identities" > /dev/null
        if [ $? -eq 0 ]; then
            ssh-add
            # $SSH_AUTH_SOCK broken so we start a new proper agent
            if [ $? -eq 2 ];then
                start_agent
            fi
        fi
    }

    # check for running ssh-agent with proper $SSH_AGENT_PID
    if [ -n "$SSH_AGENT_PID" ]; then
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
      test_identities
        fi
    # if $SSH_AGENT_PID is not properly set, we might be able to load one from
    # $SSH_ENV
    else
        if [ -f "$SSH_ENV" ]; then
      . "$SSH_ENV" > /dev/null
        fi
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
            test_identities
        else
            start_agent
        fi
    fi

Also gebe ich meine Passphrase einmal in einer Sitzung ein.

David Blay
quelle
-1

Ich habe all diese Vorschläge und mehr ausprobiert, nur um einen Klon von meiner AWS-Instanz zu erstellen. Nichts hat geklappt. Ich habe schließlich aus Verzweiflung betrogen: Ich habe den Inhalt von id_rsa.pub auf meinen lokalen Computer kopiert und ihn an ~ / .ssh / unknown_hosts auf meiner AWS-Instanz angehängt.

alansendgi
quelle
1
Bist du sicher, dass du nicht ~ / .ssh / autorisierte_Tasten meinst?
Kevin_Kinsey