추가 읽기

추가 읽기

내에서는 /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이와 관련하여 다양한 계획이 다릅니다. login데비안의 로그인 패키지는 구성 /etc/login.defs파일을 따릅니다. 내 것은 LOGIN_TIMEOUT0으로 설정되었습니다. 그러나 다른 login프로그램에는 구성할 수 없고 배선할 수 없는 기능이 있습니다. login세상에 단 하나의 프로그램만 있는 것이 아닙니다. ☺

FreeBSD의 프로그램 login은 - 아아! - 이런 거요. loginBusybox에 내장된 프로그램도 마찬가지입니다. 전자는 300초의 시간 초과를 갖고 있지만, 후자는 300초입니다.단 60초.

Busybox 코드는 컴파일 타임 상수입니다. 이 동작을 비활성화하려면 실제로 프로그램의 소스 코드를 수정하고 다시 빌드해야 합니다. 모든loginFreeBSD 프로그램 코드의 주석이것이 컴파일 타임 상수가 아닌 런타임 변수인 이유를 설명하며 FreeBSD 작성자는 /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항상 실행됩니다. 당신이 할 수 있는 일은 마지막 두 줄의 주석을 해제하고 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

관련 정보