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).

15voto

Sharak Punkte 858

Ich habe einige Lösungen aus vielen Quellen ausprobiert, aber alle schienen mir zu umständlich. Schließlich habe ich die einfachste gefunden :)

Wenn Sie noch nicht vertraut sind mit zsh und oh-my-zsh dann installieren Sie es. Sie werden es lieben :)

Dann bearbeiten Sie .zshrc

vim ~/.zshrc

Finden Sie den plugins Abschnitt und aktualisieren Sie ihn, um ssh-agent zu verwenden, wie folgt:

plugins=(ssh-agent git)

Und das ist alles! Sie haben ssh-agent jedes Mal aktiviert, wenn Sie Ihre Shell starten

10voto

Keego Punkte 3589

Nur um noch eine weitere Lösung hinzuzufügen :P, ich habe eine Kombination aus den Lösungen von @spheenik und @collin-anderson verwendet.

 # Stellen Sie sicher, dass wir eine SSH-Konfiguration mit AddKeysToAgent auf true haben
 if [ ! -f ~/.ssh/config ] || ! cat ~/.ssh/config | grep AddKeysToAgent | grep yes > /dev/null; then
     echo "AddKeysToAgent  yes" >> ~/.ssh/config
 fi
 # Stellen Sie sicher, dass ein ssh-agent läuft, damit Sie die Schlüssel nur einmal eingeben müssen
 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

Könnte etwas eleganter sein, aber es ist einfach und lesbar. Diese Lösung:

  • stellt sicher, dass AddKeysToAgent yes in Ihrer SSH-Konfiguration steht, damit Schlüssel automatisch hinzugefügt werden
  • fordert Sie nicht auf, bei der Anmeldung Passphrasen einzugeben (erneute Passphraseneingabe erfolgt nur bei der ersten Verwendung)
  • startet stillschweigend einen ssh-agent, wenn keiner bereits gestartet wurde

Kommentare willkommen :)

8voto

Micah Punkte 452

Also früher habe ich die oben beschriebenen Ansätze verwendet, aber irgendwie ziehe ich es vor, dass der Agent stirbt, wenn meine letzte BASH-Sitzung endet. Dies ist etwas länger als die anderen Lösungen, aber es ist mein bevorzugter Ansatz. Die grundlegende Idee ist, dass die erste BASH-Sitzung den SSH-Agenten startet. Dann überprüft jede zusätzliche BASH-Sitzung die Konfigurationsdatei (~/.ssh/.agent_env). Wenn diese vorhanden ist und eine Sitzung läuft, dann wird die Umgebung geladen und ein Hardlink zur Socket-Datei in /tmp erstellt (muss auf demselben Dateisystem wie die Original-Socket-Datei sein). Wenn BASH-Sitzungen heruntergefahren werden, löscht jede ihre eigenen Hardlinks. Die letzte Sitzung, die geschlossen wird, findet heraus, dass die Hardlinks 2 Verknüpfungen haben (den Hardlink und das Original), das Entfernen des eigenen Sockets des Prozesses und das Beenden des Prozesses führen zu 0 und hinterlassen nach dem Schließen der letzten BASH-Sitzung eine saubere Umgebung.

# Starte den SSH-Agenten, um angemeldet zu bleiben mit Schlüsseln, verwende `ssh-add` zum Einloggen
agent=`pgrep ssh-agent -u $USER` # nur deine Agenten finden           
if [[ "$agent" == "" || ! -e ~/.ssh/.agent_env ]]; then
    # Wenn keine Agenten vorhanden sind oder die Umgebungsdatei fehlt, eine neue erstellen
    # alte Agenten/Umgebungsvariablen-Dateien entfernen
    kill $agent Ausführung beendet
    rm ~/.ssh/.agent_env 

    # neu starten
    eval `ssh-agent` 
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ~/.ssh/.agent_env             
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ~/.ssh/.agent_env             
fi

# erstelle unseren eigenen Hardlink zur Socket-Datei (mit zufälligem Namen)           
source ~/.ssh/.agent_env                                                    
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock                                        
ln -T $SSH_AUTH_SOCK $MYSOCK                                                
export SSH_AUTH_SOCK=$MYSOCK                                                

end_agent()                                                                     
{
    # wenn wir der letzte Inhaber eines Hardlinks sind, dann den Agenten beenden
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`                             
    if [[ "$nhard" -eq 2 ]]; then                                               
        rm ~/.ssh/.agent_env                                                    
        ssh-agent -k                                                            
    fi                                                                          
    rm $SSH_AUTH_SOCK                                                           
}                                                                               
trap end_agent EXIT                                                             
set +x

4voto

TheFrog Punkte 41

Ich habe es gelöst, indem ich dies zur /etc/profile hinzugefügt habe - systemweit (oder zur lokalen .profile des Benutzers oder .bash_profile):

# SSH-AGENT 
#!/usr/bin/env bash
SERVICE='ssh-agent'
WHOAMI=`whoami |awk '{print $1}'`

if pgrep -u $WHOAMI $SERVICE >/dev/null
then
    echo $SERVICE läuft.
else
    echo $SERVICE läuft nicht.
    echo starte
    ssh-agent > ~/.ssh/agent_env
fi
. ~/.ssh/agent_env

Dies startet einen neuen ssh-agent, wenn er für den aktuellen Benutzer nicht läuft, oder setzt die ssh-agent-Umgebungsparameter neu, wenn er läuft.

4voto

Daniel Gerber Punkte 2902

Nutzer der Fish-Shell können dieses Skript verwenden, um dasselbe zu tun.

# Inhalt muss in .config/fish/config.fish sein
# falls es nicht existiert, die Datei erstellen
setenv SSH_ENV $HOME/.ssh/environment

function start_agent
    echo "Initialisiere neuen SSH-Agent ..."
    ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
    echo "erfolgreich"
    chmod 600 $SSH_ENV 
    . $SSH_ENV > /dev/null
    ssh-add
end

function test_identities
    ssh-add -l | grep "Der Agent hat keine Identitäten" > /dev/null
    if [ $status -eq 0 ]
        ssh-add
        if [ $status -eq 2 ]
            start_agent
        end
    end
end

if [ -n "$SSH_AGENT_PID" ] 
    ps -ef | grep $SSH_AGENT_PID | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    end  
else
    if [ -f $SSH_ENV ]
        . $SSH_ENV > /dev/null
    end  
    ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    else 
        start_agent
    end  
end

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