名 前
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_type
を DEAD_PROCESS に 初 期
化 す る 。 レ コ
ー ド の ut_type が
DEAD_PROCESS と RUN_LVL の
い ず れ で も な
く 、 か つ PID が
ut_pid で あ る プ ロ
セ ス が い な い
場 合 は 、 ut_user,
ut_host, ut_time を ヌ ル
バ イ ト で ク リ
ア し て 初 期 化
を 行 う 。 必 要
な ut_id を 持 つ 空
の レ コ ー ド を
見 つ け ら れ な
か っ た 場 合 、
init(1) は 新 し い レ
コ ー ド を 作 る
。 inittab か ら ut_id を
設 定 し 、 ut_pid お
よ び ut_time を 現 在
値 に 、 ut_type を
INIT_PROCESS に 設 定 す
る 。
mingetty(8) (ま た は agetty(8)) は pid で エ ン ト リ ー を 特 定 し 、 ut_type を LOGIN_PROCESS に 変 更 し 、 ut_time を 更 新 し 、 ut_lineを 設 定 し た 後 、 接 続 が 確 立 さ れ る の を 待 つ 。 login(1) は ユ ー ザ ー 認 証 が 終 了 す る と 、 ut_type を USER_PROCESS に 変 更 し 、 ut_time を 更 新 し 、 ut_host と ut_addrを 設 定 す る 。 mingetty(8) (ま た は agetty(8)) と login(1) に よ り 異 な る が 、 ut_pid の 代 わ り に ut_line を 使 っ て レ コ ー ド の 特 定 が 行 わ れ る こ と も あ る (ut_pid を 使 う 方 が 望 ま し い ) 。
init(1) は プ ロ セ ス の 終 了 を 検 出 し た 場 合 、 ut_pid を キ ー と し て utmp の エ ン ト リ ー を 特 定 し 、 ut_type を DEAD_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_line と ut_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_host も ut_addr_v6 も 存 在 し な い 。
注 意
フ ァ イ ル を 削 除 す る こ と で utmp へ の 記 録 を 止 め ら れ る 他 の 様 々 な シ ス テ ム と は 違 い 、 Linux で は utmp フ ァ イ ル を 必 ず お い て お く 必 要 が あ る 。 who(1) コ マ ン ド が 機 能 し な い よ う に し た い 場 合 に は 、 utmp フ ァ イ ル の 全 ユ ー ザ ー に 対 す る 読 み 取 り 許 可 を 設 定 し な い よ う に す る 。 フ ァ イ ル の フ ォ ー マ ッ ト は マ シ ン に 依 存 す る の で 、 フ ァ イ ル が 作 ら れ た マ シ ン も し く は 同 一 ア ー キ テ ク チ ャ ー の マ シ ン 上 で の み 処 理 す る こ と を 推 奨 す る 。 注 意 す べ き 点 と し て は 、 biarch な プ ラ ッ ト フ ォ ー ム 、 つ ま り 32ビ ッ ト と 64ビ ッ ト の 両 方 の ア プ リ ケ ー シ ョ ン を 実 行 で き る シ ス テ ム (x86−64, ppc64, s390x な ど ) で は 、 ut_tv の サ イ ズ は 32ビ ッ ト モ ー ド と 64ビ ッ ト モ ー ド で 同 じ で あ る 。 ut_session と ut_time も 、 存 在 す る 場 合 に は 同 様 に 同 じ サ イ ズ で あ る 。 こ れ に よ り 、 32ビ ッ ト ア プ リ ケ ー シ ョ ン と 64ビ ッ ト ア プ リ ケ ー シ ョ ン の 間 で デ ー タ フ ァ イ ル と 共 有 メ モ リ ー を 共 有 す る こ と が 可 能 に な る 。 そ の た め に は 、 ut_session を int32_t 型 に 、 ut_tv を 2つ の int32_t 型 の フ ィ ー ル ド tv_sec, tv_usec を 持 つ 構 造 体 に 変 更 す れ ば よ い ut_tv は struct 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/ に 書 か れ て い る 。