当前位置: 技术问答>linux和unix
关于注销过程的困惑
来源: 互联网 发布时间:2016-02-22
本文导语: 小弟最近在看unix/linux编程实践教程,有一道课后题是实现ac命令。 我知道应该去查找wtmp文件中登录和注销记录,可是如何确定用户登录了多少时间却发了愁。 我看到一段文章关于注销过程描述如下: 登录时,login...
小弟最近在看unix/linux编程实践教程,有一道课后题是实现ac命令。
我知道应该去查找wtmp文件中登录和注销记录,可是如何确定用户登录了多少时间却发了愁。
我看到一段文章关于注销过程描述如下:
登录时,login程序填写这样一个结构,然后将其写入到utmp文件中,同时也将其添写到wtmp文件中。注销时, init进程将utmp文件中相应的记录擦除(每个字节都填以0 ),并将一个新记录添写到wtmp文件中。读wtmp文件中的该注销记录,其ut_name字段清除为0。在系统再启动时,以及更改系统时间和日期的前后,都在wtmp文件中添写特殊的记录项。
那么有两个问题我不太明白:
1。既然注销时也把wtmp文件中的注销记录的ut_name字段清除为0,那么怎么知道是谁注销了呢?为什么要清除ut_name字段?
2。注销时候往wtmp文件中写入了注销记录,那么如何确定这个用户登录了多长时间呢?
这两个问题困扰了我好长时间,各个论坛发帖也没有得到解决,希望在这里能够得到大家的帮助,不胜感激~
我知道应该去查找wtmp文件中登录和注销记录,可是如何确定用户登录了多少时间却发了愁。
我看到一段文章关于注销过程描述如下:
登录时,login程序填写这样一个结构,然后将其写入到utmp文件中,同时也将其添写到wtmp文件中。注销时, init进程将utmp文件中相应的记录擦除(每个字节都填以0 ),并将一个新记录添写到wtmp文件中。读wtmp文件中的该注销记录,其ut_name字段清除为0。在系统再启动时,以及更改系统时间和日期的前后,都在wtmp文件中添写特殊的记录项。
那么有两个问题我不太明白:
1。既然注销时也把wtmp文件中的注销记录的ut_name字段清除为0,那么怎么知道是谁注销了呢?为什么要清除ut_name字段?
2。注销时候往wtmp文件中写入了注销记录,那么如何确定这个用户登录了多长时间呢?
这两个问题困扰了我好长时间,各个论坛发帖也没有得到解决,希望在这里能够得到大家的帮助,不胜感激~
|
man里面说的很清楚。
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.
The wtmp file records all logins and logouts. Its format is exactly like
utmp except that a null user name indicates a logout on the associated
terminal. Furthermore, the terminal name ~ with user name shutdown or
reboot indicates a system shutdown or reboot and the pair of terminal
names |/} logs the old/new system time when date(1) changes it. wtmp is
maintained by login(1), init(1), and some versions of getty(8). Neither
of these programs creates the file, so if it is removed, record-keeping
is turned off.
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 */
/* The ut_session and ut_tv fields must be the same size when
compiled 32- and 64-bit. This allows data files and shared
memory to be shared between 32- and 64-bit applications */
#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
int32_t ut_session; /* Session ID, used for windowing */
struct {
int32_t tv_sec; /* Seconds */
int32_t tv_usec; /* Microseconds */
} ut_tv; /* Time entry was made */
#else
long int ut_session; /* Session ID, used for windowing */
struct timeval ut_tv; /* Time entry was made */
#endif
int32_t ut_addr_v6[4]; /* IP address of remote host */
char __unused[20]; /* Reserved for future use */
};
This manpage is based on the libc5 one, things may work differently now.
针对你的两个问题:
1。既然注销时也把wtmp文件中的注销记录的ut_name字段清除为0,那么怎么知道是谁注销了呢?为什么要清除ut_name字段?
2。注销时候往wtmp文件中写入了注销记录,那么如何确定这个用户登录了多长时间呢?
1. 注销时不清wtmp里的记录。如果你说的是utmp的话,不清ut_name留着干什么?utmp只记录登录用户。
2. login时候记一次,logout时候记一次。时间差可以算出登录时间。
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.
The wtmp file records all logins and logouts. Its format is exactly like
utmp except that a null user name indicates a logout on the associated
terminal. Furthermore, the terminal name ~ with user name shutdown or
reboot indicates a system shutdown or reboot and the pair of terminal
names |/} logs the old/new system time when date(1) changes it. wtmp is
maintained by login(1), init(1), and some versions of getty(8). Neither
of these programs creates the file, so if it is removed, record-keeping
is turned off.
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 */
/* The ut_session and ut_tv fields must be the same size when
compiled 32- and 64-bit. This allows data files and shared
memory to be shared between 32- and 64-bit applications */
#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
int32_t ut_session; /* Session ID, used for windowing */
struct {
int32_t tv_sec; /* Seconds */
int32_t tv_usec; /* Microseconds */
} ut_tv; /* Time entry was made */
#else
long int ut_session; /* Session ID, used for windowing */
struct timeval ut_tv; /* Time entry was made */
#endif
int32_t ut_addr_v6[4]; /* IP address of remote host */
char __unused[20]; /* Reserved for future use */
};
This manpage is based on the libc5 one, things may work differently now.
针对你的两个问题:
1。既然注销时也把wtmp文件中的注销记录的ut_name字段清除为0,那么怎么知道是谁注销了呢?为什么要清除ut_name字段?
2。注销时候往wtmp文件中写入了注销记录,那么如何确定这个用户登录了多长时间呢?
1. 注销时不清wtmp里的记录。如果你说的是utmp的话,不清ut_name留着干什么?utmp只记录登录用户。
2. login时候记一次,logout时候记一次。时间差可以算出登录时间。
|
查看一下ac命令的源码不就什么都清楚了么?
man utmp详细描述了记录的详情,LZ仔细看看,结合ac的源码,应该没有什么问题的。
man utmp详细描述了记录的详情,LZ仔细看看,结合ac的源码,应该没有什么问题的。
|
楼上正解.用的时间差
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。