GNU/Linux >> Linux の 問題 >  >> Linux

端末から実行された場合でも、askpass プログラムを使用するように SSH を取得できますか?

これはもう少し複雑になりますが、いくつかの要素を組み合わせることで機能します:

説明

<オール>
  • 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 ディストリビューションでこの機能を利用できるようになるまで少し待つ必要があります。


    Linux
    1. Ssh –ローカルマシンのターミナルカラーを、I Sshを使用するマシンのターミナルカラーを使用するように設定しますか?

    2. Linux – Elfバイナリからコンパイラ情報を取得できますか?

    3. crontab が使用する環境変数はどこで設定できますか?

    1. ターミナルで現在の日付と時刻を取得し、ターミナルでカスタム コマンドを設定するにはどうすればよいですか?

    2. ターミナルの任意のパスから .sh-script を実行するには?

    3. SOCKS 5 プロキシで SSH を使用するにはどうすればよいですか?

    1. SystemdとTerminalの起動プログラムの違いは?

    2. ターミナルで vagrant の SSH を終了する方法

    3. 外部 SMTP サーバーを使用するようにシステム メールを設定できますか?