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を構成するにはどうすればよいですか?
sshは、最初の使用時にエージェントにキーを追加することをサポートします(バージョン7.2以降)。以下を~/.ssh/config
に入れることで、この機能を有効にできます。
AddKeysToAgent yes
これは、gitなどの派生ツールを使用する場合にも機能します。
7.2 changelog から:
- ssh(1):Add AddKeysToAgentクライアントオプションを追加します。これは、「yes」、「no」、「ask」、または「confirm」に設定でき、デフォルトは「no」です。有効にすると、認証中に使用される秘密鍵が実行されている場合にssh-agentに追加されます(「確認」に設定されている場合は確認が有効になります)。
あなたは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
を実行する場合は、&&
を;
に置き換えます。
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コマンドが使用されます。
次のシェル関数を使用しています。
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に追加し、最後にホストに接続します。改善できると確信しているので、フィードバックをお待ちしています。