Manpages

名 前

utmp, wtmp − ロ グ イ ン 記 録

書 式

#include <utmp.h>

説 明

utmp フ ァ イ ル を 見 る こ と で 、 現 在 誰 が シ ス テ ム を 使 っ て い る か と い う 情 報 が 得 ら れ る 。 た だ す べ て の プ ロ グ ラ ム が utmp フ ァ イ ル を 更 新 し て い る わ け で は な い の で 、 実 際 に は そ れ 以 上 の ユ ー ザ ー が シ ス テ ム を 使 っ て い る 可 能 性 が あ る 。 警 告 : (愚 か に も ) 多 く の シ ス テ ム プ ロ グ ラ ム が そ の 整 合 性 に 依 存 し て い る の で 、 utmp フ ァ イ ル は "other" に 分 類 さ れ る ユ ー ザ ー に 対 し て 書 き 込 み 可 能 に し て は な ら な い 。 フ ァ イ ル の 所 有 者 と グ ル ー プ オ ー ナ ー 以 外 の ユ ー ザ ー に 対 し て utmp フ ァ イ ル を 書 き 込 み 可 能 な 状 態 に し て お く と 、 シ ス テ ム の ロ グ フ ァ イ ル を 偽 造 さ れ た り 、 シ ス テ ム フ ァ イ ル の 改 ざ ん を 受 け る と い っ た リ ス ク を 犯 す こ と に な る 。 こ の フ ァ イ ル は utmp 構 造 体 の 繰 り 返 し で 構 成 さ れ る 。 こ の 構 造 体 は <utmp.h> で 以 下 の よ う に 定 義 さ れ て い る (こ こ に 記 述 し て あ る の は 幾 つ か の 大 ま か な 定 義 の み で 、 詳 細 は libc の バ ー ジ ョ ン に よ り 変 わ る こ と に 注 意 が 必 要 で あ る )。

/* Values for ut_type field, below */

#define EMPTY 0 /* Record does not contain valid info
(formerly known as UT_UNKNOWN on Linux) */
#define RUN_LVL 1 /* Change in system run−level (see
init(8)) */
#define BOOT_TIME 2 /* Time of system boot (in ut_tv) */
#define NEW_TIME 3 /* Time after system clock change
(in ut_tv) */
#define OLD_TIME 4 /* Time before system clock change
(in ut_tv) */
#define INIT_PROCESS 5 /* Process spawned by init(8) */
#define LOGIN_PROCESS 6 /* Session leader process for user login */
#define USER_PROCESS 7 /* Normal process */
#define DEAD_PROCESS 8 /* Terminated process */
#define ACCOUNTING 9 /* Not implemented */

#define UT_LINESIZE 32
#define UT_NAMESIZE 32
#define UT_HOSTSIZE 256

struct exit_status { /* Type for ut_exit, below */
short int e_termination; /* Process termination status */
short int e_exit; /* Process exit status */ };

struct utmp {
short ut_type; /* Type of record */
pid_t ut_pid; /* PID of login process */
char ut_line[UT_LINESIZE]; /* Device name of tty − "/dev/" */
char ut_id[4]; /* Terminal name suffix,
or inittab(5) ID */
char ut_user[UT_NAMESIZE]; /* Username */
char ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or
kernel version for run−level
messages */
struct exit_status ut_exit; /* Exit status of a process
marked as DEAD_PROCESS; not
used by Linux init(1) */
/* ut_session と ut_tv フ ィ ー ル ド は 、 32ビ ッ ト で コ ン パ イ ル さ れ た 場 合 と
64ビ ッ ト で コ ン パ イ ル さ れ た 場 合 で 同 じ サ イ ズ で な け れ ば な ら な い 。 こ う す る こ と で 、
32ビ ッ ト と 64ビ ッ ト の ア プ リ ケ ー シ ョ ン で 、 デ ー タ フ ァ イ ル と 共 有 メ モ リ ー を 共 有 す る こ と が で き る よ う に な る 。
*/
#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
int32_t ut_session; /* Session ID (getsid(2)),
used for windowing */
struct {
int32_t tv_sec; /* Seconds */
int32_t tv_usec; /* Microseconds */ }
ut_tv; /* Time entry was made */
#else
long ut_session; /* Session ID */
struct timeval ut_tv; /* Time entry was made */
#endif

int32_t ut_addr_v6[4]; /* Internet address of remote
host; IPv4 address uses
just ut_addr_v6[0] */
char __unused[20]; /* Reserved for future use */ };

/* Backward 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') に よ っ て 終 端 さ れ る 。 最 初 の エ ン ト リ ー は init(1) コ マ ン ド が inittab(5) を 処 理 す る こ と で 作 ら れ る 。 あ る エ ン ト リ ー を 処 理 す る 前 に 、 init(1)ut_typeDEAD_PROCESS に 初 期 化 す る 。 レ コ ー ド の ut_typeDEAD_PROCESSRUN_LVL の い ず れ で も な く 、 か つ PID が ut_pid で あ る プ ロ セ ス が い な い 場 合 は 、 ut_user, ut_host, ut_time を ヌ ル バ イ ト で ク リ ア し て 初 期 化 を 行 う 。 必 要 な ut_id を 持 つ 空 の レ コ ー ド を 見 つ け ら れ な か っ た 場 合 、 init(1) は 新 し い レ コ ー ド を 作 る 。 inittab か ら ut_id を 設 定 し 、 ut_pid お よ び ut_time を 現 在 値 に 、 ut_typeINIT_PROCESS に 設 定 す る 。

mingetty(8) (ま た は agetty(8)) は pid で エ ン ト リ ー を 特 定 し 、 ut_typeLOGIN_PROCESS に 変 更 し 、 ut_time を 更 新 し 、 ut_lineを 設 定 し た 後 、 接 続 が 確 立 さ れ る の を 待 つ 。 login(1) は ユ ー ザ ー 認 証 が 終 了 す る と 、 ut_typeUSER_PROCESS に 変 更 し 、 ut_time を 更 新 し 、 ut_hostut_addrを 設 定 す る 。 mingetty(8) (ま た は agetty(8)) と login(1) に よ り 異 な る が 、 ut_pid の 代 わ り に ut_line を 使 っ て レ コ ー ド の 特 定 が 行 わ れ る こ と も あ る (ut_pid を 使 う 方 が 望 ま し い ) 。

init(1) は プ ロ セ ス の 終 了 を 検 出 し た 場 合 、 ut_pid を キ ー と し て utmp の エ ン ト リ ー を 特 定 し 、 ut_typeDEAD_PROCESS に 設 定 し 、 ut_user, ut_host, ut_time を ヌ ル バ イ ト で ク リ ア す る 。

xterm(1) コ マ ン ド や 他 の 端 末 エ ミ ュ レ ー タ は 直 接 USER_PROCESS の レ コ ー ド を 作 り 、 端 末 名 の サ フ ィ ッ ク ス 文 字 列 (/dev/[pt]ty に 続 く 文 字 列 ) を 使 っ て ut_id の 値 を 生 成 す る 。 こ の id を 持 つ エ ン ト リ ー が DEAD_PROCESS で あ っ た 場 合 に は 再 利 用 し 、 そ れ 以 外 の 場 合 に は 新 し い エ ン ト リ ー が 作 ら れ る 。 可 能 な 場 合 に は プ ロ セ ス 終 了 時 に DEAD_PROCESS と 設 定 し 、 さ ら に ut_line, ut_time, ut_user, ut_host を ヌ ル バ イ ト で ク リ ア す る こ と が 奨 励 さ れ て い る 。

telnetd(8)LOGIN_PROCESS を 設 定 す る だ け で よ く 、 残 り の 処 理 は 通 常 通 り login(1) に 任 せ れ ば よ い 。 telnet の セ ッ シ ョ ン が 終 了 し た 後 、 前 述 の よ う に telnetd(8) が utmp の エ ン ト リ ー を 初 期 化 す る 。

wtmp フ ァ イ ル に は 、 す べ て の ロ グ イ ン と ロ グ ア ウ ト が 記 録 さ れ る 。 そ の フ ォ ー マ ッ ト は 、 ロ グ ア ウ ト 済 の 端 末 で ユ ー ザ ー 名 が ヌ ル と な る こ と 以 外 は utmp と ま っ た く 同 じ で あ る 。 ユ ー ザ ー 名 が shutdown も し く は reboot で あ る 端 末 名 ~ は シ ス テ ム の 停 止 (shutdown) ま た は 再 起 動 (reboot) を 意 味 す る 。 ま た そ の 端 末 名 が |} の 対 は date(1) コ マ ン ド で 変 更 し た 新 / 旧 の シ ス テ ム 時 刻 を 記 録 し て い る 。 wtmp フ ァ イ ル は login(1), init(1) や い く つ か の バ ー ジ ョ ン の getty(8) (mingetty(8) ま た は agetty(8)) に よ り 管 理 さ れ て い る 。 こ れ ら の プ ロ グ ラ ム は ど れ も フ ァ イ ル を 新 た に 作 成 し な い の で 、 フ ァ イ ル を 削 除 す る こ と で 情 報 の 記 録 (record−keeping) を 止 め る こ と が で き る 。

フ ァ イ ル

/var/run/utmp
/var/log/wtmp

準 拠

POSIX.1 で は 、 utmp 構 造 体 で は な く 、 utmpx 構 造 体 を 規 定 し て い る 。 utmpx 構 造 体 で 規 定 さ れ て い る の は 、 フ ィ ー ル ド ut_type, ut_pid, ut_line, ut_id, ut_user, ut_tv で あ る 。 POSIX.1 で は 、 フ ィ ー ル ド ut_lineut_user の 長 さ は 規 定 さ れ て い な い 。

Linux で は 、 utmpx 構 造 体 の 定 義 は utmp 構 造 体 と 同 じ で あ る 。 過 去 の シ ス テ ム と の 比 較
Linux で の utmp の エ ン ト リ ー は v7/BSD や System V の い ず れ に も 準 拠 し て お ら ず 、 そ の 両 方 が 混 在 し た も の で あ る 。

v7/BSD で は よ り 少 し の 項 目 し か な い ; も っ と も 重 要 な こ と は 、 ut_type が 無 い こ と で あ る 。 そ の た め v7/BSD 系 の プ ロ グ ラ ム で は (た と え ば ) 死 ん だ 状 態 の エ ン ト リ ー や ロ グ イ ン 状 態 の エ ン ト リ ー ま で 表 示 さ れ て し ま う こ と に な っ た 。 さ ら に セ ッ シ ョ ン 用 の ス ロ ッ ト を 割 り 当 て る た め の 設 定 フ ァ イ ル が な い 。 BSD に 設 定 フ ァ イ ル が あ る の は ut_id が な い か ら で あ る 。

Linux (System V 系 )で は 、 設 定 フ ァ イ ル を 必 要 と せ ず セ ッ シ ョ ン 用 の ス ロ ッ ト を 割 り 当 て る の で 、 一 旦 設 定 さ れ て し ま う と レ コ ー ド の ut_id は 決 し て 変 更 さ れ な い 。 ut_id を ク リ ア す る と 競 合 状 態 に お ち い り 、 utmp の エ ン ト リ ー を 壊 し た り 、 潜 在 的 な セ キ ュ リ テ ィ ホ ー ル に な る 可 能 性 が あ る 。 上 述 の フ ィ ー ル ド を ヌ ル バ イ ト で 埋 め て ク リ ア し て お く の は 、 System V で の 取 り 決 め で は 必 要 と は さ れ て い な い が 、 BSD で の 取 り 決 め を 前 提 と し て い て 、 か つ utmp を 更 新 し な い 多 く の プ ロ グ ラ ム が 動 作 す る よ う に す る た め で あ る 。 Linux で は こ こ ま で 記 述 し て き た よ う に 、 行 内 容 の 表 示 は BSD の 慣 例 に 従 っ て い る 。

UT_UNKNOWN は Linux で 作 ら れ た も の の よ う で あ る 。 System V に は ut_hostut_addr_v6 も 存 在 し な い 。

注 意

フ ァ イ ル を 削 除 す る こ と で utmp へ の 記 録 を 止 め ら れ る 他 の 様 々 な シ ス テ ム と は 違 い 、 Linux で は utmp フ ァ イ ル を 必 ず お い て お く 必 要 が あ る 。 who(1) コ マ ン ド が 機 能 し な い よ う に し た い 場 合 に は 、 utmp フ ァ イ ル の 全 ユ ー ザ ー に 対 す る 読 み 取 り 許 可 を 設 定 し な い よ う に す る 。 フ ァ イ ル の フ ォ ー マ ッ ト は マ シ ン に 依 存 す る の で 、 フ ァ イ ル が 作 ら れ た マ シ ン も し く は 同 一 ア ー キ テ ク チ ャ ー の マ シ ン 上 で の み 処 理 す る こ と を 推 奨 す る 。 注 意 す べ き 点 と し て は 、 biarch な プ ラ ッ ト フ ォ ー ム 、 つ ま り 32ビ ッ ト と 64ビ ッ ト の 両 方 の ア プ リ ケ ー シ ョ ン を 実 行 で き る シ ス テ ム (x86−64, ppc64, s390x な ど ) で は 、 ut_tv の サ イ ズ は 32ビ ッ ト モ ー ド と 64ビ ッ ト モ ー ド で 同 じ で あ る 。 ut_sessionut_time も 、 存 在 す る 場 合 に は 同 様 に 同 じ サ イ ズ で あ る 。 こ れ に よ り 、 32ビ ッ ト ア プ リ ケ ー シ ョ ン と 64ビ ッ ト ア プ リ ケ ー シ ョ ン の 間 で デ ー タ フ ァ イ ル と 共 有 メ モ リ ー を 共 有 す る こ と が 可 能 に な る 。 そ の た め に は 、 ut_sessionint32_t 型 に 、 ut_tv を 2つ の int32_t 型 の フ ィ ー ル ド tv_sec, tv_usec を 持 つ 構 造 体 に 変 更 す れ ば よ い ut_tvstruct timeval と 同 じ サ イ ズ と は 限 ら な い の で 、

gettimeofday((struct timeval *) &ut.ut_tv, NULL); の よ う な 呼 び 出 し を す る の で は な く 、 以 下 の よ う に 各 フ ィ ー ル ド を 設 定 す る 方 法 が 推 奨 さ れ る :

struct utmp ut;
struct timeval tv;

gettimeofday(&tv, NULL);
ut.ut_tv.tv_sec = tv.tv_sec;
ut.ut_tv.tv_usec = tv.tv_usec;

関 連 項 目

ac(1), date(1), last(1), login(1), utmpdump(1), who(1), getutent(3), getutmp(3), login(3), logout(3), logwtmp(3), updwtmp(3), init(1)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。