Come fa il comando `w` a conoscere il tempo di inattività e il comando in esecuzione?


8

Il wcomando mostra un mucchio di informazioni su chi ha effettuato l'accesso a ciò che sta facendo.

Esempio da 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

So che ottiene le informazioni delle prime 3 colonne da utmp e wtmp , che ha i permessi di lettura per tutti, ma dove ottengono le informazioni per i tempi di inattività e cosa sta facendo l'utente ?

ls -l $(which w)mostra che il wprogramma non ha il setuid bit impostato e come utente normale, non ho il permesso di vedere altri processi /proc.


Su quale sistema operativo? Linux? e se sì, quale distro? (Ricorda, qui copriamo tutte le varianti di Unix e i dettagli differiscono a seconda del sistema operativo).
derobert,

Sono su Solaris, ma in realtà sono interessato a conoscere la risposta per tutte le varianti di UNIX. Uso anche Linux e da quello che posso dire, il wcomando non sembra variare troppo tra le varianti.
user193130,

Risposte:


10

Almeno su Linux, poiché qualsiasi input dell'utente sul terminale accederà al dispositivo dell'utente corrente, effettua una chiamata stat () a / dev / {tty, pts /}? * E verifica la presenza di tempo per gli utenti che hanno effettuato l'accesso. Dal wc:

/* 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 () richiede solo le autorizzazioni di esecuzione (x) sulla directory principale per funzionare.


Ah, anche il tempo modificato del dispositivo tty sembra essere aggiornato su Solaris quando eseguo un comando, quindi penso che sia così anche su Solaris. Che dire della colonna "cosa"? Potresti collegarti alla fonte in cui hai trovato w.c?
user193130,

@ user193130 Il sorgente è su procps.sf.net La colonna "what" si trova nella funzione getproc () nello stesso file (wc). La funzione esegue la scansione della tabella dei processi e cerca il processo "migliore" da segnalare come "(w) hat" in base al terminale di controllo e all'ora di inizio del processo (in Linux dal filesystem / proc).
nkms,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.