utmp(5) File Formats Manual utmp(5) NAZWA utmp, wtmp - zapisy o logowaniu SKLADNIA #include OPIS Plik utmp umozliwia znalezienie informacji o tym, kto w danej chwili korzysta z systemu. Z systemu moze korzystac wiecej uzytkownikow, poniewaz nie wszystkie programy zapisuja informacje do pliku utmp. Ostrzezenie: utmp nie moze miec ustawionego prawa do zapisywania dla wszystkich uzytkownikow, poniewaz wiele programow systemowych (glupio) polega na jego integralnosci. Istnieje ryzyko sfalszowania logow systemowych i modyfikacji plikow systemowych, jesli utmp bedzie modyfikowalny przez uzytkownikow innych niz wlasciciel tego pliku i uzytkownicy nalezacy do grupy, do ktorej nalezy wlasciciel pliku. Plik jest sekwencja wpisow, z ktorych kazdy ma postac nastepujacej struktury utmpzdeklarowanej w pliku naglowkowym (nalezy zwrocic uwage, ze jest to jedna z wielu definicji; szczegoly zaleza od wersji libc): /* Wartosci pola ut_type, ponizej */ #define EMPTY 0 /* Rekord nie zawiera poprawnej informacji (poprzednio znany jako UT_UNKNOWN pod Linuksem) */ #define RUN_LVL 1 /* Zmiana systemowych poziomow uruchomieniowych patrz init(1)) */ #define BOOT_TIME 2 /* Czas uruchomienia systemu (w ut_tv) */ #define NEW_TIME 3 /* Czas po zmianie zegara systemowego (in ut_tv) */ #define OLD_TIME 4 /* Czas przed zmiana zegara systemowego (in ut_tv) */ #define INIT_PROCESS 5 /* Proces uruchomiony przez init(1) */ #define LOGIN_PROCESS 6 /* Lider sesji procesow logowania uzytkownika */ #define USER_PROCESS 7 /* Zwykly proces */ #define DEAD_PROCESS 8 /* Proces zakonczony */ #define ACCOUNTING 9 /* Niezaimplementowane */ #define UT_LINESIZE 32 #define UT_NAMESIZE 32 #define UT_HOSTSIZE 256 struct exit_status { /* Typ ut_exit, ponizej */ short e_termination; /* Stan zakonczenia procesu */ short e_exit; /* Status zakonczenia procesu */ }; struct utmp { short ut_type; /* Typ rekordu */ pid_t ut_pid; /* ID procesu logowania */ char ut_line[UT_LINESIZE]; /* Nazwa urzadzenie terminala - "/dev/" */ char ut_id[4]; /* Przyrostek nazwy terminala, lub ID linii inittab(5) */ char ut_user[UT_NAMESIZE]; /* Nazwa uzytkownika */ char ut_host[UT_HOSTSIZE]; /* Nazwa komputera dla zdalnego logowania lub wersja jadra dla komunikatow o zmianach systemowych poziomow uruchomieniowych */ struct exit_status ut_exit; /* Kod zakonczenia procesu oznaczonego jako DEAD_PROCESS; nieuzywane przez init(1) pod Linuksem */ /* Pola ut_session i ut_tv musza miec ten sam rozmiar w srodowiskach 32- i 64-bitowych. Pozwala to na wspoldzielenie plikow i pamieci dzielone pomiedzy aplikacjami 32- i 64-bitowymi */ #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32 int32_t ut_session; /* ID sesji ( getsid(2)), uzywane przez GUI */ struct { int32_t tv_sec; /* Sekundy */ int32_t tv_usec; /* Mikrosekundy */ } ut_tv; /* Czas utworzenia wpisu */ #else long ut_session; /* ID sesji */ struct timeval ut_tv; /* Czas utworzenia wpisu */ #endif #endif int32_t ut_addr_v6[4]; /* Adres internetowy zdalnej stacji; adres IPv4 uzywa jedynie ut_addr_v6[0] */ char __unused[20]; /* Zarezerwowane na przyszlosc */ }; /* Dla zgodnosci w wczesniejszymi wersjami */ #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] Struktura ta podaje nazwe pliku specjalnego skojarzonego z terminalem uzytkownika, nazwe uzytkownika i czas zalogowania w postaci time(2). Pola tekstowe sa zakonczone przez bajt NULL ('\0'), jezeli sa krotsze niz rozmiar pola. Pierwsze wpisy, jakie kiedykolwiek utworzono, pochodza od init(1) przetwarzajacego inittab(5). Zanim jakikolwiek wpis zostanie utworzony, init(1) czysci utmp przez wpisanie DEAD_PROCESS do ut_type, wypelniajac ut_user, ut_host i ut_time bajtami NULL we wszystkich rekordach, w ktorych ut_type nie jest ustawione na DEAD_PROCESS lub RUN_LVL i dla ktorych nie istnieje proces o PID rownym ut_pid. Jesli nie znajdzie sie zaden pusty rekord z wymaganym ut_id, init(1) tworzy nowy. Wpisuje do niego ut_id z inittab, ut_pid i ut_time nadaje biezace wartosci, a ut_type nadaje wartosc INIT_PROCESS. mingetty(8) (lub agetty(8)) lokalizuje wpis po numerze PID, zmienia ut_type na LOGIN_PROCESS, zmienia ut_time, ustawia ut_line i czeka na zestawienie polaczenia. Po autentykacji uzytkownika, login(1) zmienia ut_type na USER_PROCESS, zmienia ut_time i nadaje wartosci ut_host i ut_addr. Zaleznie od wersji mingetty(8) (lub agetty(8)) i login(8), rekordy moga byc wyszukiwane na podstawie ut_line zamiast preferowanego ut_pid. Gdy init(1) stwierdzi, ze proces zakonczyl prace, to znajduje jego wpis utmp wedlug ut_pid, ustawia ut_type na DEAD_PROCESS i wypelnia ut_user, ut_host oraz ut_time bajtami NULL. xterm(1) i inne emulatory terminali tworza bezposrednio rekord USER_PROCESS i generuja ut_id, uzywajac koncowej czesci nazwy terminala (czyli znakow wystepujacych po /dev/[pt]ty). Jesli znajda dla tego ID terminala wpis DEAD_PROCESS, utylizuja go, w innym wypadku tworza nowy wpis. Jesli moga, zaznaczaja go jako DEAD_PROCESS podczas konczenia pracy i jest zalecane, by zerowaly rowniez ut_line, ut_time, ut_user oraz ut_host. telnetd(8) ustawia wpis LOGIN_PROCESS i zostawia reszte programowi login(1). Po zakonczeniu sesji telnetu, telnetd(8) czysci utmp w opisany sposob. Plik wtmp sledzi wszystkie zalogowania i wylogowania. Jego format jest taki jak utmp, poza tym, ze pusta nazwa uzytkownika wskazuje na jego wylogowanie z odpowiedniego terminala. Co wiecej, nazwa terminala ~ w polaczeniu z nazwa uzytkownika shutdown czy reboot wskazuje na zamkniecie lub restart systemu, a para nazw terminali |/} zapisuje stary i nowy czas systemowy w przypadku jego zmiany za pomoca date(1). wtmp jest obslugiwane przez login(1), init(1) oraz niektore wersje getty(1) (np. mingetty(8) lub agetty(8)). Zaden z tych programow nie tworzy tego pliku, wiec jesli zostanie usuniety, zapisy do niego zostana wylaczone. PLIKI /var/run/utmp /var/log/wtmp WERSJE POSIX.1 nie definiuje struktury utmp, ale ma utmpx (jako czesc rozszerzenia XSI) z definicjami pol ut_type, ut_pid, ut_line, ut_id, ut_user, and ut_tv. POSIX.1 nie okresla dlugosci pol ut_line i ut_user. Pod Linuksem struktura utmpx jest zdefiniowana tak samo jak struktura utmp. STANDARDY Linux. HISTORIA Wpisy utmp Linuksa nie sa zgodne ani z v7/BSD ani z Systemem V, ale sa mieszanina tych dwoch. v7/BSD zawiera mniej pol; najwazniejszym problemem jest brak ut_type, ktory powoduje ze natywne programy v7/BSD wyswietlaja (na przyklad) wpisy DEAD_PROCESS lub LOGIN_PROCESS. Co wiecej, nie ma pliku konfiguracyjnego, ktory przydziela rekordy sesjom. BSD tak robi z powodu braku pola ut_id. W Linuksie (tak jak w Systemie V), pole ut_id rekordu nigdy nie ulega zmianie, kiedy raz zostanie mu nadana wartosc, co rezerwuje ten rekord bez potrzeby pliku konfiguracyjnego. Czyszczenie ut_id moze prowadzic do sytuacji wyscigu, ktorych skutkiem beda uszkodzone wpisy w utmp i potencjalne dziury w bezpieczenstwie. Czyszczenie wymienionych wyzej pol przez wypelnianie ich bajtami NULL nie jest wymagane przy semantyce Systemu V, lecz pozwala na uruchamianie wielu programow, ktore zakladaja semantyke BSD, a nie modyfikuja utmp. Linux uzywa konwencji BSD dla zawartosci pola line, jak opisano wyzej. System V nie ma pol ut_host ani ut_addr_v6. UWAGI W przeciwienstwie do wielu innych systemow, gdzie utmp mozna wylaczyc przez usuniecie tego pliku, w Linuksie utmp zawsze musi istniec. W celu wylaczenia who(1) nalezy jedynie uniemozliwic odczyt utmp dla calego swiata. Format pliku jest zalezny od maszyny, wiec jest zalecane, by plik byl przetwarzany tylko na maszynie, na ktorej zostal utworzony. Prosze zauwazyc, ze na platformach, ktore moga uruchamiac zarowno 32-bitowe, jaki 64-bitowe aplikacje (x86-64, ppc64, s390x itd.), rozmiar pola ut_tv musi byc taki sam w trybie 32-bitowym, co w 64-bitowym. Podobnie jest z polami ut_session i ut_time, jesli sa obecne. Pozwala to na dzielenie plikow danych i pamieci wspoldzielonej pomiedzy aplikacjami 32- i 64-bitowymi. Osiagnieto to zmieniajac typ ut_session na int32_t, a typ ut_tv na strukture zawierajaca dwa pola o typie int32_t: tv_sec and tv_usec. Poniewaz ut_tv moze nie byc takie samo jak struct timeval, to zamiast wywolywania: gettimeofday((struct timeval *) &ut.ut_tv, NULL); zaleca sie uzywanie ponizszej metody do ustawiania wartosci w tym polu: 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; ZOBACZ TAKZE 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) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Przemek Borys , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.15 17 maja 2025 r. utmp(5)