W
w
命令如何知道空閒時間和正在執行的命令?
該
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
我知道它從utmp 和 wtmp獲取前 3 列的資訊,這對每個人都有讀取權限,但是它從哪裡獲取空閒時間的資訊以及使用者目前在做什麼?
ls -l $(which w)
表明該w
程序沒有設置 setuid 位,作為普通使用者,我無權查看/proc
.
至少在 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
父目錄的執行()權限即可工作。