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