2011-10-13 77 views
2

我正在根據調用者的姓名製作NSS模塊答案。例如,如果sshd調用getpwnam_r(...)pw_shell將是/bin/bash;如果telnetd調用getpwnam_r(...)pw_shell將是/bin/ksh是否可以覆蓋/繞過nscd?

原型製作成功並且工作正常。但是,當nscd正在運行且緩存很熱時,模塊的功能將不會被調用。 nscd的緩存結果返回給每個調用者。 nscd假定結果的唯一變量是時間;它永遠不會想到進程名稱會影響結果。

假設我們可以讓一些守護進程或模塊覆蓋nscd,代碼應該檢查進程名是否在我的列表中。如果它在列表中,跳過nscd;否則,讓nscd回答getpwnam_r(...)

可能嗎?


編輯:不太優選,但行的替代方法是繞過NSCD當呼叫getpwnam_r(...)

+0

我認爲,如果您真的需要這種行爲,最好的辦法就是禁用'nscd',看看您是否注意到性能下降。許多人在禁用nscd的情況下快樂地跑步;這一切都取決於你的環境的大小。 – larsks

+0

我對此無法控制。環境各不相同。用戶很可能需要* nscd *。 –

回答

1

對nscd的調用被硬連線到標準庫中,因此任何對地圖相關函數(getpwnam(),gethostbyname()等)的調用都將首先查詢nscd。唯一的解決方法是關閉nscd或編寫自己的。

您可以通過使用getent和strace的證實了這一點:

strace的-ttt getent passwd中

其他人編寫NSCD替代 - 由谷歌gnscd,unscd的BusyBox的。 所以,如果你不能禁用nscd,那麼你必須重寫它....

0

是的。它可能繞過nscd在每個進程的基礎上,雖然這有點破解。

如果檢查出glibc的源代碼,你會看到有一個叫功能__nss_disable_nscd。這用於nscd(或unscd)以確保它不遞歸。

可能更容易閱讀unscd中的示例。請參閱http://busybox.net/~vda/unscd/nscd-0.51.c

相關問題