Можно ли переопределить / обойти nscd? - PullRequest
2 голосов
/ 13 октября 2011

Я делаю ответы модуля NSS в зависимости от имени вызывающего абонента.Например, если sshd вызывает getpwnam_r(...), pw_shell будет / bin / bash ;если telnetd вызывает getpwnam_r(...), pw_shell будет / bin / ksh .

Создан прототип, и он работает.Однако, когда nscd работает и кэш горячий, функция модуля вызываться не будет.Кэшированный результат nscd возвращается каждому вызывающему. nscd предполагает, что единственной переменной результата является время;он никогда не думает, что имя процесса повлияет на результат.

Предположим, мы можем заставить некоторый демон или модуль переопределить nscd , код должен проверять, есть ли имя процесса в моем списке или нет.Если он есть в списке, пропустите nscd ;в противном случае, пусть nscd ответ getpwnam_r(...).

Возможно ли это?


Редактировать: Менее предпочтительно, но в порядке альтернативы - обходить nscd при звонке getpwnam_r(...).

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Вызовы nscd встроены в стандартную библиотеку, так что любой вызов функции, связанной с картой (getpwnam (), gethostbyname () и т. Д.), Сначала запросит nscd. Единственное решение - отключить nscd или написать свой собственный.

Вы можете подтвердить это, используя getent и strace:

strace -ttt getent passwd

Другие написали замены nscd - gnscd от Google, unscd для BusyBox. Так что, если вы не можете отключить nscd, вы должны переписать его ....

0 голосов
/ 03 июня 2014

Да. можно обойти nscd для каждого отдельного процесса, хотя это немного хак.

Если вы посмотрите исходный код glibc , вы увидите, что есть функция с именем __ nss_disable_nscd . Это используется nscd (или unscd ), чтобы гарантировать, что оно не станет рекурсивным.

Вероятно, легче прочитать пример в unscd . См http://busybox.net/~vda/unscd/nscd-0.51.c

...