6 votes

Impossible de stocker la phrase de passe dans la même session avec eval $(ssh-agent) && ssh-add

Dans Ubuntu 16.04, j'ai exécuté :

eval $(ssh-agent) && ssh-add

J'ai obtenu :

Agent pid 3361

Je me suis ensuite connecté en SSH à mon VPS avec succès, après avoir inséré ma phrase d'authentification.

Le problème :

Ce n'est pas vraiment un "problème", mais.. :

Je suis retourné à ma session locale avec exit et lorsque j'ai essayé de me connecter à nouveau à mon VPS, j'ai dû réintroduire ma phrase d'authentification...

Ma question :

Pourquoi me demande-t-on de saisir à nouveau la phrase d'authentification ?

Je n'ai pas fermé la session en cours et j'ai fait eval $(ssh-agent) && ssh-add avant de creuser un tunnel. Pourquoi le système ne s'en souvient-il pas ?

3voto

Tylor Points 113

Chaque fois que vous le faites eval $(ssh-agent) && ssh-add Dans le cas d'un nouvel agent, un nouvel agent démarre, vous devez donc vous réauthentifier auprès de lui.

Je pense que la meilleure façon est de stocker les données de l'agent SSH de façon permanente par session (dans votre ~/.profile ):

export SSHPROC=${HOME}/.ssh/cur-proc.${HOSTNAME}
restart_ssh_agent(){
  . ${SSHPROC}
  kill ${SSH_AGENT_PID}
  /bin/rm -rf ${SSHPROC} ${SSH_AUTH_SOCK} /tmp/ssh-*
  ssh-agent > ${SSHPROC}
  cat ${SSHPROC}
  . ${SSHPROC}
  ssh-add
}

et ajouter . ${SSHPROC} à votre .bashrc .

Ensuite, vous appelez restart_ssh_agent une fois (ou lorsqu'il meurt pour une raison quelconque) et conservez vos informations d'identification auprès de l'agent.

2voto

Mark Points 1621

Vous devez détecter si ssh-agent est déjà en cours d'exécution via votre .bashrc . S'il n'est pas en marche, démarrez-le. S'il est déjà en marche, utilisez-le.

Voici un extrait de mon .bashrc qui définit les variables d'environnement pour une session existante.

#
# setup ssh-agent
#
#start running ssh-agent if it is not already.
if [ ! 'root' = "${USER}" ]; then
  if ! pgrep ssh-agent &> /dev/null && ! uname -rms | grep Darwin &> /dev/null; then
    eval "$(ssh-agent -t 3600)" > /dev/null
  fi
  if ! uname -rms | grep Darwin &> /dev/null; then
    if [ -z "${SSH_AUTH_SOCK}" -o -z "${SSH_AGENT_PID}" ]; then
        #first time failed so try again.
        SSH_AUTH_SOCK="$(ls -l /tmp/ssh-*/agent.* 2> /dev/null | grep "${USER}" | awk '{print $9}' | tail -n1)"
        SSH_AGENT_PID="$(echo ${SSH_AUTH_SOCK} | cut -d. -f2)"
    fi
    if [ -z "${SSH_AUTH_SOCK}" -o -z "${SSH_AGENT_PID}" ]; then
      SSH_AUTH_SOCK="$(lsof -p "$(pgrep ssh-agent | tr '\n' ',')" | grep "${USER}" | grep -e "ssh-[^/]*/agent\.[0-9]\+$" | tr ' ' '\n' | tail -n1)"
      SSH_AGENT_PID="$(echo ${SSH_AUTH_SOCK} | cut -d. -f2)"
    fi
  fi
  [ -n "${SSH_AUTH_SOCK}" ] && export SSH_AUTH_SOCK
  [ -n "${SSH_AGENT_PID}" ] && export SSH_AGENT_PID
fi

J'utilise ce même extrait pour plusieurs plates-formes et pas seulement pour Mac ou Linux sur x86. Ce snippet peut encore être amélioré, mais pour l'instant, il fonctionne pour moi de manière fiable.

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