Login

如何讓 /bin/login 不超時

  • January 26, 2017

在我的/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.defsLOGIN_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在可能的情況下重新編譯。

另類的想法

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.

因此,您可以簡單地更改respawnaskfirst. 這種方式/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 程式碼是一個編譯時常量。您必須實際修改程序的原始碼並重新建構它才能禁用此行為。根據FreeBSDlogin程序程式碼中解釋為什麼它是執行時變數而不是編譯時常量的註釋,FreeBSD 作者希望您通過修補/usr/bin/login二進製文件本身來改變這一點。

有一些緩解策略。一個是——唉!——保持getty循環。FreeBSDlogin由 FreeBSD 呼叫getty,它具有通常設置為零的to能力。/etc/gettydefsBusyboxgetty也有類似的-t選擇。兩者都意味著空閒的、未登錄的串列終端永遠處於login:顯示的提示符處,並且沒有開始getty超時。login

我自己不在getty虛擬終端上使用。所以對於 FreeBSD,我有一個非常簡單的login-prompt程序,它只是等待使用者按輸入鍵。login.defs在 Linux 上,我如前所述關閉超時。

但是,對於串列線路上的真實終端,我仍然使用getty.

進一步閱讀

引用自:https://unix.stackexchange.com/questions/340333