进一步阅读

进一步阅读

在我中,/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不同的计划在这方面有所不同。loginDebian 的登录包遵循配置/etc/login.defs文件。我LOGIN_TIMEOUT的已经设置为0了。但其他login程序具有不可配置和硬连线的功能。login世界上不只有一个程序。 ☺

FreeBSD 中的程序login是——唉! - 一个这样的。loginBusybox 内置的程序也是如此。前者的硬连线超时为 300 秒;后者,仅仅60秒

Busybox 代码是一个编译时常量。您必须实际修改程序的源代码并重新构建它才能禁用此行为。每loginFreeBSD程序代码中的注释这解释了为什么它是一个运行时变量而不是编译时常量,FreeBSD 作者希望您通过修补/usr/bin/login二进制文件本身来改变这一点。

有一些缓解策略。其一是——唉! - 保持getty在循环中。 FreeBSDlogin是由 FreeBSD 调用的getty,它具有通常设置为零的to功能。 /etc/gettydefsBusybox 也getty有类似的-t选项。两者都意味着空闲的、未登录的串行终端永远处于login:显示的提示符处,并且不会开始getty超时。login

我自己不在getty虚拟终端上使用。所以对于 FreeBSD 我有一个非常简单的login-prompt程序只是等待用户按回车键。在 Linux 上,我像前面提到的那样关闭超时login.defs

然而,对于串行线上的真实终端,我仍然使用getty.

进一步阅读

答案2

显然不改变源代码是不可能的。

搜索login.defsLOGIN_TIMEOUT确实没有产生相关结果并查看登录实用程序/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立即重新开始。

相关内容