Відповіді:
man
(команда, а не користувач) - це довідка. Програми надають підручні сторінки у своїх пакунках, але man
вони повинні знати, де вони знаходяться, а також яку допомогу вони надають. Для прискорення роботи - тому man
під час введення не виконується пошук всієї файлової системи man <command>
- ці довідкові сторінки індексуються в базу даних командою, що називається mandb
.
У Ubuntu mandb
зберігаються індекси в GNU gdbm базі даних за адресою /var/cache/man/index.db
(та декількома мовними версіями в одному каталозі). Це база даних хешування ключових значень, що не відрізняється від пам’ятної пам’яті, або сотня інших реалізацій за подібними ідеями. Це двійкове, легке та швидке. Я наведу приклад того, як грати з ним наприкінці.
Цю індексацію планується проводити щодня в Ubuntu /etc/cron.daily/man-db
. Весь скрипт працює як корінь і виконує деяке очищення спочатку, але в кінці ми бачимо, що mandb
він працює як man
користувач:
# --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
Це не міняє групу, через що всі права власності на групу /var/cache/man
досі залишаються кореневими.
Але чому взагалі mandb
працює як інший користувач? Він (можливо) може працювати так само добре, root
але він обробляє вхід з різних джерел (дивіться manpath
). Працюючи як власний користувач, ізолює систему від процесу вибуху - або ще гірше - від експлуатації неправильно сформованими, зіпсованими чи шкідливими сторінками.
Найгірше, що може статися, вплине лише на man
індекс сторінок. Бу-ху. Ви можете підтвердити це чимось на зразок:
sudo -u man find / -writable 2>/dev/null
І ви можете використовувати такий підхід, щоб побачити, скільки шкоди може заподіяти будь-який користувач у системі. Це гарна ідея перевірити свої файлові дозволи (наприклад, я лише дізнався, що будь-який користувач може видалити всю мою музичну колекцію, наприклад).
Ви можете зазирнути до бази даних за допомогою accessdb
. Ось кілька випадкових записів:
$ 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."
Хоча це не зовсім зрозуміло з вищезазначеного, там насправді є поля, розділені вкладками:
<name> -> <ext> <sec> <mtime> <ID> <ref> <comp> <whatis>
Детальніше про фактичний вміст поля ви можете прочитати в технічному посібнику .