スクリプトの先頭にssh-add /path/to/special_key
を置きたいです。これは正常に機能しますが、-常にはパスフレーズの入力を求めます。 ssh-add -l
がすでにキーが追加されていることを示している場合でも、パスフレーズを要求するので、これは奇妙で少し厄介です。
それを伝える方法はありますか:「このキーを追加して、まだ追加されていない場合はパスフレーズを要求し、追加されていない場合は何もしない」?
目的の結果を達成するのに役立つssh-addのオプションはありませんが、特に1つのキーに関心がある場合は、これを回避するのは非常に簡単です。
まず、special_keyのフィンガープリントを取得します。
ssh-keygen -lf /path/to/special_key | awk '{print $2}'
この指紋が6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25のようになっているとしましょう。
次に、スクリプトの上部で、ssh-add -l
を使用して、追加するように求める前に、そのキーがロードされているかどうかを確認します。
ssh-add -l |grep -q 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25 || ssh-add /path/to/special_key
必要に応じて、これらすべてを1行にまとめることができます。
ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key | awk '{print $2}'` || ssh-add /path/to/special_key
ssh-add
だけを使用して直接チェックする方法はありませんが、ssh-keygen
といくつかのスクリプトを使用してチェックできます。
$ if ssh-add -l | \
grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
then echo yes; \
else echo no; \
fi
次に、ファイル/path/to/special_key
によって表されるフィンガープリントがssh-add -l
の出力に存在する場合、上記はyes
を出力します。
$ if ssh-add -l | \
grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
then echo yes; \
else echo no; \
fi
yes
ssh-keygen -lf /path/to/special_key
からの出力の内容は次のようになります。
$ ssh-keygen -lf /path/to/special_key
2048 8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c dev-servers (RSA)
そして、 `awk '{print $ 2}'を使用して、フィンガープリントを含む2番目の列だけを選択します。
8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c
ssh-add
を明示的に使用する特別な理由があるかもしれませんが、「最初にキーを使用するときにパスフレーズの入力を求められますが、その後は必要ない」というだけの場合は、opensshの方が簡単な解決策があります。
AddKeysToAgent yes
を.ssh/config
ファイルに入れます。
ssh-add -K FILE
Macではうまくいきました。
「Identity added:」行は表示されますが、パスフレーズは要求されません。
Manページから:
-K IDを追加すると、各パスフレーズもユーザーのキーチェーンに保存されます。 -dを使用してIDを削除すると、各パスフレーズがそこから削除されます。