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
_で他のプロセスを表示する権限がないことを示しています。
少なくとも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)権限のみが必要です。