리눅스 명령 배우기 - wtmp

이름

utmp, wtmp - 로그인 레코드

개요

#include

기술

utmp 파일을 사용하면 현재 누가 시스템을 사용하고 있는지에 대한 정보를 검색 할 수 있습니다. 모든 프로그램이 utmp 로깅을 사용하지는 않기 때문에 현재 시스템을 사용하는 사용자가 더 많을 수 있습니다.

경고 : 많은 시스템 프로그램 (어리석게도)이 무결성에 의존하기 때문에 utmp 는 쓰기 가능하지 않아야합니다. utmp 를 모든 사용자에게 쓰기 권한으로 남겨두면 가짜 시스템 로그 파일과 시스템 파일 수정의 위험이 있습니다.

이 파일은 include 파일에 선언 된 다음 구조를 갖는 일련의 항목입니다 (libc의 버전에 따라 세부 사항이 달라질 수 있습니다).

#define UT_UNKNOWN 0 #define RUN_LVL 1 #define BOOT_TIME 2 #define OLD_TIME 4 # 정의 INIT_PROCESS 5 # 정의 LOGIN_PROCESS 6 #define USER_PROCESS 7 #define DEAD_PROCESS 8 # 정의 회계 정의 9 #define UT_LINESIZE 12 #define UT_NAMESIZE 32 #define UT_HOSTSIZE 256 구조체 exit_status {short int e_termination; / * 프로세스 종료 상태. * / 짧은 int e_exit; / * 프로세스 종료 상태. * /}; struct utmp {짧은 ut_type; / * 로그인 유형 * / pid_t ut_pid; / * 로그인 프로세스의 PID * / char ut_line [UT_LINESIZE]; / * tty의 장치 이름 - "/ dev /"* / char ut_id [4]; / * init id 또는 abbrev. ttyname * / char ut_user [UT_NAMESIZE]; / * 사용자 이름 * / char ut_host [UT_HOSTSIZE]; / * 원격 로그인을위한 호스트 이름 * / struct exit_status ut_exit; / * DEAD_PROCESS로 표시된 프로세스의 종료 상태. * / long ut_session; / * 윈도우 잉에 사용되는 세션 ID * / struct timeval ut_tv; / * 시간 입력이되었습니다. * / int32_t ut_addr_v6 [4]; / * 원격 호스트의 IP 주소. * / char pad [20]; / * 향후 사용을 위해 예약되어 있습니다. * /}; / * 이전 버전과의 호환성. * / #define ut_name ut_user #ifndef _NO_UT_TIME #define ut_time ut_tv.tv_sec #endif #define ut_xtime ut_tv.tv_sec #define ut_addr ut_addr_v6 [0]

이 구조체는 사용자 터미널과 관련된 특수 파일의 이름, 사용자의 로그인 이름 및 로그인 시간time (2) 형식으로 제공 합니다 . 문자열 필드는 필드의 크기보다 짧은 경우 '\ 0' 으로 끝납니다.

처음 생성 된 항목은 inittab (5)를 처리하는 init (8)의 결과입니다. init (8)은 항목이 처리되기 전에 ut_typeDEAD_PROCESS로 설정 하고 ut_typeDEAD_PROCESS 또는 RUN_LVL 이 아니고 PID ut_pid 가있는 프로세스가없는 각 레코드에 대해 null 바이트로 ut_user , ut_hostut_time 을 지워 utmp를 정리합니다. 필요한 ut_id 가있는 빈 레코드를 찾을 수 없으면 init이 새 ut_id 를 만듭니다. uttid , ut_pidut_timeut_id 를 현재 값으로 설정 하고 ut_typeINIT_PROCESS설정 합니다.

getty (8)는 pid로 항목을 찾고 , ut_typeLOGIN_PROCESS 로 변경 하고 , ut_time을 변경 하고 , ut_line 을 설정 하고 , 연결이 설정 될 때까지 대기합니다. login (8)은 사용자가 인증 된 후 ut_typeUSER_PROCESS 로 변경 하고 ut_time을 변경하며 ut_hostut_addr을 설정합니다. getty (8) 및 login (8)에 따라 레코드는 바람직한 ut_pid 대신 ut_line 에 의해 위치 할 수 있습니다.

init (8)은 프로세스가 종료되었음을 발견하면 ut_pid로 utmp 항목을 찾고 ut_typeDEAD_PROCESS로 설정하고 ut_user , ut_hostut_time 을 null 바이트로 지 웁니다.

xterm (1) 및 다른 터미널 에뮬레이터는 직접 USER_PROCESS 레코드를 만들고 / dev / ttyp % c 의 마지막 두 문자를 사용하거나 / dev / pts / % d에 p % d 를 사용하여 ut_id 를 생성합니다. 이 ID에 대해 DEAD_PROCESS 를 찾으면 재활용하고 그렇지 않으면 새 항목을 작성합니다. 가능한 경우 종료시 DEAD_PROCESS 로 표시하며 ut_line , ut_time , ut_userut_host 도 null로 권고합니다.

xdm (8)은 할당 된 터미널이 없기 때문에 utmp 레코드를 생성해서는 안됩니다. 그것을 생성 시키면 'finger : can not stat /dev/machine.dom'과 같은 오류가 발생합니다. ftpd (8)처럼 wtmp 항목을 만들어야합니다.

telnetd (8)은 LOGIN_PROCESS 항목을 설정하고 평소와 같이 나머지를 login (8)으로 남겨 둡니다. 텔넷 세션이 끝나면, telnetd (8)은 앞에서 설명한대로 utmp를 정리합니다.

wtmp 파일은 모든 로그인과 로그 아웃을 기록합니다. 그 형식은 널 (null) 사용자 이름이 연관된 터 L 널에서 로그 아웃을 표시한다는 점을 제외하고는 정확히 utmp 와 유사합니다. 또한 사용자 이름이 "shutdown" 또는 "reboot"인 터미널 이름 "~" 은 시스템 종료 또는 재부팅을 나타내며 터미널 이름 쌍 "|" / "}"date (1)이 변경 될 때 이전 / 새로운 시스템 시간을 기록 합니다. wtmplogin (1), init (1) 및 일부 버전의 getty (1)에 의해 유지됩니다. 이 두 프로그램 모두 파일을 작성하지 않으므로 파일 이 제거되면 레코드 유지가 해제됩니다.