Как команда `w` узнает время простоя и команду выполнения?

9

Команда 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 , у которых есть права на чтение для всех, но где он получает информацию для простоя и что в данный момент делает пользователь ?

ls -l $(which w)показывает, что wпрограмма не имеет установленного бита setuid и, как обычный пользователь, у меня нет разрешения видеть другие процессы в /proc.

user193130
источник
На какой операционной системе? Linux? и если да, то какой дистрибутив? (Помните, что мы рассмотрим все варианты Unix здесь, и детали различаются в зависимости от ОС).
Дероберт
Я нахожусь на Солярисе, но на самом деле мне интересно узнать ответ для всех вариантов UNIX. Я также использую Linux, и, насколько я могу судить, wкоманда, кажется, не сильно отличается между вариантами.
user193130 22.09.15

Ответы:

12

По крайней мере, в 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разрешения execute ( ) для родительского каталога.

nkms
источник
Ах, время изменения устройства tty также, по-видимому, обновляется в Solaris, когда я выполняю команду, поэтому я думаю, что это также происходит в Solaris. Что насчет колонки "что"? Не могли бы вы дать ссылку на источник, где вы нашли w.c?
user193130 22.09.15
@ user193130 Источник находится в procps.sf.net Столбец «что» находится в функции getproc () в том же файле (wc). Функция сканирует таблицу процессов и ищет «лучший» процесс для отчета как «(w) hat», основываясь на управляющем терминале и времени начала процесса (в linux из файловой системы / proc).
Нкм