man ssh
さんのコメント:
SSH_ASKPASS
If ssh needs a passphrase, it will read the passphrase from the
current terminal if it was run from a terminal. If ssh does not
have a terminal associated with it but DISPLAY and SSH_ASKPASS
are set, it will execute the program specified by SSH_ASKPASS
and open an X11 window to read the passphrase.
端末から実行された場合でも、SSHでaskpassプログラムを使用してください。
ときどき、サーバーに接続する必要があります。ここでは、パスワードプロンプトの表示に多少の遅延があります(おそらくネットワークの問題が原因である可能性があります。DNS逆引きの試みが原因である可能性があります...)。私は迷惑になって別のものに切り替え、試みた接続を忘れます。 (金魚の注意スパンについての冗談を挿入します。)私が最後にそれに戻ると、プロンプトがタイムアウトし、正しいパスワードでも接続が閉じられるだけです。
鍵は1つの解決策ですが、私が使用するすべてのシステムに通常のSSH鍵があるわけではありません。ただし、私は通常Ubuntuシステムを使用しており、UbuntuにはデフォルトでSSH askpassプログラムがインストールされています。
ただし、askpassウィンドウが表示された場合は、すぐに気付きます。それを機能させることができれば、それは私にとって十分な妥協案です。
これはもう少し複雑になりますが、いくつかの部分を組み合わせると機能します。
ssh
に$SSH_ASKPASS
プログラムの使用を強制するには、ssh
に実際のtty
を表示することを許可できません。ただのコンディションです。これを行うには、setsid
を使用し、-n
スイッチをssh
に切り替えます。
この場合、接続が開始されますが、シェルと対話できなくなります。これはおそらく要件でもあります;)(ローカルTTYも壊れます)。
しかし、「最初のセッション」をあきらめることができます。リモートコマンドを抑制して認証のみを実行する-N
スイッチも追加する必要があります。
また、不要な出力「ジャンク」を&> /dev/null
にリダイレクトすることもできます。
ssh_config
にControlMaster
を設定します。これはクールな機能であり、接続が確立されると、セッションをかなり高速に「起動」できます。 ~/.ssh/config
のこのスニペットは、次のようにする必要があります。
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlMaster auto
ControlPersist 5m
「遅い候補者」をリストするいくつかのHost
ブロックに、またはどこにでもそれを追加できます。オーバーヘッドはほとんどありません。
次に、この方法で、しばらくすると予想されるホストに接続できるはずです。
setsid ssh -nN Host
# wait, insert password in the X11 Prompt
ssh Host
# will bring you directly to your session
alias
またはbash関数の両方を1つのステップで実行すると、プロセス全体が簡略化される可能性がありますが、読者の想像力に任されています。
ssh_config
の部分なしで、コマンドラインで両方を結合できます。
setsid ssh -nNMS ~/.ssh/masters/%C Host
# wait, insert password in the X11 Prompt
ssh -S ~/.ssh/masters/%C Host
# will bring you directly to your session
次の関数は、SSHオプションが指定されていない場合に機能します。
ssh() {
if ! command ssh -o PasswordAuthentication=no "$1" true
then
setsid -w ssh -fnN "$1"
fi
command ssh "$@"
}
-f
は、プログラムの実行直前、つまりパスワードを取得した直後のバックグラウンドに移動するようにSSHに指示します。-w
は、プログラムの終了を待機するようsetsid
に指示します。この場合、SSHがバックグラウンドに移行すると発生します。 ssh -f
と組み合わせると、2つのSSHコマンド間の手動の待機を排除できます。SSHマニュアルごと(man ssh
):
ssh
に端末が関連付けられていないが、DISPLAYとSSH_ASKPASSが設定されている場合、SSH_ASKPASSで指定されたプログラムが実行されます。
したがって、(たとえば、パイプを追加することによって)端末の関連付けを解除し、DISPLAY
が設定されていないことを確認する必要があります(パスフレーズに端末を使用する場合)。
簡単な例:
echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...
ssh-add
と同じ:
$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory