ssh-agent (最大有効期間オプション付き) を実行したいのですが、起動時にキーを追加せず、代わりに要求に応じてキーを追加します。
最初にサーバーにログインするときにはパスフレーズを要求されますが、次回は (1 時間以上待たない限り) 問題なく接続できるはずです。
ssh server1
Enter passphrase for key '/home/vi/.ssh/id_dsa':
server1> ...
ssh server2
server2> # no passphrase this time
# wait for lifetime
ssh server2
Enter passphrase for key '/home/vi/.ssh/id_dsa':
毎回 'ssh-add' を実行することを手動で覚えておくのは嫌です。(例: ssh のためだけにパスフレーズを入力し、「ああ、覚えていないので、再入力する必要があります」)。
ユーザーがパスフレーズを提供した場合に、ssh-agent にキーを自動的に追加するように ssh を構成する方法を教えてください。
答え1
ssh は、初回使用時にエージェントにキーを追加することをサポートしています (バージョン 7.2 以降)。 に次の内容を入力すると、この機能を有効にすることができます~/.ssh/config
。
AddKeysToAgent yes
これは、git などの派生ツールを使用する場合にも機能します。
から7.2 変更ログ:
- ssh(1): AddKeysToAgent クライアント オプションを追加します。これは 'yes'、'no'、'ask'、または 'confirm' に設定でき、デフォルトは 'no' です。有効にすると、認証中に使用される秘密鍵が ssh-agent の実行中に追加されます ('confirm' に設定すると確認が有効になります)。
答え2
チートして、 /alias ssh='ssh-add -l || ssh-add && ssh'
に のようなものを置くこともできます。これは最初に を実行し、0 (エージェントにキーがある)、1 (キーがない)、または 2 (エージェントが実行されていない) を返します。0 が返された場合は が実行され、1 が返された場合は が実行され、次に が返されます。2 が返された場合はが失敗し、実行されません。エージェントが実行されていない場合でも を実行したい場合は、を に置き換えます。.bashrc
.profile
ssh-add -l
ssh
ssh-add
ssh
ssh-add
ssh
&&
;
ssh
答え3
auto-call-ssh-add が ssh でサポートされるまで、私は.bashrc
Kovensky の提案に基づいて、これを に追加しました:
ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'
エイリアスは、ID が追加されていない場合にのみ作成され、実行されるとエイリアスは自動的に破棄されます。
この方法では、ID が追加された後に通常の ssh コマンドが使用されます。
答え4
次のシェル関数を使用しています:
ssh() {
local possible_keys=($(/usr/bin/env ssh -G $@ | grep '^identityfile' \
| cut -d " " -f 2- | sed -e "s|^~|$HOME|"))
for k in $possible_keys; do
if [[ -f $k ]]; then
local fingerprint=$(ssh-keygen -lf $k)
ssh-add -l | grep -q "$fingerprint" || ssh-add $k
fi
done
/usr/bin/env ssh $@
return $?
}
まず、接続しようとしているホストの構成を解決し、そのホストの可能なキーがまだ追加されていない場合は ssh-agent に追加して、最後にホストに接続します。改善の余地があると思うので、フィードバックをお待ちしています。