谁是记录者?
我使用的是ubuntu,想通过编程手段查阅各个用户登陆和注销的详细记录,那么首先我得知道操作对象是谁,要对哪个文件下手,那么问题来了——这些记录是保存在哪个文件里?
搜索记录者
查找文档可以通过man命令,它有个-k的参数,很是有用,格式为:
man -k printf
在简短描述和手册文档中搜索与printf匹配的记录并打印,所以我们输入
man -k login
执行之后会打印出一些记录,查阅后我们定位到下面几条记录:
utmp (5) - login records
utmpx (5) - login records
wtmp (5) - login records
然后,我们要引用括号内的序号查阅该文档
man 5 utmp
man 5 utmpx
man 5 wtmp
发现都指向一份文档,那么它到底是不是我们要找的文件呢?
是或不是
The utmp file allows one to discover information about who is currently using the system. There may be more users currently using the system,because not all programs use utmp logging.
这是文档的简介,以4级水平的我粗略翻译,它是说utmp文件允许用来了解目前系统使用者的信息,可能目前有更多使用系统的用户,因为并不是所有的程序使用utmp登陆
概要后面还有对在登陆发生各种情况时记录情况,我想八九不离十,应该就是它们了。
区别
使用utmp、wtmp、utmpx都需要#include <utmp.h>,它们的文件是二进制的,内容实际上是一个utmp结构体序列,该结构体声明在utmp.h文件中,结构成员记录了详细的用户登陆信息,它们的区别在于:
wtmp记录了所有登陆和注销记录,格式与用空用户名标记注销的utmp很相似,登陆也好注销也好都是往里面添加数据;
而utmp通过修改文件内容,登陆的时候添加记录,注销时删除记录,只记录当前使用系统的用户信息;
utmpx它与utmp结构体相似,区别在于POSIX.1没有指定utmp结构,而是定义为utmpx,它定义了ut_type、ut_pid、ut_line、ut_id、ut_user和ut_tv,并没有设定ut_line、ut_user字段的长度。
使用
源自《Unix\Linux编程实践教程(附光盘)》 中的一段代码:
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <utmp.h>
#define NRECS 16
#define NULLUT ((struct utmp*)NULL)
#define UTSIZE (sizeof(struct utmp))
static char utmpbuf[NRECS * UTSIZE]; //容器
static int num_recs; //保存数量
static int cur_rec; //下一个
static int fd_utmp = -1; //读取fd
utmp_open(char* filename)
{
fd_utmp = open(filename, O_RDONLY);
cur_rec = num_recs = 0;
return fd_utmp;
}
struct utmp* utmp_next()
{
struct utmp* recp;
if(fd_utmp == -1)
return NULLUT;
if(cur_rec == num_recs && utmp_reload() == 0)
return NULLUT;
recp = (struct utmp*)&utmpbuf[cur_rec * UTSIZE];
cur_rec++;
return recp;
}
int utmp_reload(){
int amt_read;
amt_read = read(fd_utmp, utmpbuf, NRECS*UTSIZE);
num_recs = amt_read / UTSIZE;
cur_rec = 0;
return num_recs;
}
utmp_close(){
if(fd_utmp != -1)
close(fd_utmp);
}