5月 222013
公開鍵/秘密鍵を使ってリモートの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