追加読書

追加読書

私は/etc/inittab次の行を使用します。

ttyS0::respawn:/bin/login

シリアルポートに接続する場合は、ログインプロンプトが表示されます。しかし、引き続き次のような内容が繰り返されます。

[hostname] login: 
Login timed out [hostname] login: 
Login timed out [hostname] login: 

どのように停止してタイムアウトを防ぐことができますか?

したがって、コメントの内容を明確にするために、次のようにします。

  • ログインタイムアウトは通常の期待される動作です。
  • loginもはやタイムアウトが発生しないように、私のコンピュータの動作を変更したいと思います。
  • 他のLinuxディストリビューションでは、LOGIN_TIMEOUTこの回答の説明に従って編集できます。/etc/login.defsttyログインタイムアウトの変更 - ArchLinux
  • Busyboxでは動作しません。

答え1

あなたが見つけたように、loginプログラムは特定の時間入力が受信されない限りタイムアウトするように設定することができ、しばしば設定されます。この動作には、未使用のダイヤルアップ回線を開いておくことから、世界中はあなたが画面をきれいにしたいです。。同様に、ここと同じようにそれをしたくない理由があります。まず、モデムがない場合、回線を切断するために電話を切る理由はありません。

残念ながら、loginこれに関しては様々な計画が異なる。loginDebian のログインパッケージは設定ファイルに/etc/login.defs従います。私はLOGIN_TIMEOUT0に設定されました。ただし、他のloginプログラムには構成できず、配線できない機能があります。login世界にたった一つのプログラムしかありません。 ☺

FreeBSDのプログラムloginは - ああ! - そうです。loginBusyboxに組み込まれたプログラムも同様です。前者は300秒のタイムアウトを持っていますが、後者は300秒です。わずか60秒

Busybox コードはコンパイル時定数です。この動作を無効にするには、プログラムのソースコードを実際に修正して再構築する必要があります。すべてloginFreeBSDプログラムコードのコメントこれがコンパイル時定数ではなくランタイム変数である理由を説明します/usr/bin/login

いくつかの緩和戦略があります。一つは - ああ! -getty最新の投稿を確認してください。 FreeBSDは通常、0に設定された機能を持つloginFreeBSDによって呼び出されます。 Busyboxにも同様のオプションがあります。どちらも、ログインしていないアイドルシリアル端末が常に表示されるプロンプトにあり、タイムアウトが開始されないことを意味します。gettyto/etc/gettydefsgetty-tlogin:gettylogin

getty仮想端末では直接使用しません。だからFreeBSDの場合はとても簡単です。login-promptプログラムは、ユーザーが Enter キーを押すまで待ち​​ます。 Linuxでは、前述のようにタイムアウトを解除しますlogin.defs

しかし、シリアルラインの実際の端末にはまだgetty

追加読書

答え2

明らかに、これはソースコードを変更しなければ不可能です。

関連する結果が検索さlogin.defsれないか、実際には表示されずに検索されますLOGIN_TIMEOUTログイン-utils/login.cこの値とタイマー全体が実際にハードコードされているようです。

enum {
    TIMEOUT = 60,
    EMPTY_USERNAME_COUNT = 10,
    /* Some users found 32 chars limit to be too low: */
    USERNAME_SIZE = 64,
    TTYNAME_SIZE = 32,
};

[… ]

static void alarm_handler(int sig UNUSED_PARAM)
{
    /* This is the escape hatch! Poor serial line users and the like
     * arrive here when their connection is broken.
     * We don't want to block here */
    ndelay_on(STDOUT_FILENO);
    /* Test for correct attr restoring:
     * run "getty 0 -" from a shell, enter bogus username, stop at
     * password prompt, let it time out. Without the tcsetattr below,
     * when you are back at shell prompt, echo will be still off.
     */
    tcsetattr_stdin_TCSANOW(&G.tty_attrs);
    printf("\r\nLogin timed out after %u seconds\r\n", TIMEOUT);
    fflush_all();
    /* unix API is brain damaged regarding O_NONBLOCK,
     * we should undo it, or else we can affect other processes */
    ndelay_off(STDOUT_FILENO);
    _exit(EXIT_SUCCESS);
}

[… ]

int login_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int login_main(int argc UNUSED_PARAM, char **argv)
{

[… ]

    /* We install timeout handler only _after_ we saved G.tty_attrs */
    signal(SIGALRM, alarm_handler);
    alarm(TIMEOUT);

最後の部分はインデントされておらず、周囲にもインデントがないようでif常に実行されます。あなたができることは、最後の2行のコメントを解除してbusybox(可能であれば)再コンパイルすることです。

代替アイデア

~からbusyboxの例inittab:

# <action>: Valid actions include: sysinit, respawn, askfirst, wait, once,
#                                  restart, ctrlaltdel, and shutdown.
#
#       Note: askfirst acts just like respawn, but before running the specified
#       process it displays the line "Please press Enter to activate this
#       console." and then waits for the user to press enter before starting
#       the specified process.

したがって、簡単にrespawnに変更できますaskfirst。これにより、すぐに再起動するのではなく、タイムアウトが期限切れになった後にプロンプ​​ト/bin/loginに戻ります。Please press Enter…/bin/login

関連情報