我正在根据调用者的名称制作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。
对nscd的调用被硬连接到标准库中,这样任何对映射相关函数(getpwnam(), gethostbyname()等)的调用都会首先查询nscd。唯一的解决方案是关闭nscd或编写自己的nscd。
你可以通过使用geent和strace来确认:
strace -ttt getent passwd
其他人已经编写了nscd替代品——Google的gnscd, BusyBox的unscd。所以如果你不能禁用nscd那么你必须重写....
是。可以在每个进程的基础上绕过nscd,尽管这有点hack。
如果你检查glibc源代码,你会发现有一个名为__nss_disable_nscd的函数。这是由nscd(或unscd)使用来确保它不会递归。
可能更容易阅读unscd中的示例。见http://busybox.net/~ vda/unscd/nscd-0.51.c