我有测试代码,我希望在测试时让几个主机名解析为环回。部署后,此代码将根据需要使用正常的系统名称解析。测试和部署主机是最新的Linux发行版(SLES11SP1,例如)。
我想覆盖单个进程的主机名解析,而不是超级用户。有没有办法以这种狭隘的方式操纵nsswitch
/ hosts
行为?
是的,当然我可以自己覆盖主机名,但我不愿意(除非这个功能真的不可用)。
编辑:
glibc
的{{1}}功能听起来就像我想要的那样 - 但是我调查的主机之间的可用性/有效性似乎不一致。在某些时候,它被添加到不安全的环境变量列表中。但这是否意味着全球或仅在suid二进制文件中被忽略?是否仍适用于HOSTALIASES
()?
更多编辑:
国际海事组织,getnameinfo
赢得了胜利。对于不尊重它的平台,禁用HOSTALIAS
是一种解决方法 - 就像我的(SuSE)。也许他们会发布一个修复程序。
答案 0 :(得分:1)
胜利的LD_LIBRARY_PATH!
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
答案 1 :(得分:1)
假设您要拦截,例如gethostbyname()
,并为某些主机名返回127.0.0.1
...
如果您的代码是C ++,最简单的答案可能是使用gMock。
如果你不能,你可能想要插入gethostbyname
。记录样本插入器here。
答案 2 :(得分:1)
Brian,另一种选择是使用chroot。你可以为每个目录usr,lib,home等创建一个带有一堆mount -rbind的目录 - 足以模拟一个工作的根目录。然后使用mount -t aufs“将”现有的“etc”挂载到一个可写的空层。从本质上讲,无论你改变什么,最终只会在chroot环境中改变。您可以通过这种方式覆盖和模拟各种环境。 如果这有任何意义,需要我进一步阐述,请告诉我。