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プログラムがインストールされています。
ところでクエリが浮かぶとすぐに気づきます。私ができるだけなら、これは私にとって十分な妥協です。
答え1
OpenSSH 8.4では、$SSH_ASKPASS_REQUIRE
環境変数をforce
.referenceに設定できます。SSH(1)マニュアルページ:
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ディストリビューションでこの機能を使用できるようにするには、しばらく待つ必要があります。
答え2
これは少し複雑ですが、いくつかの部分を組み合わせると機能します。
説明する
ssh
プログラムを強制的に使用するには、実際のプログラムを表示できないようにすることは$SSH_ASKPASS
できません。これは単なる条件です。これはスイッチを使用して行うことができます。ssh
tty
setsid
-n
ssh
この場合、接続は開始されますが、シェルと対話できません。これはおそらくあなたの要件です。;)(ローカルTTYも破壊されます)。
しかし、「最初のセッション」を削除できます。また、
-N
リモートコマンドを抑制して実行するスイッチを追加する必要があります。ただ認証。&> /dev/null
これに興味がない場合は、可能な出力「ジャンク」をその場所にリダイレクトすることもできます。ControlMaster
に設定してくださいssh_config
。これは素晴らしい機能です。一度接続すると、セッションを非常にすばやく「実行」できます。このコードは~/.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
bash機能を使用して2つのプロセスを1段階で実行すると、プロセス全体がalias
単純化される可能性がありますが、これは読者の想像に依存します。
コマンドラインパラメータのみ
ssh_config
どちらの部分もなく、コマンドラインから2つの部分を組み合わせることができます。
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接続を防ぐためのものです。
答え3
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