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_typeDEAD_PROCESS来实现. 当ut_type 不是 DEAD_PROCESSRUN_LVL 并且不存在进程号为 ut_pid 的进程时,通过用空串清空 ut_user, ut_hostut_time 来实现。如果不存在 ut_id 的空记录, init(初始化时) 会创建一个。它将会依据 inittab 来设置 ut_id , 设置 ut_pidut_time 为当前值,设置 ut_typeINIT_PROCESS.

getty(8) 依据进程号定位条目, 将 ut_type 改为 LOGIN_PROCESS, 改变 ut_time, 设定 ut_line ,然后等待连接建立。 login(8), 在鉴别完用户后, 将 ut_type 改为 USER_PROCESS, 改变 ut_time 并设定 ut_hostut_addr. 根据 getty(8) 和 login(8)完成的功能, 可以用 ut_line 来定位记录,虽然用 ut_pid 可能更好些。

init(8) 发现有进程存在时, 它通过 ut_pid 来定位它的 utmp 条目, 设定 ut_typeDEAD_PROCESS ,然后用零字节清空 ut_user, ut_hostut_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_userut_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. wtmplogin(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_hostut_addr_v6 域.

不象其它各种系统, 您可以通过删除文件来禁止 utmp , 在 Linux 中 utmp 必须一直存在. 如果你要禁止 who(1)
命令,您需要使整个 utmp 不可读.

需要注意的是在 libc5 和 libc6 中 utmp 的结构是不同的.因此使用旧结构的程序会破坏 /var/run/utmp 和/or
/var/log/wtmp. Debian 系统包含一个修补过的 libc5 它可以使用新的格式. 但对 wtmp, 问题依然存在因为它直接对
libc5 进行存取.

utmp, wtmp - 登 录 记 录(login records)的更多相关文章

  1. utmp, wtmp, and lastlog 日志清除工具

    utmp, wtmp, and lastlog 日志清除工具 http://blog.itpub.net/83980/viewspace-801664/

  2. 开发沉思录 - 记大数据平台的一次 BUG井喷

    研究REST提交重启:终于提交成功了,首先一个错误:地址IP地址的http://hdp0:8080/api/v1/clusters/HDP/requests ,被我错误写成了request,当误了大量 ...

  3. django-auth组件的注册,登录,登出,及验证是否已经登入。使用login的属性

    1.注册: 1.创建User(django自带的用户model)的form对象 定义form验证返回的错误提示信息 error_msg = { 'username': {'required': '用户 ...

  4. 登陆记录utmp wtmp

    /var/log/wtmp文件的作用     /var/log/wtmp也是一个二进制文件,记录每个用户的登录次数和持续时间等信息.   查看方法:   可以用last命令输出当中内容: debian ...

  5. Linux录屏软件

    如何查找录屏软件 apt-cache search screen record libutempter-dev - privileged helper for utmp/wtmp updates (d ...

  6. Linux 日志文件utmp、wtmp、lastlog、messages

            1.有关当前登录用户的信息记录在文件utmp中:==who命令 2.登录进入和退出纪录在文件wtmp中:==w命令 3.最后一次登录文件可以用lastlog命令察看: 4.messag ...

  7. Linux日志文件utmp、wtmp、lastlog、messages

            1.有关当前登录用户的信息记录在文件utmp中:==who命令 2.登录进入和退出纪录在文件wtmp中:==w命令 3.最后一次登录文件可以用lastlog命令察看: 4.messag ...

  8. [转帖]Linux日志文件utmp、wtmp、lastlog、messages

    Linux日志文件utmp.wtmp.lastlog.messages https://www.cnblogs.com/zhuiluoyu/p/6874255.html 1.有关当前登录用户的信息记录 ...

  9. Win7_刻录DVD

    1.刻录 临时文件夹: 1.1.C:\Users\具体的用户名\AppData\Local\Microsoft\Windows\Burn 1.2.双击 插入刻录盘的光驱,直接将文件复制到 这里,实际上 ...

随机推荐

  1. .sync 修饰符的理解

    正常 子组件: this.$emit('update:title', newTitle) 父组件: <text-document v-bind:title="doc.title&quo ...

  2. Android 中MediaPlayer播放音频

    1.播放/res/raw/目录下的音频资源 public class MainActivity extends Activity { MediaPlayer mediaPlayer; int posi ...

  3. css3 新特性(动画)

    1. 制作动画 先定义动画,再使用(调用)动画 使用 keyframes(关键帧)定义动画(类似定义类选择器) @keyframes 动画名称{ 0%{ width:100px; } 100%{ wi ...

  4. MyBatis操作数据库(基本增删改查)

    一.准备所需工具(jar包和数据库驱动) 网上搜索下载就可以 二.新建一个Java project 1.将下载好的包导入项目中,build path 2.编写MyBatis配置文件:主要填写prope ...

  5. python wave 库 读取 BytesIO 对象的注意事项

    程序中遇到需要使用临时文件时,常使用内存中的 io.BytesIO() 代替实体二进制文件,以避免磁盘IO,同时免去了考虑文件名的麻烦. file = io.BytesIO() file.write( ...

  6. Tips using Manjaro

    Set swappiness value The default swappiness value is set 60 as you can check it via the following co ...

  7. 笔记68 Redis数据库

    一.Redis简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI ...

  8. 非关系型数据库MongoDB入门

    本文分为以下四块简单介绍非关系型数据库MongoDB:1.MongoDB简介.2.MongoDB和关系数据库对比.3.MongoDB基本概念.4.mongo shell的使用以及对MongoDB的增删 ...

  9. Delphi Close、Halt、terminate、ExitProcess的区别

    Close:1.只关闭本窗体2.当Close是一个主窗体时,程序会退出.3.Close会发生FormClose事件,FormCloseQuery事件4.主窗体close以后程序就Application ...

  10. 根据ID查询实体

    //查询实体 $scope.findOne=function(id){ $http.get('../brand/findOne.do?id='+id).success( function(respon ...