Não é possível armazenar a frase secreta na mesma sessão com eval $ (ssh-agent) && ssh-add

6

No Ubuntu 16.04 eu executei:

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

Eu tenho:

Agent pid 3361

Eu, então, conectei o SSH ao meu VPS com sucesso, depois de inserir minha frase-senha.

O problema:

Bem, não é muito "problema", mas:

Voltei para minha sessão local com exit e, quando tentei fazer login no meu VPS novamente, tive que inserir novamente minha senha ...

Minha pergunta:

Por que eu seria solicitado a inserir a senha novamente?

Eu não fechei a sessão atual e fiz eval $(ssh-agent) && ssh-add antes do tunelamento. Então, por que o sistema não vai "lembrar"?

    
por JohnDoea 02.02.2017 / 09:15

2 respostas

4

Sempre que você executa eval $(ssh-agent) && ssh-add , um novo agente é iniciado, então você precisa se autenticar novamente.

Acho que a melhor maneira é armazenar os dados do agente SSH permanentemente por sessão (no seu ~/.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
}

e adicione . ${SSHPROC} ao seu .bashrc .

Em seguida, você chama restart_ssh_agent uma vez (ou quando ele morre por algum motivo) e, em seguida, mantém suas credenciais com o agente.

    
por sds 07.02.2017 / 23:59
2

Você precisa detectar se ssh-agent já está sendo executado por meio do seu .bashrc . Se não estiver sendo executado, inicie-o. Se já estiver em execução, use-o.

Aqui está um trecho do meu .bashrc , que configura variáveis de ambiente para uma sessão existente.

#
# 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 }' | 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

Eu uso o mesmo snippet para várias plataformas e não apenas para Mac ou Linux em x86. Esse snippet pode ser melhorado, mas por enquanto funciona para mim de forma confiável.

    
por Sam Gleske 08.02.2017 / 09:05

Tags