utmp

Autres langues

Langue: pl

Autres versions - même langue

Version: 2004-10-31 (openSuse - 09/10/07)

Section: 5 (Format de fichier)

NAZWA

utmp, wtmp - zapisy o logowaniu

SK£ADNIA

#include <utmp.h>

OPIS

Plik utmp umo¿liwia znalezienie informacji o tym, kto w danej chwili korzysta z systemu. Z systemu mo¿e korzystaæ wiêcej u¿ytkowników, poniewa¿ nie wszystkie programy zapisuj± informacje do utmp.

Ostrze¿enie: utmp musi byæ niezapisywalnym plikiem, poniewa¿ wiele programów systemowych (g³upio) polega na jego integralno¶ci. Istnieje ryzyko sfa³szowania logów systemowych i modyfikacji plików systemowych, je¶li utmp bêdzie zapisywalny dla u¿ytkowników.

Plik ten jest sekwencj± wpisów o postaci nastêpuj±cej struktury zdeklarowanej w pliku nag³ówkowym (nale¿y zwróciæ uwagê, ¿e jest to jedna z wielu definicji; szczegó³y zale¿± od wersji libc):






#define UT_UNKNOWN            0

#define RUN_LVL               1

#define BOOT_TIME             2

#define NEW_TIME              3

#define OLD_TIME              4

#define INIT_PROCESS          5

#define LOGIN_PROCESS         6

#define USER_PROCESS          7

#define DEAD_PROCESS          8

#define ACCOUNTING            9



#define UT_LINESIZE           12

#define UT_NAMESIZE           32

#define UT_HOSTSIZE           256



struct exit_status {

  short int e_termination;    /* kod przerwania procesu. */

  short int e_exit;           /* kod zakoñczenia procesu. */

};



struct utmp {

  short ut_type;              /* rodzaj logowania */

  pid_t ut_pid;               /* pid procesu loguj±cego */

  char ut_line[UT_LINESIZE];  /* nazwa urz±dzenia tty - "/dev/" */

  char ut_id[4];              /* id init lub skrót nazwy tty */

  char ut_user[UT_NAMESIZE];  /* nazwa u¿ytkownika */

  char ut_host[UT_HOSTSIZE];  /* nazwa hosta dla zdalnego logowania */

  struct exit_status ut_exit; /* kod zakoñczenia procesu

                                 oznaczonego jako DEAD_PROCESS */

  long ut_session;            /* ID sesji, s³u¿y do okienkowania */

  struct timeval ut_tv;       /* czas utworzenia wpisu */

  int32_t ut_addr_v6[4];      /* adres IP zdalnego hosta */

  char __unused[20];          /* zarezerwowane na przysz³o¶æ */

};



/* Dla zgodno¶ci w wcze¶niejszymi 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 nazwê pliku specjalnego skojarzonego z terminalem u¿ytkownika, nazwê u¿ytkownika i czas zalogowania w postaci time(2). Pola tekstowe s± zakoñczone przez '\0', je¿eli s± krótsze ni¿ rozmiar pola.

Pierwsze wpisy, jakie kiedykolwiek utworzono, pochodz± od init(8) przetwarzaj±cego inittab(5). Zanim jakikolwiek wpis zostanie utworzony, init(8) czy¶ci utmp przez wpisanie DEAD_PROCESS do ut_type, wype³niaj±c ut_user, ut_host i ut_time bajtami NUL we wszystkich rekordach, w których ut_type nie jest ustawione na DEAD_PROCESS lub RUN_LVL i dla których nie istnieje proces o PID równym ut_pid. Je¶li nie znajdzie siê ¿aden pusty rekord z wymaganym ut_id, init tworzy nowy. Wpisuje do niego ut_id z inittab, ut_pid i ut_time nadaje bie¿±ce warto¶ci, a ut_type nadaje warto¶æ INIT_PROCESS.

getty(8) lokalizuje wpis po numerze PID, zmienia ut_type na LOGIN_PROCESS, zmienia ut_time, ustawia ut_line i czeka na zestawienie po³±czenia. Po autentykacji u¿ytkownika, login(8) zmienia ut_type na USER_PROCESS, zmienia ut_time i nadaje warto¶ci ut_host i ut_addr. Zale¿nie od wersji getty(8) i login(8), rekordy mog± byæ wyszukiwane na podstawie ut_line zamiast preferowanego ut_pid.

Gdy init(8) stwierdzi, ¿e proces zakoñczy³ pracê, znajduje on jego wpis utmp wed³ug ut_pid, ustawia ut_type na DEAD_PROCESS i wype³nia ut_user, ut_host oraz ut_time bajtami NUL.

xterm(1) i inne emulatory terminali tworz± bezpo¶rednio rekord USER_PROCESS i generuj± ut_id, u¿ywaj±c ostatnich dwóch liter /dev/ttyp%c lub u¿ywaj±c p%d dla /dev/pts/%d. Je¶li znajd± dla tego id wpis DEAD_PROCESS, utylizuj± go, w innym wypadku tworz± nowy wpis. Je¶li mog±, zaznaczaj± go jako DEAD_PROCESS podczas koñczenia pracy i jest zalecane, by zerowa³y równie¿ ut_line, ut_time, ut_user oraz ut_host.

xdm(1) nie powinien tworzyæ rekordu w utmp, poniewa¿ nie ma przydzielonego terminala. Pozwalanie mu na utworzenie takowego spowoduje b³êdy takie jak 'finger: cannot stat /dev/machine.dom'. Jednak powinien on tworzyæ wpisy wtmp, tak jak to czyni ftpd(8).

telnetd(8) ustawia wpis LOGIN_PROCESS i zostawia po prostu resztê programowi login(8). Po zakoñczeniu sesji telnetu, telnetd(8) czy¶ci utmp w opisany sposób.

Plik wtmp ¶ledzi wszystkie zalogowania i wylogowania. Jego format jest taki jak utmp, poza tym, ¿e pusta nazwa u¿ytkownika wskazuje na jego wylogowanie z odpowiedniego terminala. Co wiêcej, nazwa terminala ~ w po³±czeniu z nazw± u¿ytkownika shutdown czy reboot wskazuje na zamkniêcie lub restart systemu, a para nazw terminali |/} loguje nowy/stary czas systemowy w przypadku jego zmiany za pomoc± date(1). wtmp jest obs³ugiwane przez login(1), init(1) oraz niektóre wersje getty(1). ¯aden z tych programów nie tworzy tego pliku, wiêc je¶li zostanie on usuniêty, zapisy do niego zostan± wy³±czone.

PLIKI

/var/run/utmp
/var/log/wtmp

ZGODNE Z

Wpisy utmp Linuksa nie s± zgodne ani z v7/BSD ani z SYSV: S± one mieszanin± tych dwóch. v7/BSD ma mniej pól; najwa¿niejszym problemem jest brak ut_type, który powoduje ¿e natywne programy v7/BSD wy¶wietlaj± (na przyk³ad) wpisy dead lub login. Co wiêcej, nie ma pliku konfiguracyjnego, który przydziela rekordy sesjom. BSD tak robi, poniewa¿ nie ma on pól ut_id. W Linuksie (tak jak w SYSV), pole ut_id rekordu nigdy nie ulega zmianie, kiedy raz zostanie mu nadana warto¶æ, co rezerwuje ten rekord bez potrzeby pliku konfiguracyjnego. Czyszczenie ut_id mo¿e prowadziæ do sytuacji wy¶cigu, których skutkiem bêd± uszkodzone wpisy w utmp i potencjalne dziury w bezpieczeñstwie. Czyszczenie wymienionych wy¿ej pól przez wype³nianie ich bajtami NUL nie jest wymagane przy semantyce SYSV, lecz pozwala na uruchamianie wielu programów, które zak³adaj± semantykê BSD a nie modyfikuj± utmp. Linux u¿ywa konwencji BSD dla zawarto¶ci pola line, jak opisano wy¿ej.

SYSV u¿ywa pola type tylko do ich zaznaczania i logowuje komunikaty informacyjne, takie jak np. "new time" w polu line. UT_UNKNOWN wydaje siê byæ wymy¶lone w Linuksie. SYSV nie ma pól ut_host czy ut_addr_v6.

W przeciwieñstwie do wielu innych systemów, gdzie utmp mo¿na wy³±czyæ przez usuniêcie tego pliku, w Linuksie utmp zawsze musi istnieæ. W celu wy³±czenia who(1) nale¿y jedynie uniemo¿liwiæ odczyt utmp dla ca³ego ¶wiata.

Trzeba zwróciæ uwagê, ¿e struktura utmp z libc5 uleg³a zmianie w libc6. Z tego powodu binaria korzystaj±ce ze starej struktury libc5 bêd± uszkadzaæ /var/run/utmp i/lub /var/log/wtmp. System Debian zawiera po³atan± wersjê libc5, która korzysta z nowego formatu utmp. Natomiast wci±¿ istnieje problem z wtmp, gdy¿ dostêp do tego pliku odbywa siê w libc5 bezpo¶rednio.

OGRANICZENIA

Format pliku jest zale¿ny od maszyny, wiêc jest zalecane, by plik by³ przetwarzany tylko na maszynie na której zosta³ utworzony.

Proszê zauwa¿yæ, ¿e na platformach, które mog± uruchamiaæ zarówno 32-bitowe, jaki 64-bitowe aplikacje (x86-64, ppc64, s390x itd.), rozmiary pól w strukturze utmp musz± byæ takie same w trybie 32-bitowym, co w 64-bitowym, Osi±ga siê to przez zmianê typu ut_session na int32_t, ut_tv na strukturê z dwoma polami typu int32_t: tv_sec i tv_usec (Dlatego, aby j± wype³niæ, nale¿y najpierw pobraæ czas do rzeczywistej struktury timeval, a nastêpnie skopiowaæ oba pola do ut_tv.)

B£ÊDY

Ta strona podrêcznika zosta³a oparta o stronê z wersji libc5, rzeczy mog± obecnie dzia³aæ inaczej.

ZOBACZ TAK¯E

ac(1), date(1), last(1), login(1), who(1), getutent(3), updwtmp(3), init(8)