이 름
utmp, wtmp − 로 그 인 레 코 드 .
사 용 법
#include <utmp.h>
설 명
utmp 파 일 은 현 재 누 가 시 스 템 을 사 용 하 고 있 는 지 에 대 한 정 보 를 알 려 준 다 . 모 든 프 로 그 램 이 utmp 로 그 를 사 용 하 는 것 은 아 니 기 때 문 에 , 현 재 더 많 은 사 용 자 가 있 을 수 있 다 .
Warning: utmp 는 쓰 기 가 가 능 하 지 않 아 야 한 다 . 왜 냐 하 면 많 은 프 로 그 램 들 이 (어 리 석 게 도 ) 이 것 의 완 전 하 리 라 생 각 하 기 때 문 이 다 . utmp 를 쓰 기 가 능 상 태 로 두 면 , 가 짜 시 스 템 로 그 파 일 이 생 길 수 도 있 고 , 시 스 템 파 일 이 변 경 될 수 도 있 다 .
이 파 일 은 안 에 포 함 된 파 일 에 선 언 된 구 조 에 따 른 엔 트 리 의 시 퀀 스 이 다 . (이 것 은 여 러 정 의 중 하 나 임 을 명 심 하 자 ; 자 세 한 것 은 libc의 버 전 에 따 라 다 르 다 .):
#define UT_UNKNOWN |
0 | |
#define RUN_LVL |
1 | |
#define BOOT_TIME |
2 | |
#define NEW_TIME |
3 | |
#define OLD_TIME |
4 | |
#define INIT_PROCESS |
5 | |
#define LOGIN_PROCESS |
6 | |
#define USER_PROCESS |
7 | |
#define DEAD_PROCESS |
8 | |
#define ACCOUNTING |
9 | |
#define UT_LINESIZE |
12 | |
#define UT_NAMESIZE |
32 | |
#define UT_HOSTSIZE |
256 |
struct exit_status {
/* process termination status. */ | ||
/* process exit status. */ |
};
struct utmp {
/* type of login */ | ||
/* pid of login process */ | ||
/* device name of tty − "/dev/" */ | ||
/* init id or abbrev. ttyname */ | ||
/* user name */ | ||
/* hostname for remote login */ | ||
/* The exit status of a process | ||
marked as DEAD_PROCESS. */ | ||
/* session ID, used for windowing*/ | ||
/* time entry was made. */ | ||
/* IP address of remote host. */ | ||
/* Reserved for future use. */ |
};
/* Backwards
compatibility hacks. */
#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_type를 DEAD_PROCESS로 설 정 하 고 , ut_type는 DEAD_PROCESS나 RUN_LVL가 아 니 고 , PID ut_pid로 실 행 하 는 것 이 없 는 각 각 의 기 록 을 위 해 ,ut_user, ut_host, ut_time을 null 바 이 트 로 지 움 으 로 써 utmp를 지 운 다 . 필 요 한 ut_id 에 빈 기 록 을 찾 을 수 없 다 면 , init는 새 로 운 것 을 만 든 다 . 이 것 은 inittab, ut_pid, ut_time로 부 터 ut_id을 현 제 값 으 로 , ut_type을 INIT_PROCESS로 설 정 한 다 .
getty(8)는 pid로 엔 트 리 를 찾 고 , ut_type를 LOGIN_PROCESS로 바 꾸 고 , ut_time을 바 꾸 고 , ut_line을 설 정 하 고 , 접 속 을 기 다 린 다 . 믿 을 수 있 음 이 증 명 된 후 에 , login(8)은 ut_type을 USER_PROCESS로 바 꾸 고 , ut_time을 바 꾸 고 , ut_host와 ut_addr을 설 정 한 다 getty(8)와 login(8)에 따 라 , 기 록 은 적 당 한 ut_pid 대 신 , ut_line으 로 발 견 된 다 .
init(8)는 프 로 세 스 가 종 료 된 것 을 발 견 하 면 , utmp 항 목 을 ut_pid 옆 에 위 치 시 키 고 , ut_type를 READ_PROCESS으 로 설 정 하 며 , ut_user, ut_host 그 리 고 ut_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_user 그 리
고 ut_host로 null 처 리 한
다 .
할 당 된 터 미 널 이 없 으 면 , xdm(8)는 utmp 기 록 을 만 들 어 서 는 안 된 다 . 이 를 하 나 만 들 도 록 허 용 하 는 것 은 다 음 과 같 은 문 제 들 의 원 인 이 된 다 . 핑 거 (finger), /dev/machine.dom을 시 작 할 수 없 다 . 그 러 나 , ftpd(8)가 하 는 것 처 럼 wtmp 엔 트 리 를 만 들 어 야 한 다 .
telnetd(8)은 LOGIN_PROCESS 엔 트 리 를 설 정 하 고 , login(8) 나 머 지 부 분 은 보 통 과 같 이 남 겨 둔 다 . 텔 넷 세 션 이 끝 난 후 , telnetd(8)는 utmp는 설 명 한 방 식 으 로 소 거 한 다 .
wtmp
파 일 은 모 든 로
그 인 과 로 그 아
웃 을 기 록 한 다 .
이 파 일 의 포 맷
은 널 사 용 자 이
름 이 관 련 된 터
미 널 에 서 로 그
아 웃 을 가 리 키
는 것 을 제 외 하
고 는 거 의 utmp과
비 슷 하 다 . 더 욱
이 , 사 용 자 이 름
"shutdown" 혹 은
"reboot"을 지 닌 터
미 널 이 름
"~"은 시 스 템
셧 다 운 혹 은 리
부 트 를 가 리 키
고 , 터 미 널 이 름
쌍 "|"/"}"은
date(1)이 이 를 변 경
시 킬 때 , 오 래 된
/새 로 운 시 스 템
을 로 그 로 기 록
한 다 . wtmp은 login(1),
init(1), WfIgetty(1)의 일 부
버 전 에 의 해 유
지 된 다 . 이 러 한
프 로 그 램 들 중
하 나 도 파 일 을
만 들 지 못 하 므
로 , 만 일 삭 제 되
면 , 기 록 유 지 는
되 지 않 는 다 .
파 일
/var/run/utmp
/var/log/wtmp
호 환
리 눅 스 utmp 엔 트 리 는 v7/BSD 이 나 SYSV도 따 르 지 않 는 다 . 이 들 은 앞 의 두 가 지 의 혼 합 이 다 . v7/BSD는 더 적 은 필 드 를 갖 고 있 으 며 , 가 장 중 요 한 것 은 죽 은 엔 트 리 나 로 그 인 엔 트 리 를 보 여 주 도 록 하 는 v7/BSD 유 사 프 로 그 램 들 이 부 족 하 다 는 데 있 다 . 더 우 기 , 세 션 에 슬 롯 을 할 당 할 설 정 파 일 이 없 다 . ut_id 필 드 가 없 기 때 문 에 , BSD는 역 시 그 러 하 다 .
리 눅 스 에 서 , ut_id 필 드 기 록 은 일 단 설 정 되 면 절 대 변 경 되 지 않 는 다 . 즉 , 일 단 설 정 되 면 , 설 정 파 일 이 필 요 없 이 , 그 슬 롯 을 남 겨 둔 다 . ut_id 를 소 거 하 면 , 붕 괴 된 utmp 엔 트 리 들 과 잠 재 적 인 보 안 구 멍 들 을 초 래 할 수 있 는 상 태 를 만 든 다 . 위 에 언 급 했 던 필 드 들 을 null 바 이 트 로 채 움 으 로 서 소 거 하 는 것 은 SYSV에 서 는 요 구 되 지 않 지 만 , 많 은 프 로 그 램 들 이 실 행 되 도 록 허 용 한 다 . 리 눅 스 는 행 의 내 용 에 있 어 , BSD 전 통 을 사 용 한 다 .
SYSV는 이 들 을 표 시 하 기 위 해 오 직 유 형 필 드 를 사 용 하 고 , 행 필 드 내 에 "new time"와 같 은 정 보 성 메 시 지 들 을 기 록 한 다 . UT_UNKNOWN는 리 눅 스 에 서 만 볼 수 있 는 것 같 다 .
이 파 일 을 삭 제 함 으 로 서 utmp 로 깅 이 보 이 는 다 양 한 다 른 시 스 템 들 과 는 달 리 , utmp는 리 눅 스 상 에 서 항 상 존 재 한 다 . 만 일 여 러 분 이 who(1)의 기 능 을 정 지 시 키 면 , utmp 영 역 이 읽 혀 지 지 않 도 록 해 야 한 다 .
libc5에 서 utmp 구 조 체 는 libc6내 에 서 변 경 되 었 다 는 것 을 참 조 하 라 . 이 때 문 에 , 이 전 의 libc5 구 조 체 를 사 용 하 는 바 이 너 리 들 은 .IR /var/run/utmp 과 /var/log/wtmp를 붕 괴 시 킨 다 .
데 비 안 시 스 템 들 은 새 로 운 utmp 포 맷 을 사 용 하 는 패 치 된 libc5를 포 함 한 다 . libc5에 서 직 접 액 세 스 되 기 때 문 에 , utmp에 있 어 문 제 는 여 전 히 존 재 한 다 .
RESTRICTIONS
파 일 포 맷 은 머 신 에 의 존 적 이 기 때 문 에 , 이 것 이 생 성 되 는 머 신 의 아 키 텍 쳐 에 서 만 처 리 되 도 록 하 는 것 이 좋 다 .
버 그
이 맨 페 이 지 는 libc5에 기 반 하 며 , 현 재 와 다 르 게 동 작 할 수 도 있 다 .
관 련 항 목
ac(1), date(1), getutent(3), init(8), last(1), login(1), updwtmp(3), who(1)