Ubuntu 16.04で次を実行しました:
eval $(ssh-agent) && ssh-add
私が得た:
Agent pid 3361
次に、パスフレーズを挿入した後、VPSにSSHでトンネルしました。
まあ、それはそれほど「問題」ではありませんが、:
exit
を使用してローカルセッションに戻り、VPSに再度ログインしようとすると、パスフレーズを再入力する必要がありました...
パスフレーズの再入力を求められるのはなぜですか?
トンネリングの前に、現在のセッションを閉じずにeval $(ssh-agent) && ssh-add
を行いました。それでは、なぜシステムはそれを「覚えていない」のでしょうか?
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
を1回(または何らかの理由で死んだとき)呼び出し、その後、エージェントで資格情報を保持します。
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だけでなく、複数のプラットフォームで同じスニペットを使用しています。このスニペットはさらに改善できますが、今のところは確実に動作します。