web-dev-qa-db-ja.com

`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
_

最初の3列の情報を tmp and wtmp から取得することは知っていますが、これはすべてのユーザーの読み取り権限を持っていますが、どこでアイドル時間とユーザーが現在行っていること

ls -l $(which w)は、wプログラムにsetuidビットが設定されておらず、通常のユーザーとして、_/proc_で他のプロセスを表示する権限がないことを示しています。

8
user193130

少なくともLinuxでは、ターミナルでのユーザー入力は現在のユーザーデバイスにアクセスするため、/ dev/{tty、pts /}?*へのstat()呼び出しを実行し、ログインしているユーザーの時間をチェックします。 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)権限のみが必要です。

10
nkms