web-dev-qa-db-fra.com

Comment vérifier si ssh-agent est déjà en cours d'exécution dans bash?

J'ai un exemple de script sh sur mon environnement Linux, qui exécute essentiellement le ssh-agent pour le shell actuel, lui ajoute une clé et exécute deux commandes git:

#!/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

Le script fonctionne vraiment bien, mais chaque fois que je l'exécute, j'obtiens un nouveau processus, donc je pense que cela pourrait devenir un problème de performances et je pourrais finir par avoir des processus inutiles.

Un exemple de sortie:

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

En plus de tout cela, est-il possible de trouver un ssh-agent traiter et y ajouter mes clés?

23
omerowitz

Non, vraiment, comment vérifier si ssh-agent est déjà en cours d'exécution dans bash?

Jusqu'à présent, les réponses ne semblent pas répondre à la question d'origine ...

Voici ce qui fonctionne pour moi:

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

Ceci est tiré de: https://stackoverflow.com/a/15774758

25
AndrewD

Si vous voulez qu'il soit tué juste après la fin du script, vous pouvez simplement l'ajouter après la ligne eval:

trap "kill $SSH_AGENT_PID" exit

Ou:

trap "ssh-agent -k" exit

$SSH_AGENT_PID est défini dans la valeur de ssh-agent -s.

Vous devriez pouvoir trouver des agents ssh en cours d'exécution en parcourant /tmp/ssh-* et reconstruire le SSH_AGENT variables de celui-ci (SSH_AUTH_SOCK et SSH_AGENT_PID).

8
Friek

En plus de tout cela, est-il possible de trouver un processus d'agent ssh existant et d'y ajouter mes clés?

Oui. Nous pouvons stocker les informations de connexion dans un fichier:

# 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

Ce code provient de pièges des agents ssh qui décrit à la fois les pièges de ce que vous faites actuellement, de cette approche et comment vous devez utiliser ssh-ident pour ce faire pour toi.


Si vous ne souhaitez exécuter ssh-agent que s'il ne fonctionne pas et ne rien faire d'autre:

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

Cependant, cela ne garantit pas que ssh-agent sera accessible (ce n'est pas parce qu'il fonctionne que nous avons $ SSH_AGENT_PID pour que ssh-add se connecte).

8
idbrii

La réponse acceptée n'a pas fonctionné pour moi sous Ubuntu 14.04.

Le test pour vérifier si l'agent ssh est en cours d'exécution que je dois utiliser est:

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

Et je démarre l'agent ssh avec:

exec ssh-agent bash

Sinon, le SSH_AGENT_PID n'est pas défini.

Les éléments suivants semblent fonctionner sous Ubuntu 14.04 et 18.04.

#!/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)"

Commande sur une seule ligne. Exécuter pour la première fois démarrera ssh-agent. Exécuter pour la deuxième fois ne démarre pas l'agent ssh. Compagnon simple et élégant !!!

2
iceman

En utilisant $SSH_AGENT_PID ne peut tester que ssh-agent mais il manque des identités quand il n'est pas encore ajouté

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

Il serait donc préférable de le vérifier avec ssh-add -l avec un attendez le script comme l'exemple ci-dessous:

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

Donc, quand les deux ssh-agent et ssh-add -l sont exécutés sur un script bash:

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

alors il vérifierait et s'assurerait toujours que la connexion fonctionne:

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

Vous pouvez également émuler la répétition des commandes sur le script ci-dessus avec do while

1
Chetabahana

Merci à toutes les réponses ici. J'ai utilisé ce fil plusieurs fois au fil des ans pour modifier mon approche. Je voulais partager mon script de vérificateur/lanceur ssh-agent.sh Actuel qui fonctionne pour moi sur Linux et OSX.

Le bloc suivant est mon $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

Je lance ce qui précède depuis mon .bashrc En utilisant:

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

J'espère que cela aide les autres à se lever et à aller vite.

Créé un Gist public si vous souhaitez pirater/améliorer cela avec moi: https://Gist.github.com/dayne/a97a258b487ed4d5e9777b61917f0a72

0
Dayne Broderson

Vous pouvez modifier la ligne # 1 pour:

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

Et puis à la fin du script, vous pouvez faire:

kill -9 $PID_SSH_AGENT
0
alok