.\" Copyright (c) 1993 Michael Haardt (michael@cantor.informatik.rwth-aachen.de),
.\" Fri Apr 2 11:32:09 MET DST 1993
.\"
.\" %%%LICENSE_START(GPLv2+_DOC_FULL)
.\" This is free documentation; you can redistribute it and/or
.\" modify it under the terms of the GNU General Public License as
.\" published by the Free Software Foundation; either version 2 of
.\" the License, or (at your option) any later version.
.\"
.\" The GNU General Public License's references to "object code"
.\" and "executables" are to be interpreted as the output of any
.\" document formatting or typesetting system, including
.\" intermediate and printed output.
.\"
.\" This manual is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public
.\" License along with this manual; if not, see
.\" .
.\" %%%LICENSE_END
.\"
.\" Modified 1993-07-25 by Rik Faith (faith@cs.unc.edu)
.\" Modified 1995-02-26 by Michael Haardt
.\" Modified 1996-07-20 by Michael Haardt
.\" Modified 1997-07-02 by Nicolás Lichtmaier
.\" Modified 2004-10-31 by aeb, following Gwenole Beauchesne
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\"
.\" Japanese Version Copyright (c) 1997 Kazuyuki Tanisako
.\" all rights reserved.
.\" Translated 1998-02-16, Kazuyuki Tanisako
.\" Updated 2003-01-20, Akihiro MOTOKI
.\" Updated 2005-02-21, Akihiro MOTOKI
.\" Updated 2005-10-06, Akihiro MOTOKI
.\" Updated 2008-08-11, Akihiro MOTOKI, LDP v3.05
.\"
.TH UTMP 5 2020\-12\-21 Linux "Linux Programmer's Manual"
.SH 名前
utmp, wtmp \- ログイン記録
.SH 書式
\fB#include \fP
.SH 説明
\fIutmp\fP ファイルを見ることで、現在誰がシステムを使っているかという情報 が得られる。ただすべてのプログラムが utmp ファイルを
更新しているわけではないので、実際にはそれ以上のユーザーが システムを使っている可能性がある。
.PP
\fB警告:\fP (愚かにも) 多くのシステムプログラムがその整合性に依存しているので、 \fIutmp\fP ファイルは "other"
に分類されるユーザーに対して 書き込み可能にしてはならない。 ファイルの所有者とグループオーナー以外のユーザーに対して \fIutmp\fP
ファイルを書き込み可能な状態にしておくと、 システムのログファイルを偽造されたり、システムファイルの 改ざんを受けるといったリスクを犯すことになる。
.PP
このファイルは \fIutmp\fP 構造体の繰り返しで構成される。 この構造体は \fI\fP で以下のように定義されている
(ここに記述してあるのは幾つかの大まかな定義のみで、 詳細は libc のバージョンにより変わることに注意が必要である)。
.PP
.in +4n
.EX
/* 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
\fBinit\fP(1)) */
#define BOOT_TIME 2 /* Time of system boot (in \fIut_tv\fP) */
#define NEW_TIME 3 /* Time after system clock change
(in \fIut_tv\fP) */
#define OLD_TIME 4 /* Time before system clock change
(in \fIut_tv\fP) */
#define INIT_PROCESS 5 /* Process spawned by \fBinit\fP(1) */
#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 e_termination; /* Process termination status */
short 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 (\fBgetsid\fP(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]
.EE
.in
.PP
この構造体からユーザーの使っている端末のスペシャルファイル名、 ユーザーのログイン名、 (\fBtime\fP(2)
形式での)ログイン時刻がわかる。文字列フィールドは、 フィールドの長さより文字列が短い場合には、ヌルバイト (\(aq\e0\(aq)
によって終端される。
.PP
最初のエントリーは \fBinit\fP(1) コマンドが \fBinittab\fP(5) を処理することで作られる。 あるエントリーを処理する前に、
\fBinit\fP(1) は \fIut_type\fP を \fBDEAD_PROCESS\fP に初期化する。 レコードの \fIut_type\fP が
\fBDEAD_PROCESS\fP と \fBRUN_LVL\fP のいずれでもなく、 かつ PID が \fIut_pid\fP
であるプロセスがいない場合は、\fIut_user\fP, \fIut_host\fP, \fIut_time\fP をヌルバイトでクリアして初期化を行う。 必要な
\fIut_id\fP を持つ空のレコードを見つけられなかった場合、 \fBinit\fP(1) は新しいレコードを作る。inittab から \fIut_id\fP
を設定し、 \fIut_pid\fP および \fIut_time\fP を現在値に、 \fIut_type\fP を \fBINIT_PROCESS\fP に設定する。
.PP
\fBmingetty\fP(8) (または \fBagetty\fP(8)) は pid でエントリーを特定し、 \fIut_type\fP を
\fBLOGIN_PROCESS\fP に変更し、 \fIut_time\fP を更新し、\fIut_line\fPを設定した後、接続が確立されるのを待つ。
\fBlogin\fP(1) はユーザー認証が終了すると、 \fIut_type\fP を \fBUSER_PROCESS\fP に変更し、 \fIut_time\fP
を更新し、\fIut_host\fP と \fIut_addr\fPを設定する。 \fBmingetty\fP(8) (または \fBagetty\fP(8)) と
\fBlogin\fP(1) により異なるが、 \fIut_pid\fP の代わりに \fIut_line\fP を使ってレコードの特定が行われることもある
(\fIut_pid\fP を使う方が望ましい) 。
.PP
\fBinit\fP(1) はプロセスの終了を検出した場合、 \fIut_pid\fP をキーとして utmp のエントリーを特定し、 \fIut_type\fP を
\fBDEAD_PROCESS\fP に設定し、 \fIut_user\fP, \fIut_host\fP, \fIut_time\fP をヌルバイトでクリアする。
.PP
\fBxterm\fP(1) コマンドや他の端末エミュレータは 直接 \fBUSER_PROCESS\fP のレコードを作り、 端末名のサフィックス文字列
(\fI/dev/[pt]ty\fP に続く文字列) を使って \fIut_id\fP の値を生成する。 この id を持つエントリーが
\fBDEAD_PROCESS\fP であった場合には再利用し、 それ以外の場合には新しいエントリーが作られる。 可能な場合にはプロセス終了時に
\fBDEAD_PROCESS\fP と設定し、 さらに \fIut_line\fP, \fIut_time\fP, \fIut_user\fP, \fIut_host\fP
をヌルバイトでクリアすることが奨励されている。
.PP
\fBtelnetd\fP(8) は \fBLOGIN_PROCESS\fP を設定するだけでよく、 残りの処理は通常通り \fBlogin\fP(1)
に任せればよい。 telnet のセッションが終了した後、前述のように \fBtelnetd\fP(8) が utmp のエントリーを初期化する。
.PP
\fIwtmp\fP ファイルには、すべてのログインとログアウトが記録される。 そのフォーマットは、ログアウト済の端末でユーザー名がヌルとなること以外は
\fIutmp\fP とまったく同じである。 ユーザー名が \fBshutdown\fP もしくは \fBreboot\fP の端末名 \fB\(ti\fP は、システムの停止
(shutdown) または再起動 (reboot) を意味する。またその端末名が \fB|\fP と \fB}\fP の対は \fBdate\fP(1)
コマンドで変更した新/旧のシステム時刻を記録している。 \fIwtmp\fP ファイルは \fBlogin\fP(1), \fBinit\fP(1)
やいくつかのバージョンの \fBgetty\fP(8) (\fBmingetty\fP(8) または \fBagetty\fP(8)) により管理されている。
これらのプログラムはどれもファイルを新たに作成しないので、 ファイルを削除することで情報の記録 (record\-keeping) を止めることができる。
.SH ファイル
\fI/var/run/utmp\fP
.br
\fI/var/log/wtmp\fP
.SH 準拠
.PP
POSIX.1 では、 \fIutmp\fP 構造体ではなく、 \fIutmpx\fP 構造体を規定している。 \fIutmpx\fP
構造体で規定されているのは、フィールド \fIut_type\fP, \fIut_pid\fP, \fIut_line\fP, \fIut_id\fP, \fIut_user\fP,
\fIut_tv\fP である。 POSIX.1 では、フィールド \fIut_line\fP と \fIut_user\fP の長さは規定されていない。
.PP
Linux では、 \fIutmpx\fP 構造体の定義は \fIutmp\fP 構造体と同じである。
.SS 過去のシステムとの比較
Linux での utmp のエントリーは v7/BSD や System V のいずれにも準拠しておらず、 その両方が混在したものである。
.PP
v7/BSD ではより少しの項目しかない; もっとも重要なことは、\fIut_type\fP が無いことである。 そのため v7/BSD 系のプログラムでは
(たとえば) 死んだ状態のエントリーや ログイン状態のエントリーまで表示されてしまうことになった。
さらにセッション用のスロットを割り当てるための設定ファイルがない。 BSD に設定ファイルがあるのは \fIut_id\fP がないからである。
.PP
Linux (System V 系)では、設定ファイルを必要とせず セッション用のスロットを割り当てるので、一旦設定 されてしまうとレコードの
\fIut_id\fP は決して変更されない。 \fIut_id\fP をクリアすると競合状態におちいり、 utmp
のエントリーを壊したり、潜在的なセキュリティホールになる可能性がある。 上述のフィールドをヌルバイトで埋めてクリアしておくのは、 System V
での取り決めでは必要とはされていないが、 BSD での取り決めを前提としていて、かつ utmp を更新しない多くのプログラムが
動作するようにするためである。 Linux ではここまで記述してきたように、行内容の表示は BSD の慣例に従っている。
.PP
.\" mtk: What is the referrent of "them" in the following sentence?
.\" System V only uses the type field to mark them and logs
.\" informative messages such as \fB"new time"\fP in the line field.
\fBUT_UNKNOWN\fP は Linux で作られたもののようである。 System V には \fIut_host\fP も \fIut_addr_v6\fP
も存在しない。
.SH 注意
.PP
ファイルを削除することで utmp への記録を止められる 他の様々なシステムとは違い、Linux では utmp ファイルを必ずおいて おく必要がある。
\fBwho\fP(1) コマンドが機能しないようにしたい場合には、 utmp ファイルの全ユーザーに対する読み取り許可を設定しないようにする。
.PP
ファイルのフォーマットはマシンに依存するので、ファイルが作られた マシンもしくは同一アーキテクチャーのマシン上でのみ処理することを推奨する。
.PP
注意すべき点としては、 \fIbiarch\fP なプラットフォーム、つまり 32ビットと 64ビットの両方の アプリケーションを実行できるシステム
(x86\-64, ppc64, s390x など) では、 \fIut_tv\fP のサイズは 32ビットモードと 64ビットモードで同じである。
\fIut_session\fP と \fIut_time\fP も、存在する場合には同様に同じサイズ である。これにより、32ビットアプリケーションと
64ビットアプリケーション の間でデータファイルと共有メモリーを共有することが可能になる。 そのためには、 \fIut_session\fP を
\fIint32_t\fP 型に、 \fIut_tv\fP を 2つの \fIint32_t\fP 型のフィールド \fItv_sec\fP, \fItv_usec\fP
を持つ構造体に変更すればよい \fIut_tv\fP は \fIstruct timeval\fP と同じサイズとは限らないので、
.PP
.in +4n
.EX
gettimeofday((struct timeval *) &ut.ut_tv, NULL);
.EE
.in
.PP
のような呼び出しをするのではなく、 以下のように各フィールドを設定する方法が推奨される:
.PP
.in +4n
.EX
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;
.EE
.in
.\" .PP
.\" Note that the \fIutmp\fP struct from libc5 has changed in libc6.
.\" Because of this,
.\" binaries using the old libc5 struct will corrupt
.\" .IR /var/run/utmp " and/or " /var/log/wtmp .
.\" .SH BUGS
.\" This man page is based on the libc5 one, things may work differently now.
.SH 関連項目
\fBac\fP(1), \fBdate\fP(1), \fBinit\fP(1), \fBlast\fP(1), \fBlogin\fP(1), \fBlogname\fP(1),
\fBlslogins\fP(1), \fBusers\fP(1), \fButmpdump\fP(1), \fBwho\fP(1), \fBgetutent\fP(3),
\fBgetutmp\fP(3), \fBlogin\fP(3), \fBlogout\fP(3), \fBlogwtmp\fP(3), \fBupdwtmp\fP(3)
.SH この文書について
この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は
\%https://www.kernel.org/doc/man\-pages/ に書かれている。