无法在与 eval $(ssh-agent) && ssh-add 相同的会话中存储密码

无法在与 eval $(ssh-agent) && ssh-add 相同的会话中存储密码

在 Ubuntu 16.04 中我执行了:

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

我有:

Agent pid 3361

输入密码后,我成功通过 SSH 隧道进入了我的 VPS。

问题:

嗯,这并不是什么大“问题”,但是:

我回到了我的本地会话exit,当我再次尝试登录我的 VPS 时,我必须重新输入我的密码……

我的问题:

为什么会要求我再次输入密码?

我没有关闭当前会话eval $(ssh-agent) && ssh-add,但在建立隧道之前关闭了。那么,为什么系统不会“记住”它呢?

答案1

每次执行此操作时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一次电话(或当它由于某种原因死亡时),然后将您的凭证保留在代理商处。

答案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 $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

我将相同的代码片段用于多个平台,而不仅仅是 x86 上的 Mac 或 Linux。该代码片段可以进一步改进,但目前对我来说,它运行可靠。

相关内容