web-dev-qa-db-ja.com

鍵がすでにある場合は、ssh-addを静かにしてください

スクリプトの先頭にssh-add /path/to/special_keyを置きたいです。これは正常に機能しますが、-常にはパスフレーズの入力を求めます。 ssh-add -lがすでにキーが追加されていることを示している場合でも、パスフレーズを要求するので、これは奇妙で少し厄介です。

それを伝える方法はありますか:「このキーを追加して、まだ追加されていない場合はパスフレーズを要求し、追加されていない場合は何もしない」?

18
Darren Cook

目的の結果を達成するのに役立つ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
21
Lars Rohrbach

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

参考文献

5
slm

ssh-addを明示的に使用する特別な理由があるかもしれませんが、「最初にキーを使用するときにパスフレーズの入力を求められますが、その後は必要ない」というだけの場合は、opensshの方が簡単な解決策があります。

AddKeysToAgent yes.ssh/configファイルに入れます。

3
Nate

ssh-add -K FILE Macではうまくいきました。
「Identity added:」行は表示されますが、パスフレーズは要求されません。

Manページから:

-K IDを追加すると、各パスフレーズもユーザーのキーチェーンに保存されます。 -dを使用してIDを削除すると、各パスフレーズがそこから削除されます。

0
Ivan