我正在根据呼叫者的姓名制作 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(...)
。