ssh-agentによるパスフレーズスキップ

今作業中の環境では、まず踏み台へsshでログインし、その後本命のマシンへssh接続しています。しかし、踏み台と本命マシンで鍵が異なるため、本命マシンへの接続時に毎回パスフレーズを入力する必要があって面倒に感じていました。

踏み台ログイン後にssh-agentを起動しても、別ターミナルで踏み台にログインするとそちらではssh-agentの設定が反映されません。

色々と調べていると、ssh-agent起動時にSSH_AGENT_PIDとSSH_AUTH_SOCKの2つの環境変数が設定され、sshはこの設定を元にssh-agentに認証させるらしい、ということが分かりました。

そこで、ログイン時にssh-agentが起動していたら環境変数を設定するよう.bash_profileに記述することにしました。

#!/bin/bash

#################################
# SSH-AGENT check.
#################################
user_name=`who am i | awk '{print $1}'`
ssh_agent_pid=`ps -U $user_name | grep -v grep | grep ssh-agent | awk '{print $1}'`
ssh_sock_dir=/tmp/`ls -l /tmp | grep "$user_name" | awk '{print $9}'`
ssh_auth_sock=$ssh_sock_dir/`ls -l $ssh_sock_dir | grep "$user_name" | awk '{print $9}'`

if [ "$ssh_agent_pid" != "" -a "$ssh_auth_sock" != "" ]
then
echo ssh-agent running!!!
SSH_AGENT_PID=$ssh_agent_pid
SSH_AUTH_SOCK=$ssh_auth_sock
SSH_AGENT_CHECKED="yes"
export SSH_AGENT_PID
export SSH_AUTH_SOCK
export SSH_AGENT_CHECK
fi

unset user_name
unset ssh_agent_pid
unset ssh_sock_dir
unset ssh_auth_sock


また、ログアウト時にssh-agentをkillし忘れて大変なことにならないよう、.bash_logoutに次のように設定しました。

#!/bin/bash

#################################
# SSH-AGENT check & kill.
#################################
if [ "$SSH_AGENT_PID" != "" -a "$SSH_AUTH_SOCK" != "" -a "$SSH_AGENT_CHECKED" != "yes" ]
then
ssh-agent -k
fi

ssh-agentが起動していてかつSSH_AGENT_CHECKEDがyesで無い場合、つまりssh-agentを起動したターミナルの場合のみ、ssh-agentをkillします。



普段あまりシェルスクリプトを書かないので少し時間はかかりましたが、便利な開発ライフが遅れてハッピーです。