Linuxコマンドを学ぶ - wtmp

utmp、wtmp - ログインレコード

シノプシス

#include

説明

utmpファイルを使用すると、現在誰がシステムを使用しているのかを知ることができます。 すべてのプログラムがutmpロギングを使用しているわけではないので、現在システムを使用しているユーザーが増えている可能性があります。

警告:多くのシステムプログラム(愚かなことに)がその完全性に依存するため、 utmpは書き込み可能であってはなりません。 utmpを任意のユーザに書き込み可能にしておくと、システムログファイルの改ざんやシステムファイルの改ざんの危険があります。

このファイルは、インクルードファイルで宣言された次の構造体を持つ一連のエントリです(これはいくつかの定義の1つに過ぎません;詳細はlibcのバージョンによって異なります)。

#define UT_UNKNOWN 0 #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 UT_LINESIZE 12 #define UT_NAMESIZE 32 #define UT_HOSTSIZE 256構造体exit_status {short int e_termination; / *プロセス終了ステータス。 * / short 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または略語。 ttyname * / char ut_user [UT_NAMESIZE]; / *ユーザ名* / char ut_host [UT_HOSTSIZE]; / *リモートログインのためのホスト名* / struct exit_status ut_exit; / * DEAD_PROCESSとしてマークされたプロセスの終了ステータス。 * /長い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に設定してutmpをクリーンアップし、 ut_typeDEAD_PROCESSまたはRUN_LVLでなく、PID ut_pidを持つプロセスが存在しないレコードごとにnullバイトでut_userut_host 、およびut_timeをクリアします。 必要なut_idを持つ空のレコードが見つからない場合、initは新しいレコードを作成します。 これは、 ut_idをinittab、 ut_pidおよびut_timeから現在の値に設定し、 ut_typeINIT_PROCESSに設定します。

getty (8)は、pidによるエントリの検索、 ut_typeの LOGIN_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_userut_hostut_timeをnullバイトでクリアします。

xterm (1)などの端末エミュレータは、 USER_PROCESSレコードを直接作成し、 / dev / ttyp %cの最後の2文字を使用するか、 / dev / pts / %dに p %dを使用してut_idを生成します。 このIDに対してDEAD_PROCESSが見つかった場合はリサイクルし、そうでない場合は新しいエントリを作成します。 できる場合は、終了時にDEAD_PROCESSとしてマークし、 ut_lineut_timeut_user 、およびut_hostもNULLにすることをお勧めします。

xdm (8)は、指定された端末がないので、utmpレコードを作成すべきではありません。 それを作成させると、 'finger:can not stat /dev/machine.dom'のようなエラーが発生します。 ftpd (8)と同様に、wtmpエントリを作成するはずです。

telnetd (8)はLOGIN_PROCESSエントリを設定し、残りは通常どおりlogin (8)のままにします 。 telnetセッションが終了すると、 telnetd (8)は前述の方法でutmpをクリーンアップします。

wtmpファイルには、すべてのログインとログアウトが記録されます。 その形式は、ヌルのユーザ名が関連端末のログアウトを示すことを除けば、 utmpとまったく同じです。 さらに、ユーザ名「シャットダウン」または「リブート」を伴うターミナル名「〜」は、システムのシャットダウンまたはリブートを示し、端末名「|」のペアは、 / "}"は、 date (1)がそれを変更したときに古い/新しいシステム時刻を記録します。 wtmplogin (1)、 init (1)、およびgetty (1)のいくつかのバージョンによって維持されます 。 これらのプログラムのいずれもファイルを作成しないので、 ファイルを削除するとレコードの保存はオフになります。