내에서는 /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
데비안의 로그인 패키지는 구성 /etc/login.defs
파일을 따릅니다. 내 것은 LOGIN_TIMEOUT
0으로 설정되었습니다. 그러나 다른 login
프로그램에는 구성할 수 없고 배선할 수 없는 기능이 있습니다. login
세상에 단 하나의 프로그램만 있는 것이 아닙니다. ☺
FreeBSD의 프로그램 login
은 - 아아! - 이런 거요. login
Busybox에 내장된 프로그램도 마찬가지입니다. 전자는 300초의 시간 초과를 갖고 있지만, 후자는 300초입니다.단 60초.
Busybox 코드는 컴파일 타임 상수입니다. 이 동작을 비활성화하려면 실제로 프로그램의 소스 코드를 수정하고 다시 빌드해야 합니다. 모든login
FreeBSD 프로그램 코드의 주석이것이 컴파일 타임 상수가 아닌 런타임 변수인 이유를 설명하며 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
항상 실행됩니다. 당신이 할 수 있는 일은 마지막 두 줄의 주석을 해제하고 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