ssh-agentにキーをオンデマンドで自動的に追加させる方法は?


51

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を構成する方法は?


回答:


58

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

AddKeysToAgent yes

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

7.2変更ログから:

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

これには、ssh-agentが実行されている必要があります。stackoverflow.com/a/24347344/4573065とそのコメントを参照して、開始方法を確認してください(一度だけ)。
ST-DDT

18

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


3
さらにsshコマンドが使用しない場合でも、キーへのパスフレーズを要求します。
Vi。

@Vi。本当ですが、それらを使用しないコマンドはまれです(キーボードインタラクティブを使用するサーバーに接続している場合を除く)。ただし、後で必要になったときに、キーはエージェントにあります。また、エイリアスは幸いなことに(または残念なことに)sshのバックエンドの使用を変更しません(gitやrsyncなど)。
ジェシディア

2
(sshクライアント用のauto-call-ssh-addパッチの作成について考える)
Vi。

この回答に基づいて、特定のホストのエイリアスを作成できますalias ssh-hostname='(ssh-add -l | grep hostname > /dev/null) || ssh-add ~/.ssh/id_rsa_hostname && ssh -p 12345 username@hostname'。すべてのsshキーのループに入れてエイリアスを生成することもできます。汚いハックですが、動作します。
-dset0x

5

auto-call-ssh-addがsshでサポートされるまで.bashrc、コヴェンスキーの提案に基づいて、これをに追加しました。

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

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

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


ssh-addにもタイムアウトが設定されているため、私の場合は機能しませんが、アイデアは十分です。
Vi。

@Vi。タイムアウトはこれにどのように影響しますか?私にとってはうまくいくようです。
lanrat

1
@lanrat、これはssh-agentにキーが存在するかどうかを確認し、存在に応じてエイリアスを設定します。ただし、タイムアウト(ssh-add -t ...)により、ssh-agentに追加されたキーは突然消える可能性がありますが、キーがまだメモリにあるため、エイリアスはそのままになります。
Vi。

1

私は次のシェル関数を使用しています:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.