端末から実行した場合でも、SSHでaskpassプログラムを使用できますか?


9

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ウィンドウが表示された場合は、すぐに気付きます。それを機能させることができれば、それは私にとって十分な妥協案です。


良い質問。ソースコードを見ると、そのようには見えません。あなたはそれを開けないようにだまさなければなりません/dev/ttyLD_PRELOAD?)。
Celada 2016年

@Celadaはシェルの起動時に問題を引き起こすでしょうか?
muru 2016年

おそらくそうではない...
Celada 2016年

回答:


7

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

説明

  1. 強制的ssh$SSH_ASKPASSプログラムを使用するsshには、実際のを表示することはできませんtty。ただのコンディションです。これは、へのスイッチsetsidとを使用して行うことができます。-nssh

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

    しかし、「最初のセッション」をあきらめることができます。-Nリモートコマンドを抑制し、認証のみを行うスイッチも追加する必要があります。

    また、「ジャンク」の可能性のある出力&> /dev/nullは、興味がない場合はリダイレクトできます。

  2. セットアップControlMasterssh_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

全体のプロセスはalias、1つのステップで両方を実行するかbash関数によって簡略化される場合がありますが、読者の想像に任されています。

コマンドライン引数のみ

コマンドラインで両方なしに両方を結合できます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に、プログラムの実行直前、つまりパスワードを取得した直後にバックグラウンドに移動するように指示します。
  • -wsetsidプログラムが終了するのを待つように指示します。この場合、SSHがバックグラウンドに移行すると発生します。と組み合わせるとssh -f、2つのSSHコマンド間の手動の待機をなくすことができます。
  • この関数は、最初の引数がホスト名であると想定しています。
  • テストは、不要なSSH接続を防ぐためのものです。

ControlMasterそのような場合にパスワードを入力するのはとても面倒なので、すでに設定されています。既存のマスターをテストし、それが見つからない場合はアスクパスを使用する関数を書くことは難しくありません。ありがとう!
muru '27 / 03/16

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

残念ながら、これは私にはうまくいきません。とPseudo-terminal will not be allocated because stdin is not a terminal書いてあるので、パイプが何かしているようです。ssh </dev/null同じ効果がありました。ただし、どちらの場合でも、パスワードの入力を求められるので、パスワードを入力できます。LinuxとMacで試しました。私は試しましたssh -vvvが、それは何も有用とは言いません。
Timmmm

1
SSH_ASKPASS=/foo DISPLAY= setsid ssh hostでも動作します。
Timmmm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.