必要な場合にのみSSHキーパスワードを要求する方法は?

必要な場合にのみSSHキーパスワードを要求する方法は?

(私はこのサイトで関連していると思われる多くの質問を読んでいましたが、これは本当に新しい質問だと思います。)

多くのサーバーに多くのキーがあり、すべてパスワードで保護されています。

私はパスワードを入力するのと同じくらいパスワードを入力するのが好きです。これは生産性を低下させることです。

  • SSHエージェント+SSHを追加このコマンドはログインシェルで使用できます。つまり、ログイン時にパスワードを一度入力するだけです。

  • キーホルダーログアウト後もSSHエージェントをアクティブに保つために使用できます。たとえば、起動時にパスワードフレーズを一度だけ入力することを許可したり、1時間ほどアクティブに保つことができます。

私が経験している問題は、通常、.zshrcシェルログイン(たとえば)から始まる両方のソリューションがロックを解除する必要がないにもかかわらず、ログイン時にパスワードを入力する必要があることです。 (私はエージェントを無期限に維持するキーチェーンが好きではありません。)

私が望むのは(プロキシの場合)パスワードを求めることです。必要なときだけ

したがって、サーバーAにログインしていくつかの操作を実行し、サーバーBにSSHを介して接続できます。その瞬間パスワードを聞きました。サーバーBで操作を実行してログアウトします。 Aに戻り、さらにいくつかのタスクを実行し、もう一度Bでsshを実行します。パスワードは必要ありません(プロキシが保管する)。

私はこれがGnomeのようなグラフィックデスクトップで可能であることがわかりました。 sshを試してみると、秘密鍵のロックを解除するためにパスワードを求めるポップアップが表示されます。これは私が求めているものですが、コンソールからです。

答え1

シェル起動スクリプトに何も追加しないでください。不要なハッキングです。

代わりに追加してください

AddKeysToAgent yes

.ssh/configへ

このように、ssh-add は SSH を別のボックスに接続したときに自動的に実行されます。 ssh-agentキーが期限切れになっているか再起動された場合にのみ、キーを再入力する必要があります。

答え2

ジッシュpreexecコマンドラインに入力されたコマンドを実行する前に機能を実行するフックがあります。これはコマンドラインを探しssh、見つかったらSSHエージェントがあることを確認するフックです。見つからない場合は、キーチェーンが実行されます。

したがって、この方法では、キーチェーンはsshコマンドの前と必要なときにのみ実行されます。

これをあなたの~/.zshrc

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

ここで何が起こるのかは、コマンドを入力するたびにcheck_sshコマンドが実行される前に呼び出されることです。

関数の最初の行は、拡張コマンドがsshZsh正規表現を使用しているかどうかを確認します。両側にssh単語の境界が必要です。\b見つからない場合、関数が返されます。

次の行では、SSHエージェントプロセスが環境変数に存在し、プロセステーブルにまだ存在することを確認し、1つ以上のキーがエージェントに追加されていることを確認します。すべてが正常な場合は、SSHエージェントが設定されており、何もする必要がないため返されます。

最後に、キーチェーンを起動し、エージェントを1時間アクティブにします。

git機能をトリガーまたはトリガーしないrsyncなど、組み込みのsshエントリに関する質問はまだ残りますscp(正規表現に追加できます)。

答え3

zshの場合は、必要な操作をある程度実行するためのユーティリティとラッパーセットを作成しました。https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils

実際、これはssh-agentすべてのログインセッション(デスクトップまたはSSH経由)で共有されるため、GNU画面はログインシェル(ファイルなどshell -zsh)を実行してもサポートされ、~/.screenrc最後のセッションが終了したときにのみサポートされます。

注:私はすべてのキーに1つのパスワードしか使用しません。別のパスワードを使用すると、どのような動作が発生するのかわかりません。一部の変更が必要な場合があります。

関連情報