Est-il possible de remplacer / contourner nscd?

Je fais un module NSS répond en fonction du nom de l’appelant. Par exemple, si sshd appelle getpwnam_r(...) , pw_shell sera / bin / bash ; Si telnetd appelle getpwnam_r(...) , le pw_shell sera / bin / ksh .

Un prototype est fabriqué et ça marche. Cependant, lorsque nscd est en cours d’exécution et que le cache est actif, la fonction du module ne sera pas appelée. Le résultat en cache de nscd est renvoyé à chaque appelant. nscd suppose que la seule variable au résultat est le temps; il ne pense jamais que le nom du processus affectera le résultat.

Supposons que nous puissions créer un démon ou un module pour remplacer nscd , le code doit vérifier que le nom du processus est sur ma liste ou non. S’il se trouve dans la liste, ignorez nscd ; sinon, laissez getpwnam_r(...) répondre getpwnam_r(...) .

C’est possible?


Edit: Moins préférable, mais alternative est de contourner nscd quand on appelle getpwnam_r(...) .

Les appels à nscd sont câblés dans la bibliothèque standard de telle sorte que tout appel à une fonction liée à la carte (getpwnam (), gethostbyname (), etc.) interroge d’abord nscd. La seule solution consiste à désactiver nscd ou à écrire le vôtre.

Vous pouvez le confirmer en utilisant getent et strace:

strace -ttt getent passwd

D’autres ont écrit nscd replacements – gnscd par Google, unscd pour BusyBox. Donc, si vous ne pouvez pas désactiver nscd, vous devez le réécrire ….

Oui. Il est possible de contourner nscd par processus, bien que ce soit un peu un piratage.

Si vous vérifiez le code source de la glibc, vous observerez une fonction appelée __nss_disable_nscd . Ceci est utilisé par nscd (ou unscd ) pour s’assurer qu’il n’est pas récursif.

Probablement plus facile de lire l’exemple dans unscd . Voir http://busybox.net/~vda/unscd/nscd-0.51.c