Man page - utmp(5)

Packages contains this manual

Available languages:

en fr es it pl ja ru ro zh_TW zh_CN de

Manual

UTMP

NAME[名 稱 ]
SYNOPSIS[總 覽 ]
DESCRIPTION[描 述 ]
FILES[相 關 檔 案 ]
CONFORMING TO[遵 循 ]
RESTRICTIONS[限 制 ]
BUGS[缺 憾 ]
SEE ALSO[另 見 ]
[中 文 版 維 護 人 ]
[中 文 版 最 新 更 新 ]
《 中 國 linux論 壇 man手 冊 頁 翻 譯 計 劃 》 :


NAME[名 稱 ]

utmp, wtmp - 登 錄 記 錄 ( login records)

SYNOPSIS[總 覽 ]

#include

DESCRIPTION[描 述 ]

utmp 文 件 用 於 記 錄 當 前 系 統 用 戶 是 哪 些 人 。 但 是 實 際 的 人 數 可 能 比 這 個 數 目 要 多 , 因 為 並 非 所 有 用 戶 都 用 utmp 登 錄 。

警 告 : utmp 必 須 置 為 不 可 寫 , 因 為 很 多 系 統 程 序 ( 有 點 傻 的 那 種 ) 依 賴 於 它 。 如 果 你 將 它 置 為 可 寫 , 其 他 用 戶 可 能 會 修 改 它 ( //* 導 致 程 序 運 行 出 錯 ) 。 ( //* ( //* ) 中 為 譯 者 注 )

文 件 中 是 一 些 條 目 的 列 表 , 條 目 的 結 構 ( 在 utmp.h 中 進 行 了 聲 明 ) 見 下 ( 注 意 這 裡 只 列 出 了 一 部 分 ; 細 節 依 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 {
short int e_termination; /* process termination status. */
short int e_exit; /* process exit status. */
};

struct utmp {
short ut_type; /* type of login */
pid_t ut_pid; /* pid of login process */
char ut_line[UT_LINESIZE]; /* device name of tty - "/dev/" */
char ut_id[4]; /* init id or abbrev. ttyname */
char ut_user[UT_NAMESIZE]; /* user name */
char ut_host[UT_HOSTSIZE]; /* hostname for remote login */
struct exit_status ut_exit; /* The exit status of a process
marked as DEAD_PROCESS. */
long ut_session; /* session ID, used for windowing*/
struct timeval ut_tv; /* time entry was made. */
int32_t ut_addr_v6[4]; /* IP address of remote host. */
char pad[20]; /* 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’ 結 束 之 。

第 一 個 條 目 由 init (8) 執 行 inittab (5)而 產 生 。 然 而 , 在 產 生 條 目 以 前 , init (8) 先 將 utmp 清 空 ( 透 過 設 定 ut_type DEAD_PROCESS 來 實 現 . 當 ut_type 不 是 DEAD_PROCESS RUN_LVL 並 且 不 存 在 程 序 號 為 ut_pid 的 程 序 時 ,透 過 用 空 串 清 空 ut_user , ut_host ut_time 來 實 現 。 如 果 不 存 在 ut_id 的 空 記 錄 , init( 初 始 化 時 ) 會 建 立 一 個 。 它 將 會 依 據 inittab 來 設 定 ut_id , 設 定 ut_pid ut_time 為 當 前 值 , 設 定 ut_type INIT_PROCESS .

getty (8) 依 據 程 序 號 定 位 條 目 , 將 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_line 來 定 位 記 錄 , 雖 然 用 ut_pid 可 能 更 好 些 。

init (8) 發 現 有 程 序 存 在 時 , 它 透 過 ut_pid 來 定 位 它 的 utmp 條 目 , 設 定 ut_type DEAD_PROCESS , 然 後 用 零 位 元 組 清 空 ut_user , ut_host ut_time

xterm (1) 和 其 他 終 端 模 擬 器 直 接 建 立 USER_PROCESS 記 錄 並 透 過 使 用 /dev/ttyp %c 的 最 後 兩 個 字 母 或 用 p %d ( /dev/pts/ %d ) 來 產 生 ut_id 。 如 果 它 們 找 到 這 個 id 的 DEAD_PROCESS , 它 們 就 使 用 它 , 否 則 就 建 立 一 個 新 的 條 目 . 如 果 可 能 , 它 們 將 它 標 記 為 DEAD_PROCESS 並 將 ut_line , ut_time , ut_user ut_host 置 為 null。

xdm (8) 不 會 建 立 utmp 記 錄 , 因 為 沒 有 終 端 與 它 相 連 . 試 圖 用 它 產 生 utmp 記 錄 會 引 起 如 下 錯 誤 : finger: can not stat /dev/machine.dom. 它 應 該 用 於 建 立 wtmp 條 目 , 和 ftpd (8) 相 似 .

telnetd (8) 設 定 LOGIN_PROCESS 條 目 並 把 其 他 的 的 留 給 login (8) 去 做 。 telnet 任 務 結 束 後 , telnetd (8) cleans up utmp in the described way.( ? ? )

wtmp 檔 案 記 錄 了 所 有 的 登 入 和 退 出 。 它 的 格 式 與 utmp 幾 乎 完 全 一 樣 ( 例 外 是 : 用 空 使 用 者 名 稱 來 表 示 在 相 關 終 端 上 的 退 出 ) 。 除 此 以 外 , 用 終 端 名 "˜" 和 使 用 者 名 稱 "shutdown" "reboot" 表 示 系 統 關 機 或 重 啟 , the pair of terminal names "|" / "}" logs the old/new system time when date (1) changes it. wtmp login (1), 和 init (1) 以 及 某 些 版 本 的 getty (1) 使 用 . 但 是 這 些 程 式 並 不 建 立 它 ,所 以 如 果 將 它 刪 除 的 話 您 就 得 不 到 記 錄 了 。

FILES[相 關 檔 案 ]

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

CONFORMING TO[遵 循 ]

Linux utmp 既 不 遵 循 v7/BSD 也 不 遵 循 SYSV: 它 實 際 是 兩 者 的 混 合 . v7/BSD 中 域 比 較 少 ; 最 重 要 的 是 它 沒 有 ut_type ( ut_type 可 以 使 本 地 的 v7/BSD-類 的 程 式 顯 示 (以 次 為 例 ) dead 或 login 條 目 .而 且 ,沒 有 為 任 務 分 配 通 道 的 檔 案 . BSD 則 相 反 (BSD does so), 因 為 它 缺 少 的 是 ut_id 域 . 在 Linux 中 (SYSV 中 也 一 樣 ), 記 錄 的 ut_id 域 一 旦 設 定 就 不 再 改 變 ,它 保 留 通 道 而 不 需 要 什 麼 配 置 檔 案 . 清 除 ut_id 可 能 會 引 起 race conditions 從 而 導 致 安 全 漏 洞 . 就 SYSV 的 要 求 來 講 ,用 空 位 元 組 填 充 的 方 式 來 清 空 上 面 提 到 的 各 個 域 不 是 必 須 的 ,但 是 這 樣 做 使 得 執 行 採 用 BSD 語 法 而 又 不 改 變 utmp 的 程 式 成 為 可 能 . 正 如 上 面 所 寫 的 ,Linux 在 句 子 中 使 用 BSD 的 慣 例 .

SYSV 在 句 子 中 僅 使 用 型 別 域 去 標 識 它 們 或 是 登 入 資 訊 (例 如 :. "new time" ). UT_UNKNOWN 只 在 Linux 中 有 . SYSV 沒 有 ut_host ut_addr_v6 域 .

不 象 其 它 各 種 系 統 , 您 可 以 透 過 刪 除 檔 案 來 禁 止 utmp , 在 Linux 中 utmp 必 須 一 直 存 在 . 如 果 你 要 禁 止 who (1) 命 令 ,您 需 要 使 整 個 utmp 不 可 讀 .

需 要 注 意 的 是 在 libc5 和 libc6 中 utmp 的 結 構 是 不 同 的 .因 此 使 用 舊 結 構 的 程 式 會 破 壞 /var/run/utmp 和 /or /var/log/wtmp . Debian 系 統 包 含 一 個 修 補 過 的 libc5 它 可 以 使 用 新 的 格 式 . 但 對 wtmp, 問 題 依 然 存 在 因 為 它 直 接 對 libc5 進 行 存 取 .

RESTRICTIONS[限 制 ]

檔 案 格 式 依 機 器 而 不 同 , 因 此 推 薦 的 做 法 是 :在 建 立 它 的 機 器 上 使 用 它 .

BUGS[缺 憾 ]

本 手 冊 頁 基 於 libc5 , 現 在 可 能 情 況 已 有 不 同 了 .

SEE ALSO[另 見 ]

ac (1), date (1), getutent (3), init (8), last (1), login (1), updwtmp (3), who (1)

[中 文 版 維 護 人 ]

Redcandle <redcandle51@chinaren.com>

[中 文 版 最 新 更 新 ]

2001.11.08

《 中 國 linux論 壇 man手 冊 頁 翻 譯 計 劃 》 :

http://cmpp.linuxforum.net

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。
中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh