81 votes

Partager le même `ssh-agent` entre plusieurs sessions de connexion

Existe-t-il un moyen pratique de s'assurer que toutes les connexions d'un utilisateur donné (c'est-à-dire moi) utilisent le même agent ssh ? J'ai bricolé un script pour que cela fonctionne la plupart du temps, mais je soupçonnais depuis le début qu'il y avait un moyen de le faire que j'avais juste manqué. De plus, depuis cette époque, il y a eu des avancées étonnantes dans la technologie informatique, comme par exemple ce site web.

Donc le but ici est que

  • à chaque fois que je me connecte à la boîte, que ce soit via SSH, ou dans une session graphique lancée depuis gdm/kdm/etc, ou sur une console :
    • si mon nom d'utilisateur n'a pas actuellement un ssh-agent en cours d'exécution, l'un d'entre eux est démarré, les variables d'environnement sont exportées, et ssh-add appelé.
    • sinon, les coordonnées de l'agent existant sont exportées dans les variables d'environnement de la session de connexion.

Cette facilité est particulièrement précieuse lorsque la boîte en question est utilisée comme point de relais lorsque ssh dans une troisième boîte. Dans ce cas, cela évite d'avoir à taper la phrase de passe de la clé privée à chaque fois que vous vous connectez par ssh et que vous voulez, par exemple, faire git push ou quelque chose comme ça.

Le script donné ci-dessous fait cela de manière plutôt fiable, bien qu'il ait récemment bâclé lorsque X a planté et que j'ai ensuite lancé une autre session graphique. Il se peut qu'il y ait eu d'autres problèmes dans ce cas.

Voici mon script mauvais est bon. Je le tire de mon .bashrc .

# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.

mkdir -p "$HOME/etc/ssh";

function ssh-procure-launch-agent {
    eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
    ssh-add;
}

if [ ! $SSH_AGENT_PID ]; then
  if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
    SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`; 
    if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
      # in this case the agent has already been launched and we are just attaching to it. 
      ##++  It should check that this pid is actually active & belongs to an ssh instance
      export SSH_AGENT_PID;
      SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
    else
      # in this case there is no agent running, so the socket file is left over from a graceless agent termination.
      rm ~/etc/ssh/ssh-agent-socket;
      ssh-procure-launch-agent;
    fi;
  else
    ssh-procure-launch-agent;
  fi;
fi;

S'il vous plaît, dites-moi qu'il y a un meilleur moyen de faire ça. Aussi, s'il vous plaît, ne pinailler pas sur les incohérences/manques (par exemple, mettre le nom de l'auteur dans le texte). var des choses dans etc ) ; j'ai écrit ceci il y a un certain temps et j'ai depuis appris beaucoup de choses.

0voto

J'ai lu votre solution originale et un certain nombre de celles suggérées, mais j'ai décidé de simplifier le processus pour mon propre usage. Voici ce que j'ai ajouté dans mon propre .bashrc :

    # get active ssh-agent, or launch new
    SSH_AGENT_PID=$(ps -fC ssh-agent | grep "ssh-agent -a ${HOME}/.ssh/ssh-agent-socket" | awk '{print $2}')
    if [ -z "${SSH_AGENT_PID}" ]; then
      # If there is no ssh-agent running, we'll make sure one hasn't left a socket file dangling
      rm ${HOME}/.ssh/ssh-agent-socket &> /dev/null
      # And of course start one
      eval $(ssh-agent -a ${HOME}/.ssh/ssh-agent-socket)
    else
      # We found a process matching our requirements, so sticking with that
      export SSH_AGENT_PID
      export SSH_AUTH_SOCK="${HOME}/.ssh/ssh-agent-socket"
    fi

J'ai fait quelques hypothèses ici :

  • Que le répertoire ~/.ssh existe.
  • Que vous ne voulez qu'un seul socket ssh-agent par utilisateur sur le système.
  • Que la variable d'environnement HOME est définie (car pourquoi ne le serait-elle pas, n'est-ce pas ?).
  • Que vous allez gérer manuellement une situation où il y a un processus en cours d'exécution, mais qui, pour une raison quelconque, n'utilise pas le fichier socket désigné.

Dans l'ensemble, je pense que c'est une solution simple.

0voto

AXE Labs Points 707

Voici ce que j'en pense. I ' source ' le ci-dessous script de mon .bash_profile :

MYAGENTS=(`pgrep -U $USER -f ^ssh-agent$|sort -n`)

echo "Found ${#MYAGENTS[@]} ssh-agents."

# Let's try to take over the agents, like we do everynight Pinky!
if [[ "${MYAGENTS[@]}" ]];then
  KEEPER=${MYAGENTS[0]}
  echo KEEPER: $KEEPER
  OUTCAST=${MYAGENTS[@]:1}
  [[ "$OUTCAST" ]] && { echo "Goodbye agent $OUTCAST"; kill $OUTCAST; }
  SSH_AUTH_SOCK=`awk '/tmp\/ssh/ {print $NF}' /proc/$KEEPER/net/unix`
  export SSH_AUTH_SOCK;
  SSH_AGENT_PID=$KEEPER; export SSH_AGENT_PID;
else
  NEWAGENT="`ssh-agent`"
  echo $NEWAGENT;
  eval $NEWAGENT
fi

ssh-add -l | grep "The agent has no identities" && ssh-add

0voto

LukasZZ Points 11

Beaucoup de réponses, pour la plupart valables, mais je partage ma méthode courte et simple. Ajoutez-la à la vôtre ~/.bashrc o ~/.zshrc . C'est similaire à certaines réponses supérieures.

# export socket variable
export SSH_AUTH_SOCK=~/.tmp/ssh-agent.sock
[ ! -d ~/.tmp ] && mkdir ~/.tmp # create dir if not exist ~/.tmp

# check is ssh-agent running and socket is valid
check-ssh-agent() {
    [ -S "$SSH_AUTH_SOCK" ] && { ssh-add -l >& /dev/null || [ $? -ne 2 ]; }
}

# if socket or agent is not valid/running create ssh-agent with socket from env variable
check-ssh-agent || eval "$(ssh-agent -s -a ${SSH_AUTH_SOCK})"

Vous pouvez ajouter toutes les clés de ~/.ssh/config par cette ligne :

cat ~/.ssh/config | grep IdentityFile | awk '{print $NF}' | sort | uniq | xargs ssh-add

Vous pouvez l'ajouter après le code de ssh-agent dans ~/.bashrc o ~/.zshrc ou comme alias :

alias ssh-add-keys="cat ~/.ssh/config | grep IdentityFile | awk '{print $NF}' | sort | uniq | xargs ssh-add"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X