Не удается сохранить кодовую фразу в том же сеансе с помощью eval $ (ssh-agent) && ssh-add

6

В Ubuntu 16.04 я выполнил:

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

Я получил:

Agent pid 3361

Затем SSH туннелировался в мой VPS, после ввода моей кодовой фразы.

Проблема:

Ну, это не так много «проблемы», но:

Я вернулся в свою локальную сессию с exit , и когда я снова попытался войти в мой VPS, мне пришлось повторно ввести мою кодовую фразу ...

Мой вопрос:

Почему меня попросят снова ввести кодовую фразу?

Я не закрыл текущую сессию и сделал eval $(ssh-agent) && ssh-add перед туннелированием. Итак, почему система не «запомнит» его?

    
задан JohnDoea 02.02.2017 в 09:15
источник

2 ответа

4

Каждый раз, когда вы делаете eval $(ssh-agent) && ssh-add , запускается новый агент, поэтому вам нужно повторно аутентифицироваться на нем.

Я думаю, что лучший способ - хранить данные агента SSH постоянно на сеанс (в вашем ~/.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
}

и добавьте . ${SSHPROC} к вашему .bashrc .

Затем вы вызываете restart_ssh_agent один раз (или когда он умирает по какой-то причине), а затем сохраняйте свои учетные данные с агентом.

    
ответ дан sds 07.02.2017 в 23:59
источник
2

Вам нужно обнаружить, что ssh-agent уже запущено через ваш .bashrc . Если он не запущен, запустите его. Если он уже запущен, используйте его.

Вот фрагмент из моего .bashrc , который устанавливает переменные среды для существующего сеанса.

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

Я использую тот же фрагмент для нескольких платформ, а не только для Mac или Linux на x86. Этот фрагмент можно улучшить, но на данный момент он работает для меня надежно.

    
ответ дан Sam Gleske 08.02.2017 в 09:05