公開鍵/秘密鍵を使ってリモートのSSHサーバーにアクセスする場合、秘密鍵にアクセスするためのパスフレーズを聞かれるようになる。Xが立ち上がっている端末であれば、初回の秘密鍵アクセス時にのみパスフレーズを聞かれるのだが、例えばリモートのSSHサーバーから更に別のSSHサーバーにアクセスしたい場合は、SSHで接続する都度パスフレーズを聞かれて面倒になることがある。
今使っている環境では、メインのLinuxマシンの上で仮想マシン(Linux)を動かしていて、仮想マシンにSSHで入って開発をしている。gitリポジトリはまた別のサーバーにあって、そこにもSSHでつなぐ必要がある。リモートのgitリポジトリにアクセスする度に、パスフレーズを聞かれるのがウザかったので、仮想マシンにSSHでログインした後、手動でssh-agentを立ち上げてssh-addで秘密鍵を登録(このときパスフレーズを聞かれる)していたのだが、この手作業自体がまた面倒になった。
メインマシン上でターミナルをいくつも立ち上げて、それぞれで仮想マシンにSSHログインしていると、仮想マシン上でssh-agentがポンポン立ち上がることになる。さらに、仮想マシン上で別のシェルを起動させると、またssh-agent/ssh-addを繰り返さなければならない。パスフレーズの入力は、仮想マシンに初めてログインしたときだけにしたいものだ。
ssh-agentを起動する場合に、ssh-agent bashを実行するサンプルをよく見かけるが、これだと子プロセスとして別のbashが立ち上がることになり、仮想マシンからログアウトするのにexitを2回たたく羽目になる。
local$ ssh remote remote$ ssh-agent bash remote$ exit # ssh-agent経由で起動したbashを抜けただけ remote$ exit # ここでSSHから抜ける local$
ssh-agentは引数なしで起動すると、ssh-agentに接続するために必要な環境変数を設定するためのスクリプトを吐き出してくれる。
$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-lryfV7tY5VHY/agent.26301; export SSH_AUTH_SOCK; SSH_AGENT_PID=26302; export SSH_AGENT_PID; echo Agent pid 26302;
手動でssh-agentを起動する場合は、eval "$(ssh-agent)"とするのがいいだろう。
もったいぶってしまったが、~/.bashrcに以下のコードを追記すると、初回ログイン時にだけパスフレーズを聞かれるようになり、仮想マシン上でssh-agentが複数立ち上がることもなくなる。
# Setup ssh-agent
if [ -f ~/.ssh-agent ]; then
. ~/.ssh-agent
fi
if [ -z "$SSH_AGENT_PID" ] || ! kill -0 $SSH_AGENT_PID; then
ssh-agent > ~/.ssh-agent
. ~/.ssh-agent
fi
ssh-add -l >& /dev/null || ssh-add