我根据来电者的姓名制作NSS模块答案。例如,如果 sshd 调用getpwnam_r(...)
,则pw_shell
将为 / bin / bash ;如果 telnetd 调用getpwnam_r(...)
,则pw_shell
将为 / bin / ksh 。
制作原型并且它可以工作。但是,当 nscd 正在运行且缓存很热时,将不会调用模块的功能。 nscd 的缓存结果将返回给每个调用者。 nscd 假设结果的唯一变量是时间;它从不认为进程名称会影响结果。
假设我们可以使一些守护进程或模块覆盖 nscd ,代码应检查进程名称是否在我的列表中。如果它在列表中,请跳过 nscd ;否则,让 nscd 回答getpwnam_r(...)
。
有可能吗?
编辑:不太可取,但可以选择在拨打getpwnam_r(...)
时绕过 nscd 。
答案 0 :(得分:1)
对nscd的调用被硬连线到标准库中,这样对地图相关函数(getpwnam(),gethostbyname()等...)的任何调用都将首先查询nscd。唯一的解决方案是关闭nscd或编写自己的。
您可以使用getent和strace确认这一点:
strace -ttt getent passwd
其他人已经写了nscd替换 - 谷歌的gnscd,BusyBox的unscd。 因此,如果您无法禁用nscd,则必须重写它....
答案 1 :(得分:0)
是。 可以在每个进程的基础上绕过 nscd ,尽管它有点像黑客攻击。
如果您查看 glibc 源代码,您将会看到一个名为 __ nss_disable_nscd 的函数。这由 nscd (或 unscd )使用,以确保它不会递归。
可能更容易阅读 unscd 中的示例。见http://busybox.net/~vda/unscd/nscd-0.51.c