これはもう少し複雑になりますが、いくつかの要素を組み合わせることで機能します:
説明
<オール>
ssh
を強制するには $SSH_ASKPASS
を使用する プログラム、ssh
は許可できません 本当の tty
を見る .あくまでもコンディションです。これは setsid
を使用して実行できます -n
を使用 ssh
に切り替える .
この場合、接続が開始されますが、シェルと対話することはできません。これはおそらく要件でもあります;) (また、ローカル TTY が壊れます)。
ただし、「最初のセッション」はあきらめることができます。 -N
も追加する必要があります リモート コマンドを抑制し、認証のみを実行するスイッチ。 .
また、可能な出力「ジャンク」は &> /dev/null
にリダイレクトできます 興味がなければ。
ControlMaster
を設定します ssh_config
で .これは優れた機能であり、接続が確立されると、セッションを非常に高速に「起動」できます。 ~/.ssh/config
のこのスニペット そうすべきです:
ControlPath ~/.ssh/controlmasters/%[email protected]%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 "[email protected]"
}
-f
パスワードを取得した後、プログラムの実行直前にバックグラウンドに移行するよう SSH に指示します。-w
setsid
に伝えます プログラムが終了するのを待ちます。この場合、これは SSH がバックグラウンドに移行したときに発生します。ssh -f
と組み合わせる 、2 つの SSH コマンド間の手動待機をなくすことができます。- この関数は、最初の引数がホスト名であると想定しています。
- このテストは、不要な 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
OpenSSH 8.4 では $SSH_ASKPASS_REQUIRE
を設定できます 環境変数を force
に . ssh(1) man ページを引用:
SSH_ASKPASS_REQUIRE Allows further control over the use of
an askpass program. If this variable
is set to "never" then ssh will never
attempt to use one. If it is set to
"prefer", then ssh will prefer to use
the askpass program instead of the TTY
when requesting passwords. Finally, if
the variable is set to "force", then
the askpass program will be used for
all passphrase input regardless of
whether DISPLAY is set.
OpenSSH 8.4 は 2020 年 9 月 27 日にリリースされたため、主要な Linux ディストリビューションでこの機能を利用できるようになるまで少し待つ必要があります。