我正在做一个NSS模块的答案取决于调用者的名字。例如,如果sshd调用getpwnam_r(...),则pw_shell为/bin/bash;如果telnetd调用getpwnam_r(...),则pw_shell为/bin/ksh。
制作了一个原型,它可以工作。但是,当nscd运行时,缓存是热的,则不会调用模块的函数。nscd的缓存结果将返回给每个调用方。nscd假设结果的唯一变量是时间;它从不考虑进程名会影响结果。
假设我们可以创建一些守护进程或模块来覆盖nscd,代码应该检查进程名是否在我的列表中。如果它在列表中,跳过nscd;否则,让nscd回答getpwnam_r(...)。
有可能吗?
编辑:不太可取,但OK替代方法是在调用getpwnam_r(...)时绕过nscd。
发布于 2012-02-25 16:43:27
对nscd的调用被硬连接到标准库中,以便调用与地图相关的函数(getpwnam()、gethostbyname()等)。将首先查询nscd。唯一的解决方案是关闭nscd或编写自己的。
您可以通过使用getent和strace来确认这一点:
strace -ttt getent passwd
其他人则编写了nscd替代品--由Google编写的gnscd,用于BusyBox的unscd。所以如果你不能禁用nscd,那么你必须重写它..。
发布于 2014-06-03 03:55:42
是。It 可以在每个进程的基础上绕过nscd,尽管这有点麻烦。
如果您查看glibc源代码,就会发现有一个名为__nss_disable_nscd的函数。nscd (或unscd)使用它来确保它不是递归的。
在unscd中可能更容易阅读该示例。请参阅http://busybox.net/~vda/unscd/nscd-0.51.c
https://stackoverflow.com/questions/7750634
复制相似问题