为什么 /etc/passwd 中有一个 man 条目

Dum*_*tru 23 users

我注意到我的/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 身份运行并首先进行一些清理,但最后我们看到mandbman用户身份运行:

# --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
Run 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)

您可以在技术手册中阅读有关实际字段内容的更多信息。

  • 也许你可以解释为什么这个服务(和许多其他服务)有自己的用户,而不只是以 root 或其他身份运行? (3认同)