ssh-agent が要求に応じてキーを自動的に追加するようにするにはどうすればよいですか?

ssh-agent が要求に応じてキーを自動的に追加するようにするにはどうすればよいですか?

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.profilessh-add -lsshssh-addsshssh-addssh&&;ssh

答え3

auto-call-ssh-add が ssh でサポートされるまで、私は.bashrcKovensky の提案に基づいて、これを に追加しました:

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 に追加して、最後にホストに接続します。改善の余地があると思うので、フィードバックをお待ちしています。

関連情報