web-dev-qa-db-ja.com

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を構成するにはどうすればよいですか?

53
Vi.

sshは、最初の使用時にエージェントにキーを追加することをサポートします(バージョン7.2以降)。以下を~/.ssh/configに入れることで、この機能を有効にできます。

AddKeysToAgent yes

これは、gitなどの派生ツールを使用する場合にも機能します。

7.2 changelog から:

  • ssh(1):Add AddKeysToAgentクライアントオプションを追加します。これは、「yes」、「no」、「ask」、または「confirm」に設定でき、デフォルトは「no」です。有効にすると、認証中に使用される秘密鍵が実行されている場合にssh-agentに追加されます(「確認」に設定されている場合は確認が有効になります)。
60
spheenik

あなたはalias ssh='ssh-add -l || ssh-add && ssh'/.bashrcにチートして_.profileのようなものを置くことができます。これは最初にssh-add -lを実行し、0(エージェントにキーがある)、1(キーなし)、または2(エージェント実行なし)を返すことができます。 0を返す場合、sshが実行されます。 1の場合、ssh-addが実行され、次にsshが実行されます。 2の場合、ssh-addは失敗し、sshは実行されません。エージェントが実行されていない場合でもsshを実行する場合は、&&;に置き換えます。

18
Jessidhia

Auto-call-ssh-addがsshでサポートされるまで、Kovenskyの提案に基づいて.bashrcに追加しました。

ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'

エイリアスは、IDが追加されていない場合にのみ作成され、実行するとエイリアスは破棄されます。

この方法では、IDが追加された後に通常のsshコマンドが使用されます。

5
Marc MAURICE

次のシェル関数を使用しています。

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

1
mbrgm