端末テキストログインプロンプト中にコマンド出力を表示するにはどうすればよいですか?

端末テキストログインプロンプト中にコマンド出力を表示するにはどうすればよいですか?

主に実行されるヘッドレスサーバーがあります。ダーバンxorg/グラフィック環境がインストールされていません。起動時にテキストモードのログインプロンプトのみが表示されます。

どうすればいいのか知りたいユーザーがログインする前にコマンドの出力を表示します。(マイ端末のログイン画面から)?コマンドはコマンドのように表示され、watch2秒ごとに更新され、対話は必要ありません。

watch注:ほとんどの場合、自分のコンピュータにSSHセッションを置いてSSHセッションを実行するだけで十分であるか、ブラウザから必要なものを提供できるWebサーバーをインストールする方が良いことがわかります。しかし、私のシナリオでは、両方のアプローチはいくつかの理由で実用的ではありません。また、純粋に好奇心を満たすために、この質問に対する答えを知りたいです。

答え1

私の頭の中では、次のことができます。

  1. 必要なすべてのタスクを実行するスクリプトを作成します(たぶん、たぶんwatch somecommand、もっと複雑になるかもしれません)。
  2. ユーザーアカウントを作成し、このスクリプトをログインシェルに設定します。
  3. gettyそのユーザーが自動的にログインするように調整

これにより、正しくログインできなくなる可能性があります。これを把握するには、いくつかの実験が必要です。

もちろん、ログイン時間情報を表示する一般的なメカニズムはです/etc/issue。しかし、この観点からは、1. 任意のコマンドを実行してそのコマンドを出力するメカニズムはなく、2. 出力を一度印刷するのではなく、継続的に更新するメカニズムがないため、不適切に見えます。

答え2

前述のように/etc/issue正しい場所に表示されますが、これは静的メッセージです。

あなたできる/etc/issue時々プロセスを強制的に再起動するスクリプトを作成しましたが、gettyログインを妨げる2秒間隔を使用しました。より現実的な間隔は約1分です。

Debian の場合、以下を使用している可能性がありますagetty(参照マニュアルページ)。SIGHUP以下を送信して再起動できます(例:もちろん、次gettyのように実行した後)。

関連読書:

答え3

loginttyが初期化されたらすぐに実行するのではなく、次のスクリプトを実行してください。

#!/bin/sh
(   trap '' TTOU
    while   clear
    do      #gen your output
            sleep 2
    done
) & stty -icanon
    dd    count=1 >/dev/null 2>&1
    stty  icanon
    exec  login

... ttyで少なくとも1バイトを読むまでループに入れたすべてを実行し、その時点でlogin呼び出されます。login常にtty制御で始まるので、HUP端末に出力を書き込むバックグラウンドプロセスは終了するとすぐに終了しますが、目的の出力を生成するために誰かがキーを押すまでループしません。バックグラウンドで制御するttyに出力を書き込むことができますが、バックグラウンドループが何をしようとしても、決して成功しません。読むそれから入力を取得します。

関連情報