如何讓 /bin/login 不超時
在我的
/etc/inittab
我使用以下行:ttyS0::respawn:/bin/login
如果我想連接到串列埠,這會給我一個登錄提示。但它一直在呼應這一點:
[hostname] login: Login timed out [hostname] login: Login timed out [hostname] login:
我怎樣才能阻止它並讓它不超時?
因此,為了澄清評論中出現的內容:
- 登錄超時是正常的預期行為
- 我想在我的機器上改變這種行為,這樣
login
就不會超時了- 在其他 Linux 發行版中,您可以按照此答案
LOGIN_TIMEOUT
中的說明進行編輯:更改 tty 登錄超時 - ArchLinux/etc/login.defs
- 這在 Busybox 中不起作用
如果不更改原始碼顯然是不可能的。
搜尋
login.defs
或LOGIN_TIMEOUT
產生確實沒有相關結果並查看loginutils/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
,所以它總是執行。您可能要做的就是取消註釋最後兩行並busybox
在可能的情況下重新編譯。另類的想法
# <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
立即重新開始。
正如您所發現的,
login
如果在一定秒數內沒有收到任何輸入,程序可以並且通常配置為超時。這種行為有多種動機,從希望保持未使用的撥號線路清晰到希望您清潔螢幕的世界。同樣,也有不想要它的原因,就像你在這裡一樣。一方面,如果沒有調製解調器,掛斷電話是毫無意義的。不幸的是,
login
程序在這方面有所不同。來自login
(比如)Debian 的登錄包尊重/etc/login.defs
配置文件。我LOGIN_TIMEOUT
在我的設置為0。但其他login
程序有這個不可配置和硬連線。世界上不止一個login
程序。☺FreeBSD 中的
login
程序是——唉!- 一個這樣的。Busybox 內置的login
程序也是如此。前者的硬連線超時為 300 秒;後者,僅僅60秒。Busybox 程式碼是一個編譯時常量。您必須實際修改程序的原始碼並重新建構它才能禁用此行為。根據FreeBSD
login
程序程式碼中解釋為什麼它是執行時變數而不是編譯時常量的註釋,FreeBSD 作者希望您通過修補/usr/bin/login
二進製文件本身來改變這一點。有一些緩解策略。一個是——唉!——保持
getty
循環。FreeBSDlogin
由 FreeBSD 呼叫getty
,它具有通常設置為零的to
能力。/etc/gettydefs
Busyboxgetty
也有類似的-t
選擇。兩者都意味著空閒的、未登錄的串列終端永遠處於login:
顯示的提示符處,並且沒有開始getty
超時。login
我自己不在
getty
虛擬終端上使用。所以對於 FreeBSD,我有一個非常簡單的login-prompt
程序,它只是等待使用者按輸入鍵。login.defs
在 Linux 上,我如前所述關閉超時。但是,對於串列線路上的真實終端,我仍然使用
getty
.進一步閱讀