W

w 命令如何知道空閒時間和正在執行的命令?

  • May 28, 2020

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父目錄的執行()權限即可工作。

引用自:https://unix.stackexchange.com/questions/231383