Como o comando 'w' sabe o tempo ocioso e o comando running?

8

O comando w mostra um monte de informações sobre quem está logado no que eles estão fazendo.

Exemplo de Wikipedia :

$ 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

Sei que obtém as informações das 3 primeiras colunas de utmp e wtmp , que têm permissões de leitura para todos, mas onde ele obtém as informações para o tempo ocioso e o que o usuário está fazendo atualmente ?

ls -l $(which w) mostra que o programa w não tem o setuid bit definido e, como usuário comum, não tenho permissão para ver outros processos em /proc .

    
por user193130 22.09.2015 / 18:46

1 resposta

9

Pelo menos no linux, uma vez que qualquer entrada do usuário no terminal acessará o dispositivo do usuário atual, ele faz uma chamada stat () para / dev / {tty, pts /}? * e verifica o tempo de espera dos usuários logados. De 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 () requer apenas que as permissões execute (x) no diretório pai funcionem.

    
por 22.09.2015 / 19:51

Tags