utmp(5)

NUME
utmp, wtmp - înregistrări de autentificare

SINOPSIS
#include <utmp.h>

DESCRIERE
Fișierul utmp permite aflarea de informații despre cine utilizează în prezent sistemul. Este posibil să existe mai mulți utilizatori care utilizează în prezent sistemul, deoarece nu toate programele utilizează jurnalizarea utmp.

Avertisment: utmp nu trebuie să poată fi scris de către clasa de utilizatori „other” (alții), deoarece multe programe de sistem depind (în mod nebunesc) de integritatea sa. Riscați să falsificați fișiere de jurnal de sistem și să modificați fișiere de sistem dacă lăsați utmp cu permisiuni de scriere pentru orice alt utilizator decât proprietarul și grupul proprietar al fișierului.

Fișierul este o secvență de structuri utmp, declarate după cum urmează în <utmp.h> (rețineți că aceasta este doar una dintre cele câteva definiții existente; detaliile depind de versiunea de libc):

    /* Valori pentru câmpul ut_type, de mai jos */

    #define EMPTY         0 /* Înregistrarea nu conține informații valide
                               (cunoscută anterior ca UT_UNKNOWN pe Linux) */
    #define RUN_LVL       1 /* Schimbarea nivelului de execuție a sistemului (a se vedea
                               init(1))
    */
    #define BOOT_TIME     2 /* Timpul de pornire a sistemului (în ut_tv) */
    #define NEW_TIME      3 /* Timpul după schimbarea ceasului sistemului
                               (în ut_tv) */
    #define OLD_TIME      4 /* Timpul înainte de schimbarea ceasului sistemului
                               (în ut_tv) */
    #define INIT_PROCESS  5 /* Proces generat de init(1)
    */
    #define LOGIN_PROCESS 6 /* Proces de lider de sesiune pentru autentificarea utilizatorului */
    #define USER_PROCESS  7 /* Proces normal */
    #define DEAD_PROCESS  8 /* Proces terminat */
    #define ACCOUNTING    9 /* Neimplementat */

    #define UT_LINESIZE      32
    #define UT_NAMESIZE      32
    #define UT_HOSTSIZE     256

    struct exit_status {              /* Tip pentru ut_exit, de mai jos */
        short e_termination;          /* Starea de terminare a procesului */
        short e_exit;                 /* Starea de ieșire a procesului */
    };

    struct utmp {
        short   ut_type;              /* Tipul de înregistrare */
        pid_t   ut_pid;               /* PID-ul procesului de autentificare */
        char    ut_line[UT_LINESIZE]; /* Numele dispozitivului tty - „/dev/” */
        char    ut_id[4];             /* Sufixul numelui terminalului,
                                         sau ID-ul inittab(5) */
        char    ut_user[UT_NAMESIZE]; /* Nume utilizator */
        char    ut_host[UT_HOSTSIZE]; /* Numele de gazdă pentru autentificarea de la distanță
                                         sau versiunea nucleului pentru mesajele de la
                                         nivelul de execuție */
        struct  exit_status ut_exit;  /* Starea de ieșire a unui proces
                                         marcat ca DEAD_PROCESS; nu
                                         este utilizat de Linux init(1)
    */
        /* Câmpurile ut_session și ut_tv trebuie să aibă aceeași dimensiune atunci când
           sunt compilate pe 32 și 64 de biți. Acest lucru permite partajarea
           fișierelor de date și a memoriei partajate între aplicațiile pe 32 și 64 de biți. */
    #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
        int32_t ut_session;           /* ID-ul sesiunii (getsid(2)),
                                         utilizat pentru deschiderea ferestrelor */
        struct {
            int32_t tv_sec;           /* Secunde */
            int32_t tv_usec;          /* Microsecunde */
        } ut_tv;                      /* Ora la care s-a făcut înregistrarea */
    #else
         long   ut_session;           /* ID-ul sesiunii */
         struct timeval ut_tv;        /* Ora la care s-a făcut înregistrarea */
    #endif

        int32_t ut_addr_v6[4];        /* Adresa de internet a gazdei de la
                                         distanță; adresa IPv4 folosește
                                         doar ut_addr_v6[0] */
        char __unused[20];            /* Rezervat pentru utilizare viitoare */
    };

    /* Trucuri de compatibilitate retroactivă */
    #define ut_name ut_user
    #ifndef _NO_UT_TIME
    #define ut_time ut_tv.tv_sec
    #endif
    #define ut_xtime ut_tv.tv_sec
    #define ut_addr ut_addr_v6[0]

Această structură indică numele fișierului special asociat terminalului utilizatorului, numele de autentificare al utilizatorului și ora de autentificare sub forma time(2). Câmpurile de tip șir de caractere se termină cu un octet nul („\0”) dacă sunt mai scurte decât dimensiunea câmpului.

Primele intrări care sunt create provin întotdeauna din procesarea de către init(1) a lui inittab(5). Totuși, înainte ca o intrare să fie procesată, init(1) curăță utmp prin stabilirea lui ut_type la DEAD_PROCESS, ștergând ut_user, ut_host și ut_time cu octeți nule pentru fiecare înregistrare în care ut_type nu este DEAD_PROCESS sau RUN_LVL și în care nu există un proces cu PID ut_pid. În cazul în care nu se găsește nici o înregistrare goală cu ut_id necesar, init(1) creează una nouă. Definește ut_id din inittab, ut_pid și ut_time la valorile curente, iar ut_type la INIT_PROCESS.

mingetty(8) (sau agetty(8)) localizează intrarea după PID, schimbă ut_type în LOGIN_PROCESS, modifică ut_time, stabilește ut_line și așteaptă stabilirea conexiunii. login(1), după ce un utilizator a fost autentificat, modifică ut_type în USER_PROCESS, modifică ut_time și stabilește ut_host și ut_addr. În funcție de mingetty(8) (sau agetty(8)) și login(1), înregistrările pot fi localizate prin ut_line în loc de preferabilul ut_pid.

Când init(1) constată că un proces a ieșit, localizează intrarea utmp prin ut_pid, stabilește ut_type la DEAD_PROCESS și golește ut_user, ut_host și ut_time cu octeți nuli.

xterm(1) și alte emulatoare de terminale creează direct o înregistrare USER_PROCESS și generează ut_id utilizând șirul care sufixează o parte din numele terminalului (caracterele care urmează după /dev/[pt]ty). Dacă găsesc un DEAD_PROCESS pentru acest ID, îl reciclează, în caz contrar creează o nouă înregistrare. Dacă pot, o marchează ca DEAD_PROCESS la ieșire și se recomandă să completeze ut_line, ut_time, ut_user și ut_host cu zerouri, de asemenea.

telnetd(8) stabilește o intrare LOGIN_PROCESS și lasă restul în seama lui login(1), ca de obicei. După ce sesiunea telnet se încheie, telnetd(8) curăță utmp în modul descris.

Fișierul wtmp înregistrează toate intrările și ieșirile. Formatul său este exact ca utmp, cu excepția faptului că un nume de utilizator nul indică o deconectare de la terminalul asociat. În plus, numele terminalului ~ cu numele de utilizator shutdown sau reboot indică o închidere sau o repornire a sistemului, iar perechea de nume de terminale |/} înregistrează ora veche/nouă a sistemului atunci când date(1) o modifică. wtmp este întreținut de login(1), init(1) și de unele versiuni de getty(8) (de exemplu, mingetty(8) sau agetty(8)). Nici unul dintre aceste programe nu creează fișierul, astfel încât, dacă este eliminat, păstrarea înregistrărilor este oprită.

FIȘIERE
/var/run/utmp
/var/log/wtmp

VERSIUNI
POSIX.1 nu specifică o structură utmp, ci una numită utmpx (ca parte a extensiei XSI), cu specificații pentru câmpurile ut_type, ut_pid, ut_line, ut_id, ut_id, ut_user și ut_tv. POSIX.1 nu specifică lungimile câmpurilor ut_line și ut_user.

Linux definește structura utmpx ca fiind aceeași cu structura utmp.

STANDARDE
Linux.

ISTORIC
Intrările Linux utmp nu sunt conforme nici cu v7/BSD, nici cu System V; ele sunt un amestec al celor două.

v7/BSD are mai puține câmpuri; cel mai important este că nu are ut_type, care face ca programele native de tip v7/BSD să afișeze (de exemplu) intrări moarte sau de conectare. Mai mult, nu există un fișier de configurare care să aloce sloturi pentru sesiuni. BSD face acest lucru deoarece îi lipsesc câmpurile ut_id.

În Linux (ca și în System V), câmpul ut_id al unei înregistrări nu se va schimba niciodată odată ce a fost definit, ceea ce rezervă acel slot fără a fi nevoie de un fișier de configurare. Ștergerea câmpului ut_id poate duce la condiții de competiție de date care să conducă la intrări utmp corupte și la potențiale găuri de securitate. Ștergerea câmpurilor menționate mai sus prin umplerea lor cu octeți nuli nu este cerută de semantica System V, dar face posibilă rularea multor programe care presupun semantica BSD și care nu modifică utmp. Linux utilizează convențiile BSD pentru conținutul liniilor, așa cum este documentat mai sus.

System V nu are câmpurile ut_host sau ut_addr_v6.

NOTE
Spre deosebire de alte sisteme, unde jurnalizarea utmp poate fi dezactivată prin eliminarea fișierului, utmp trebuie să existe întotdeauna pe Linux. Dacă doriți să dezactivați who(1), nu faceți ca utmp să poată fi citit de toată lumea.

Formatul fișierului este dependent de mașină, astfel încât se recomandă ca acesta să fie procesat numai pe arhitectura mașinii pe care a fost creat.

Rețineți că pe platformele biarch, adică pe sistemele care pot rula atât aplicații pe 32 de biți, cât și pe 64 de biți (x86-64, ppc64, s390x etc.), ut_tv are aceeași dimensiune în modul pe 32 de biți ca și în modul pe 64 de biți. Același lucru este valabil și pentru ut_session și ut_time, dacă acestea sunt prezente. Acest lucru permite ca fișierele de date și memoria partajată să fie partajate între aplicațiile pe 32 și 64 de biți. Acest lucru se realizează prin schimbarea tipului lui ut_session în int32_t, iar cel al lui ut_tv într-o structură cu două câmpuri int32_t tv_sec și tv_usec. Deoarece ut_tv poate să nu fie același lucru cu struct timeval, atunci în loc de apelul:

    gettimeofday((struct timeval *) &ut.ut_tv, NULL);

se recomandă următoarea metodă de definire a acestui câmp:

    struct utmp ut;
    struct timeval tv;

    gettimeofday(&tv, NULL);
    ut.ut_tv.tv_sec = tv.tv_sec;
    ut.ut_tv.tv_usec = tv.tv_usec;

CONSULTAȚI ȘI
ac(1), date(1), init(1), last(1), login(1), logname(1), lslogins(1), users(1), utmpdump(1), who(1), getutent(3), getutmp(3), login(3), logout(3), logwtmp(3), updwtmp(3)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.