私は/etc/inittab
次の行を使用します。
ttyS0::respawn:/bin/login
シリアルポートに接続する場合は、ログインプロンプトが表示されます。しかし、引き続き次のような内容が繰り返されます。
[hostname] login:
Login timed out [hostname] login:
Login timed out [hostname] login:
どのように停止してタイムアウトを防ぐことができますか?
したがって、コメントの内容を明確にするために、次のようにします。
- ログインタイムアウトは通常の期待される動作です。
login
もはやタイムアウトが発生しないように、私のコンピュータの動作を変更したいと思います。- 他のLinuxディストリビューションでは、
LOGIN_TIMEOUT
この回答の説明に従って編集できます。/etc/login.defs
ttyログインタイムアウトの変更 - ArchLinux - Busyboxでは動作しません。
答え1
あなたが見つけたように、login
プログラムは特定の時間入力が受信されない限りタイムアウトするように設定することができ、しばしば設定されます。この動作には、未使用のダイヤルアップ回線を開いておくことから、世界中はあなたが画面をきれいにしたいです。。同様に、ここと同じようにそれをしたくない理由があります。まず、モデムがない場合、回線を切断するために電話を切る理由はありません。
残念ながら、login
これに関しては様々な計画が異なる。login
Debian のログインパッケージは設定ファイルに/etc/login.defs
従います。私はLOGIN_TIMEOUT
0に設定されました。ただし、他のlogin
プログラムには構成できず、配線できない機能があります。login
世界にたった一つのプログラムしかありません。 ☺
FreeBSDのプログラムlogin
は - ああ! - そうです。login
Busyboxに組み込まれたプログラムも同様です。前者は300秒のタイムアウトを持っていますが、後者は300秒です。わずか60秒。
Busybox コードはコンパイル時定数です。この動作を無効にするには、プログラムのソースコードを実際に修正して再構築する必要があります。すべてlogin
FreeBSDプログラムコードのコメントこれがコンパイル時定数ではなくランタイム変数である理由を説明します/usr/bin/login
。
いくつかの緩和戦略があります。一つは - ああ! -getty
最新の投稿を確認してください。 FreeBSDは通常、0に設定された機能を持つlogin
FreeBSDによって呼び出されます。 Busyboxにも同様のオプションがあります。どちらも、ログインしていないアイドルシリアル端末が常に表示されるプロンプトにあり、タイムアウトが開始されないことを意味します。getty
to
/etc/gettydefs
getty
-t
login:
getty
login
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