是否有任何通用解决方案可以使用单个 NSS 库两次(或多次)?
就我而言,我有两台 LDAP 服务器,一台位于计算机本身本地,一台位于远程。我需要让 NSS 与它们一起工作(如果本地没有必需的条目,它会使用远程 NSS)。
目前已解决,因此单个库(PADL/nss_ldap) 构建两次。在这两种情况下,构建之前都sed
用于nss_ldap
将源中出现的所有事件更改为其他内容。对于每种情况,使用不同的文本(如nss_ldap_1
和nss_ldap_2
)。构建结果会相应地重命名。这两个二进制文件都存储在目标系统上并在 中引用/etc/nsswitch.conf
。
此外,这两个库都使用不同的配置文件/etc/
(否则它没有任何意义!)。然而,只需在configure
构建之前更改库运行脚本中的参数即可轻松完成此操作。
但它并不“感觉正确”。还有其他方法吗?
我可以想象的是 NSS 库本身可以支持多种配置,以便它可以作为两个“单实例”工作。但如果您不是该库的作者,这是很难实现的。此外,它还需要随后调用这两种配置的库,而人们可能更喜欢在两者之间使用其他库。
另一种方法是编写一个简单的转发器,仅调用具有不同配置的其他库。但这再次要求其他库能够以某种方式重新配置(如果它仅在/etc
转发器中使用一些固定的配置文件将像第一个版本一样工作)。而且它只能工作一次 - 使用一个库三次或更多次,现在转发器本身会返回相同的问题。
答案1
不幸的是,您无法使用 GNU libc 的 NSS 实现来做到这一点。您注意到了根本问题,让我从不同的角度介绍它:nsswitch.conf
语法不允许向 NSS 服务模块提供任何附加信息,因此它们在重复调用时无论如何都不会表现出不同。因此 libc 端和模块端均不支持它。此外,glibc 还做了一个观点保持服务模块可直接链接共享对象,这排除了任何链接欺骗。
您可以做的是从两个 LDAP 目录中创建一个元目录,并在 NSS 配置中使用它。 OpenLDAP 很好地支持这一点,请参阅slapd-meta(5)
手册页或此合并简介例如。当然slapd
,如果您可以配置两者中的任何一个,则不需要为此创建新实例。
(如果可以的话,不要nss-ldap
使用。)nss-ldapd