Answers:
man
(命令而不是用户)是帮助应用程序。应用程序在其程序包中提供手册页,但man
需要知道它们的位置以及所提供的帮助。为了加快处理速度- man
在键入时不要搜索整个文件系统man <command>
-名为的命令将这些手册页索引到数据库中mandb
。
在Ubuntu中,mandb
索引存储在GNU gdbm数据库中/var/cache/man/index.db
(位于同一目录中,还有几种特定于语言的版本)。这是一个键值哈希数据库,与memcache或与之类似的其他一百种实现没有不同。它是二进制的,轻巧且快速的。最后,我将举一个有关如何使用它的示例。
该索引计划由每天在Ubuntu中运行/etc/cron.daily/man-db
。整个脚本以root身份运行,并且先进行一些清理,但最后,我们看到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>
您可以在技术手册中阅读有关实际现场内容的更多信息。