it-swarm.com.de

Wie überprüfe ich, ob ssh-agent bereits in bash läuft?

Ich habe ein Beispielskript sh in meiner Linux-Umgebung, das im Grunde genommen den ssh-agent Für die aktuelle Shell ausführt, einen Schlüssel hinzufügt und zwei git-Befehle ausführt:

#!/bin/bash
eval "$(ssh-agent -s)"
ssh-add /home/duvdevan/.ssh/id_rsa

git -C /var/www/duvdevan/ reset --hard Origin/master
git -C /var/www/duvdevan/ pull Origin master

Das Skript funktioniert tatsächlich einwandfrei, aber jedes Mal, wenn ich es ausführe, erhalte ich einen neuen Prozess, sodass ich denke, dass dies zu einem Leistungsproblem wird und dass es möglicherweise nutzlose Prozesse gibt.

Ein Beispiel für die Ausgabe:

Agent pid 12109
Identity added: /home/duvdevan/.ssh/custom_rsa (rsa w/o comment)

Ist es außerdem möglich, einen vorhandenen ssh-agent - Prozess zu finden und meine Schlüssel hinzuzufügen?

23
omerowitz

Nein, wie kann man wirklich überprüfen, ob ssh-agent bereits in bash läuft?

Bisherige Antworten scheinen die ursprüngliche Frage nicht zu beantworten ...

Folgendes funktioniert bei mir:

if ps -p $SSH_AGENT_PID > /dev/null
then
   echo "ssh-agent is already running"
   # Do something knowing the pid exists, i.e. the process with $PID is running
else
eval `ssh-agent -s`
fi

Dies wurde entnommen aus: https://stackoverflow.com/a/15774758

25
AndrewD

Wenn Sie möchten, dass es direkt nach dem Beenden des Skripts beendet wird, können Sie dies einfach nach der Auswertungszeile hinzufügen:

trap "kill $SSH_AGENT_PID" exit

Oder:

trap "ssh-agent -k" exit

$SSH_AGENT_PID Wird in der Auswertung von ssh-agent -s Gesetzt.

Sie sollten in der Lage sein, laufende ssh-Agenten zu finden, indem Sie /tmp/ssh-* Durchsuchen und die SSH_AGENT - Variablen daraus rekonstruieren (SSH_AUTH_SOCK Und SSH_AGENT_PID).

8
Friek

Ist es außerdem möglich, einen vorhandenen ssh-agent-Prozess zu finden und meine Schlüssel hinzuzufügen?

Ja. Wir können die Verbindungsinformationen in einer Datei speichern:

# Ensure agent is running
ssh-add -l &>/dev/null
if [ "$?" == 2 ]; then
    # Could not open a connection to your authentication agent.

    # Load stored agent connection info.
    test -r ~/.ssh-agent && \
        eval "$(<~/.ssh-agent)" >/dev/null

    ssh-add -l &>/dev/null
    if [ "$?" == 2 ]; then
        # Start agent and store agent connection info.
        (umask 066; ssh-agent > ~/.ssh-agent)
        eval "$(<~/.ssh-agent)" >/dev/null
    fi
fi

# Load identities
ssh-add -l &>/dev/null
if [ "$?" == 1 ]; then
    # The agent has no identities.
    # Time to add one.
    ssh-add -t 4h
fi

Dieser Code stammt von Fallstricke von ssh-Agenten , der sowohl die Fallstricke Ihres aktuellen Vorgehens als auch die Art und Weise beschreibt, wie Sie ssh-ident verwenden sollten, um dies zu tun für dich.


Wenn Sie ssh-agent nur ausführen möchten, wenn es nicht ausgeführt wird, und nichts anderes tun möchten:

if [ $(ps ax | grep [s]sh-agent | wc -l) -gt 0 ] ; then
    echo "ssh-agent is already running"
else
    eval $(ssh-agent -s)
    if [ "$(ssh-add -l)" == "The agent has no identities." ] ; then
        ssh-add ~/.ssh/id_rsa
    fi

    # Don't leave extra agents around: kill it on exit. You may not want this part.
    trap "ssh-agent -k" exit
fi

Dies stellt jedoch nicht sicher, dass auf den ssh-agent zugegriffen werden kann (nur weil er ausgeführt wird, bedeutet dies nicht, dass wir $ SSH_AGENT_PID für ssh-add haben, zu dem eine Verbindung hergestellt werden kann).

8
idbrii

Die akzeptierte Antwort hat bei mir unter Ubuntu 14.04 nicht funktioniert.

Der Test, um zu überprüfen, ob der SSH-Agent ausgeführt wird, den ich verwenden muss, lautet:

[[ ! -z ${SSH_AGENT_PID+x} ]]

Und ich starte den ssh-agent mit:

exec ssh-agent bash

Ansonsten der SSH_AGENT_PID ist nicht gesetzt.

Das Folgende scheint unter Ubuntu 14.04 und 18.04 zu funktionieren.

#!/bin/bash
sshkey=id_rsa
# Check ssh-agent
if [[ ! -z ${SSH_AGENT_PID+x} ]]
then
    echo "[OK] ssh-agent is already running with pid: "${SSH_AGENT_PID}
else
    echo "Starting new ssh-agent..."
    `exec ssh-agent bash`
    echo "Started agent with pid: "${SSH_AGENT_PID}
fi
# Check ssh-key
if [[ $(ssh-add -L | grep ${sshkey} | wc -l) -gt 0 ]]
then
    echo "[OK] SSH key already added to ssh-agent"
else
    echo "Need to add SSH key to ssh-agent..."
    # This should Prompt for your passphrase
    ssh-add ~/.ssh/${sshkey}
fi
2
SveborK

ps -p $SSH_AGENT_PID > /dev/null || eval "$(ssh-agent -s)"

Einzeiliger Befehl. Beim ersten Start wird ssh-agent gestartet. Beim zweiten Start wird der ssh-agent nicht gestartet. Einfacher und eleganter Kamerad !!!

2
iceman

Mit $SSH_AGENT_PID Können Sie nur den ssh-agent Testen, aber Identitäten verpassen, wenn dieser noch nicht hinzugefügt wurde

$ eval `ssh-agent`
Agent pid 9906
$ echo $SSH_AGENT_PID
9906
$ ssh-add -l
The agent has no identities.

Es wäre also sicher, dies mit ssh-add -l Mit einem Erwarten Sie ein Skript wie im folgenden Beispiel zu überprüfen:

$ eval `ssh-agent -k`
Agent pid 9906 killed
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-add -l &>/dev/null
$ [[ "$?" == 2 ]] && eval `ssh-agent`
Agent pid 9547
$ ssh-add -l &>/dev/null
$ [[ "$?" == 1 ]] && expect $HOME/.ssh/agent
spawn ssh-add /home/user/.ssh/id_rsa
Enter passphrase for /home/user/.ssh/id_rsa: 
Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)
$ ssh-add -l
4096 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /home/user/.ssh/id_rsa (RSA)

Wenn also sowohl ssh-agent Als auch ssh-add -l In einem Bash-Skript ausgeführt werden:

#!/bin/bash
ssh-add -l &>/dev/null
[[ "$?" == 2 ]] && eval `ssh-agent`
ssh-add -l &>/dev/null
[[ "$?" == 1 ]] && expect $HOME/.ssh/agent

dann würde es immer überprüfen und sicherstellen, dass die Verbindung läuft:

$ ssh-add -l
4096 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /home/user/.ssh/id_rsa (RSA)

Sie können auch die Wiederholung von Befehlen im obigen Skript mit do while emulieren

1
Chetabahana

Vielen Dank an alle Antworten hier. Ich habe diesen Thread im Laufe der Jahre einige Male verwendet, um meinen Ansatz zu optimieren. Wollte mein aktuelles ssh-agent.sh - Überprüfungs-/Startskript teilen, das für mich unter Linux und OSX funktioniert.

Der folgende Block ist mein $HOME/.bash.d/ssh-agent.sh

function check_ssh_agent() {
  if [ -f $HOME/.ssh-agent ]; then
    source $HOME/.ssh-agent > /dev/null
  else
    # no agent file
    return 1
  fi

  if [[ ${OSTYPE//[0-9.]/} == 'darwin' ]]; then
    ps -p $SSH_AGENT_PID > /dev/null  
    # gotcha: does not verify the PID is actually an ssh-agent
    # just that the PID is running
    return $?
  fi

  if [ -d /proc/$SSH_AGENT_PID/ ]; then
    # verify PID dir is actually an agent
    grep ssh-agent /proc/$SSH_AGENT_PID/cmdline  > /dev/null  2> /dev/null; 
    if [ $? -eq 0 ]; then
      # yep - that is an agent
      return 0
    else
      # nope - that is something else reusing the PID
      return 1
    fi
  else
    # agent PID dir does not exist - dead agent
    return 1
  fi 
}

function launch_ssh_agent() {
  ssh-agent > $HOME/.ssh-agent
  source $HOME/.ssh-agent
  # load up all the pub keys
  for I in $HOME/.ssh/*.pub ; do
    echo adding ${I/.pub/}
    ssh-add ${I/.pub/}
  done
}

check_ssh_agent
if [ $? -eq 1 ];then
  launch_ssh_agent
fi

Ich starte das Obige von meinem .bashrc Aus mit:

if [ -d $HOME/.bash.d ]; then
  for I in $HOME/.bash.d/*.sh; do
    source $I  
  done
fi

Hoffe, dies hilft anderen, schnell aufzustehen und loszulegen.

Erstellt ein öffentliches Gist, wenn Sie dies mit mir hacken/verbessern möchten: https://Gist.github.com/dayne/a97a258b487ed4d5e9777b61917f0a72

0
Dayne Broderson

Sie können Zeile 1 folgendermaßen ändern:

PID_SSH_AGENT=`eval ssh-agent -s | grep -Po "(?<=pid\ ).*(?=\;)"`

Und am Ende des Skripts können Sie Folgendes tun:

kill -9 $PID_SSH_AGENT
0
alok