我注意到我的/etc/passwd文件中有一个 man 用户的条目。这个用户的目的是什么?
man:x:6:12:man:/var/cache/man:/bin/sh
Run Code Online (Sandbox Code Playgroud)
Oli*_*Oli 32
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 --quietRun Code Online (Sandbox Code Playgroud)
它不会改变组,这就是为什么所有组的所有权/var/cache/man仍然是根。
但是为什么mandb以不同的用户身份运行呢?它可以(可能)运行得一样好,root但它正在处理来自各种来源的输入(请看manpath)。以自己的用户身份运行可以使系统免于被格式错误、损坏或恶意手册页利用的进程炸毁——或更糟的是。
可能发生的最坏情况只会影响man页面索引。呜呜。您可以通过以下方式确认:
sudo -u man find / -writable 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
您可以使用该方法查看任何用户可能对系统造成的损害。审核您的文件权限是个好主意(例如,我刚刚发现任何用户都可以删除我的整个音乐收藏)。
您可以使用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."
Run Code Online (Sandbox Code Playgroud)
虽然从上面的内容并不完全清楚,但实际上那里有制表符分隔的字段:
<name> -> <ext> <sec> <mtime> <ID> <ref> <comp> <whatis>
Run Code Online (Sandbox Code Playgroud)
您可以在技术手册中阅读有关实际字段内容的更多信息。