コマンドラインパラメータのみ

コマンドラインパラメータのみ

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

これは少し複雑ですが、いくつかの部分を組み合わせると機能します。

説明する

  1. sshプログラムを強制的に使用するには、実際のプログラムを表示できないようにすることは$SSH_ASKPASSできません。これは単なる条件です。これはスイッチを使用して行うことができます。sshttysetsid-nssh

    この場合、接続は開始されますが、シェルと対話できません。これはおそらくあなたの要件です。;)(ローカルTTYも破壊されます)。

    しかし、「最初のセッション」を削除できます。また、-Nリモートコマンドを抑制して実行するスイッチを追加する必要があります。ただ認証

    &> /dev/nullこれに興味がない場合は、可能な出力「ジャンク」をその場所にリダイレクトすることもできます。

  2. 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にバックグラウンドに移動するように指示します。
  • -wsetsidスタンバイプログラムを終了するように指示します。この場合、SSHがバックグラウンドに切り替えられたときにこれが発生します。と一緒に使用すると、ssh -f2つの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

関連情報