![`w`命令如何知道空闲时间和正在运行的命令?](https://linux22.com/image/73560/%60w%60%E5%91%BD%E4%BB%A4%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E7%A9%BA%E9%97%B2%E6%97%B6%E9%97%B4%E5%92%8C%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
该w
命令显示了一系列有关谁登录了他们正在做什么的信息。
示例来自维基百科:
$ w
11:12am up 608 day(s), 19:56, 6 users, load average: 0.36, 0.36, 0.37
User tty login@ idle what
smithj pts/5 8:52am w
jonesm pts/23 20Apr06 28 -bash
harry pts/18 9:01am 9 pine
peterb pts/19 21Apr06 emacs -nw html/index.html
janetmcq pts/8 10:12am 3days -csh
singh pts/12 16Apr06 5:29 /usr/bin/perl -w perl/test/program.pl
我知道它从以下位置获取前 3 列信息utmp 和 wtmp,它对所有人都有读取权限,但是它从哪里获取信息闲置的时间和什么用户当前正在执行的操作?
ls -l $(which w)
显示该w
程序没有设置 setuid 位,并且作为普通用户,我无权查看/proc
.
答案1
至少在 Linux 上,由于终端上的任何用户输入都将访问当前用户设备,因此它会调用stat()
并/dev/{tty,pts/}?*
检查atime
登录用户。
从w.c
:
/* stat the device file to get an idle time */
static time_t idletime(const char *restrict const tty)
{
struct stat sbuf;
if (stat(tty, &sbuf) != 0)
return 0;
return time(NULL) - sbuf.st_atime;
}
static void showinfo(utmp_t * u, int formtype, int maxcmd, int from,
...
print_time_ival7(idletime(tty), 0, stdout);
...
stat()
只需要x
父目录的执行()权限即可工作。