web-dev-qa-db-ja.com

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

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

9
muru

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

説明

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

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

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

    また、不要な出力「ジャンク」を&> /dev/nullにリダイレクトすることもできます。

  2. ssh_configControlMasterを設定します。これはクールな機能であり、接続が確立されると、セッションをかなり高速に「起動」できます。 ~/.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または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 "$@"
}
  • -fは、プログラムの実行直前、つまりパスワードを取得した直後のバックグラウンドに移動するようにSSHに指示します。
  • -wは、プログラムの終了を待機するようsetsidに指示します。この場合、SSHがバックグラウンドに移行すると発生します。 ssh -fと組み合わせると、2つのSSHコマンド間の手動の待機を排除できます。
  • この関数は、最初の引数がホスト名であると想定しています。
  • テストは、不要なSSH接続を防ぐためのものです。
7
Jakuje

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
3
kenorb