ssh-agent起動チェック

はじめに

ssh-agentが起動しているのに重複して起動するのは無駄なので、ssh-agentか起動しているなら起動せず、起動していないなら起動する。
また、agentにすでに鍵を渡しているなら何もせず、鍵を渡していないなら渡すというものを作ってみる。

ぁ、使うシェルはzshです。他のシェルでどうやるかはわかりません。

コードの前にやりたいこと

コマンドを実行したとき、正常に終了したら 0 ,なにかエラーがあれば、それ以外の数字が返却値として返ってきます。
この返り値を利用します。終了時の返り値を使うなんて、今回のこれを考えてみないと、きっと自分では思いつかなかったと思う。
その返り値、今回はssh-add -l コマンドの返り値を利用します。
0 → ssh-agent起動済み 鍵もagentに渡している
1 → ssh-agent起動済み 鍵は渡されていない
2 → ssh-agent未起動 鍵も渡されていない
となります。
なので、スクリプトにやらせるのは、
2 → ssh-agent起動、さらにssh-add
1 → ssh-add
0 → なにもしない

実際にコマンドを実行して、返り値が変るか試してみた。
赤で表示されているのがエラーになっている部分(返り値)

コードをぺたっと


ssh-add -l >& /dev/null
if $? -eq 2 ; then
eval `ssh-agent -s`
fi
ssh-add -l >& /dev/null
if $? -eq 1 ; then
ssh-add ~/.ssh/id*~*.pub
fi

説明

1,5行目は、出力なしで、ssh-add -l コマンドを実行しています。出力なしでも返り値はもちろん残ります。
2行目 ifの条件判断のところですが、$?が前回実行したコマンドの返却値です。-eq は数値として両隣を比較し、同じだったときに真を返します。
3行目 ssh-agentの起動をしている部分です。
4,8行目 if文の終わりです。Rubyだとendみたいな…Cだと {} の閉じ括弧に当たる部分
6行目 2行目とほぼ同じです。比較している数字が違うだけ。
7行目 ssh-agentに鍵を渡している部分。~/.ssh/にある秘密鍵すべてをごそっとssh-agentに渡しています。
後半の~*.pubは公開鍵をssh-agentに渡してしまわないため(extended_glob?が有効じゃないといけないかも)