首先停止NSSwitch

我正在使用MySQL后端将我的一些UNIX用户存储到数据库中。 为了使系统能够检索关于这些用户的名称信息,我将MySQL添加到了NSS的来源:

passwd: files mysql group: files mysql shadow: files mysql 

但是,当我请求存储在/etc/passwd (“ files ”源files )中的用户信息时,MySQL后端仍然被查询(我可以看到我在/etc/libnss-mysql.cfg中configuration的查询被执行)。

有没有办法让NSS在匹配后停下来,以便在使用典型的UNIX身份validation资源find用户/组时找不到MySQL?

正如您在编辑2中看到的那样,当NSS尝试构build组列表时,出现问题,而不是在查找特定名称时出现问题。 这可能是为什么默认的SUCCESS => return链不适用于此。

编辑:我试图“迫使”NSS返回第一场比赛使用以下…

 passwd: files [SUCCESS=return] mysql group: files [SUCCESS=return] mysql shadow: files [SUCCESS=return] mysql 

(尽pipereturn应该是SUCCESS状态的默认值 ),但MySQL仍然被查询。 从行中删除mysql ,将NSS限制在这些文件中,所以我们可以清楚地说,即使在SUCCESS ,NSS也是如此。

编辑2(我如何看到MySQL仍然被查询) :我的MySQL查询是这样的,当查询MySQL时,不pipe你查询什么用户名,返回的组列表将总是包含GID 5000.所以,例如,如果myuser (存储在数据库中)属于mygroup (也存储在数据库中),那么MySQL将返回mygroup和GID 5000.示意图中,您可以观察到:

 mysql> SELECT * FROM grouplist WHERE username='myuser'; |---------------------------| | GID | USERNAME | |---------------------------| | n | myuser | |---------------------------| $ id myuser uid=m(myuser) gid=n(mygroup) groups=n(mygroup),5000(forcedgroup) ^^^^ added for every SQL query 

这个小小的“加法”是由查询本身完成的:

 gidsbymem SELECT id FROM ( \ SELECT id FROM grouplist WHERE username='%1$s' \ UNION SELECT 5000 AS id \ ) AS custom_groups 

现在,当我使用id myotheruser请求有关存储在/etc/passwd的用户的信息时,尽pipe/etc/group没有这种关联,我id myotheruser可以在他的组中看到GID 5000。 对我来说,发生的事情是:

  • NSS读取/etc/passwd并findmyotheruser
  • NSS查询我的数据库,没有find用户,但仍然返回GID 5000作为一个组列表。
  • 不属于任何SQL组的myotheruser在它的组列表中拥有GID 5000,因为MySQL添加了它。

示意图:

 $ id myotheruser uid=n(myotheruser) gid=n(myothergroup) groups=n(myothergroup),5000(forcedgroup) 

虽然我期望:

 $ id myotheruser uid=n(myotheruser) gid=n(myothergroup) groups=n(myothergroup) 

但是,当我从NSS的源中删除MySQL时, myotheruser在他的列表中不再有GID 5000(这就是为什么我可以说MySQL是添加它的人)。