2

我正在根据呼叫者的姓名制作 NSS 模块答案。例如,如果sshd调用getpwnam_r(...)pw_shell则将是/bin/bash;如果telnetd调用getpwnam_r(...)pw_shell则将是/bin/ksh

制作了一个原型并且它可以工作。但是,当nscd正在运行并且缓存很热时,模块的函数将不会被调用。nscd的缓存结果返回给每个调用者。nscd假设结果的唯一变量是时间;它从没想过进程名会影响结果。

假设我们可以创建一些守护进程或模块来覆盖nscd,代码应该检查进程名称是否在我的列表中。如果它在列表中,请跳过nscd;否则,让nscd回答getpwnam_r(...)

可能吗?


编辑:不太可取,但好的替代方法是在 call 时绕过nscdgetpwnam_r(...)

4

2 回答 2

1

对 nscd 的调用被硬连线到标准库中,因此对地图相关函数(getpwnam()、gethostbyname() 等)的任何调用都将首先查询 nscd。唯一的解决方案是关闭 nscd 或自己编写。

您可以使用 getent 和 strace 来确认这一点:

strace -ttt 获取密码

其他人已经编写了 nscd 替代品 - Google 的 gnscd,BusyBox 的 unscd。所以如果你不能禁用 nscd 那么你必须重写它......

于 2012-02-25T16:43:27.820 回答
0

是的。可以在每个进程的基础绕过nscd,尽管它有点小技巧。

如果您查看glibc源代码,您会发现有一个名为__nss_disable_nscd的函数。nscd(或unscd )使用它来确保它不会递归。

可能更容易阅读unscd中的示例。见http://busybox.net/~vda/unscd/nscd-0.51.c

于 2014-06-03T03:55:42.680 回答