Odpowiedzi:
man
(polecenie, a nie użytkownik) to aplikacja pomocy. Aplikacje dostarczają strony podręcznika man w swoich pakietach, ale man
muszą wiedzieć, gdzie się znajdują, a także jaką pomoc zapewniają. Aby przyspieszyć - man
nie przeszukuj całego systemu plików podczas pisania man <command>
- te strony podręcznika są indeksowane do bazy danych za pomocą polecenia o nazwie mandb
.
W Ubuntu mandb
przechowuje indeksy w bazie danych GNU gdbm w /var/cache/man/index.db
(i kilka wersji specyficznych dla języka w tym samym katalogu). Jest to hashująca baza danych klucz-wartość, niepodobna do memcache ani setki innych implementacji podobnych pomysłów. Jest binarny, lekki i szybki. Na końcu podam przykład, jak się z tym bawić.
To indeksowanie jest uruchamiane codziennie w systemie Ubuntu przez /etc/cron.daily/man-db
. Cały skrypt działa jako root i najpierw czyści, ale na samym końcu widzimy, że mandb
jest uruchamiany jako man
użytkownik:
# --pidfile /dev/null so it always starts; mandb isn't really a daemon,
# but we want to start it like one.
start-stop-daemon --start --pidfile /dev/null \
--startas /usr/bin/mandb --oknodo --chuid man \
$iosched_idle \
-- --no-purge --quiet
Nie zmienia grupy, dlatego wszystkie własności grupy /var/cache/man
są nadal rootem.
Ale dlaczego w ogóle mandb
działa jako inny użytkownik? Może (prawdopodobnie) działać równie dobrze, root
ale przetwarza dane wejściowe z różnych źródeł (patrz manpath
). Działający jako własny użytkownik izoluje system przed procesem wysadzenia - lub gorzej - wykorzystywanym przez zniekształcone, uszkodzone lub złośliwe strony man.
Najgorsze, co mogłoby się zdarzyć, wpłynęłoby tylko na man
indeks stron. Boo Hoo. Możesz to potwierdzić za pomocą:
sudo -u man find / -writable 2>/dev/null
Możesz użyć tego podejścia, aby zobaczyć, ile szkód może wyrządzić użytkownik w systemie. Warto sprawdzić swoje uprawnienia do plików (właśnie dowiedziałem się, że każdy użytkownik może na przykład usunąć całą moją kolekcję muzyki).
Możesz zajrzeć do bazy danych za pomocą accessdb
. Oto kilka losowych rekordów:
$ accessdb | shuf -n3
fpurge -> "- 3 3 1380819168 A - - gz purge a stream"
fcgetlangs -> "FcGetLangs 3 3 1402007131 A - - gz Get list of languages"
ipython -> "- 1 1 1393443907 A - - gz Tools for Interactive Computing in Python."
Chociaż powyższe nie jest do końca jasne, w rzeczywistości są tam pola rozdzielone tabulatorami:
<name> -> <ext> <sec> <mtime> <ID> <ref> <comp> <whatis>
Więcej informacji na temat rzeczywistej zawartości pola można znaleźć w instrukcji technicznej .