410 Stimmen

Starten Sie ssh-agent beim Anmelden

Ich habe eine Site als Remote-Git-Repo, das von Bitbucket.com unter Verwendung eines SSH-Alias abruft. Ich kann den ssh-agent manuell auf meinem Server starten, aber ich muss dies jedes Mal tun, wenn ich mich über SSH anmelde.

Ich starte den ssh-agent manuell:

eval ssh-agent $SHELL

Dann füge ich den Agenten hinzu:

ssh-add ~/.ssh/bitbucket_id

Dann erscheint es, wenn ich Folgendes mache:

ssh-add -l

Und dann bin ich bereit. Gibt es eine Möglichkeit, diesen Prozess zu automatisieren, damit ich das nicht jedes Mal machen muss, wenn ich mich anmelde? Der Server läuft auf RedHat 6.2 (Santiago).

525voto

Litmus Punkte 9744

Bitte lesen Sie diesen Artikel durch. Sie werden dies sehr nützlich finden:

https://web.archive.org/web/20210506080335/https://mah.everybody.org/docs/ssh

Falls der obige Link eines Tages verschwindet, fange ich den Hauptteil der Lösung unten ein:

Diese Lösung von Joseph M. Reagle über Daniel Starin:

Fügen Sie dies in Ihr .bash_profile ein

SSH_ENV="$HOME/.ssh/agent-environment"

function start_agent {
    echo "Initialisieren eines neuen SSH-Agenten..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo erfolgreich
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

# SSH-Einstellungen einbinden, falls zutreffend

if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    #ps ${SSH_AGENT_PID} funktioniert nicht unter Cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

Diese Version ist besonders gut, da sie überprüft, ob Sie bereits ssh-agent gestartet haben und, wenn es nicht finden kann, startet es und speichert die Einstellungen, damit sie beim nächsten Mal, wenn Sie eine Shell starten, verwendet werden können.

202voto

spheenik Punkte 2139

Auf Arch Linux funktioniert Folgendes wirklich großartig (sollte auf allen auf systemd basierenden Distributionen funktionieren):

Erstellen Sie einen systemd-Benutzerdienst, indem Sie Folgendes in ~/.config/systemd/user/ssh-agent.service platzieren:

[Unit]
Description=SSH-Schlüssel-Agent

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

Richten Sie die Shell ein, um eine Umgebungsvariable für den Socket zu haben (.bash_profile, .zshrc, ...):

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

Aktivieren Sie den Dienst, damit er beim Anmelden automatisch gestartet wird, und starten Sie ihn:

systemctl --user enable ssh-agent
systemctl --user start ssh-agent

Fügen Sie die folgende Konfigurationseinstellung zu Ihrer lokalen SSH-Konfigurationsdatei ~/.ssh/config hinzu (dies funktioniert seit SSH 7.2):

AddKeysToAgent  yes

Dadurch wird der SSH-Client angewiesen, den Schlüssel immer zu einem laufenden Agenten hinzuzufügen, sodass es nicht erforderlich ist, ihn zuvor mit ssh-add hinzuzufügen.

166voto

xelber Punkte 3595

Alte Frage, aber ich bin auf eine ähnliche Situation gestoßen. Ich glaube nicht, dass die obige Antwort das vollständig erreicht, was benötigt wird. Das fehlende Stück ist keychain; installiere es, wenn es noch nicht vorhanden ist.

sudo apt-get install keychain

Dann füge die folgende Zeile zu deiner ~/.bashrc hinzu

eval $(keychain --eval id_rsa)

Dies startet den ssh-agent, wenn er nicht läuft, verbindet sich mit ihm, lädt die ssh-agent Umgebungsvariablen in deine Shell und lädt deinen ssh Schlüssel.

Ändere id_rsa zu dem privaten Schlüssel in ~/.ssh, den du laden möchtest.

Einige nützliche Optionen für keychain:

  • -q Ruhiger Modus
  • --noask Fordert beim Start nicht nach dem Passwort, sondern nur bei Bedarf an, wenn der ssh-Schlüssel tatsächlich verwendet wird.

Referenz

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt

44voto

Collin Anderson Punkte 13449

Fügen Sie dies zu Ihrer ~/.bashrc hinzu, dann melden Sie sich ab und wieder an, um es wirksam zu machen.

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add

Dies sollte nur beim ersten Einloggen nach jedem Neustart nach einem Passwort fragen. Es wird denselben ssh-agent wiederverwenden, solange er läuft.

41voto

midenok Punkte 840

Die akzeptierte Lösung hat folgende Nachteile:

  • es ist kompliziert zu pflegen;
  • es bewertet Speicherdatei, was zu Fehlern oder Sicherheitslücken führen kann;
  • es startet den Agenten, stoppt ihn aber nicht, was dem Verlassen des Schlüssels im Zündschloss entspricht.

Wenn Ihre Schlüssel kein Passwort benötigen, empfehle ich folgende Lösung. Fügen Sie das Folgende am sehr Ende Ihrer .bash_profile hinzu (bearbeiten Sie die Schlüsselliste nach Bedarf):

exec ssh-agent $BASH -s 10<&0 << EOF
    ssh-add ~/.ssh/your_key1.rsa \
            ~/.ssh/your_key2.rsa &> /dev/null
    exec $BASH <&10-
EOF

Es hat folgende Vorteile:

  • viel einfachere Lösung;
  • Agent-Sitzung endet, wenn die Bash-Sitzung endet.

Es hat mögliche Nachteile:

  • Interaktiver ssh-add Befehl beeinflusst nur eine Sitzung, was tatsächlich nur in sehr untypischen Umständen ein Problem ist;
  • nicht verwendbar, wenn das Eingeben eines Passworts erforderlich ist;
  • gestartete Shell wird nicht-anmeldende (was meines Wissens nach nichts beeinflusst).

Beachten Sie, dass mehrere ssh-agent Prozesse kein Nachteil sind, da sie keinen zusätzlichen Speicher oder CPU-Zeit verbrauchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X