如何在用户级别覆盖 /etc/hosts 文件?

如何在用户级别覆盖 /etc/hosts 文件?

可能的重复:
我可以创建一个特定于用户的主机文件来补充 /etc/hosts 吗?

简而言之:我想知道是否可以获得一个~/hosts可以覆盖该/etc/hosts文件的文件,因为我没有任何特权访问权限。

我正在使用的机器似乎确实配置了正确的 DNS 服务器。当我尝试 ping 普通机器时姓名我正在使用它,它失败了。但是当我尝试通过 ping 他们时IP地址它按预期工作。

我想避免更改任何脚本和其他肌肉记忆手工制作的命令行™是我因为一台配置不当的机器而制作的。我联系了系统管理员,但他们还有其他事情要做。

我怎样才能实现它?

答案1

除了 LD_PRELOAD 技巧之外。如果您不使用,一个简单的替代方法nscd是复制libnss_files.so到您自己的某个位置,例如:

mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib

对副本进行二进制编辑以将/etc/hosts其替换为相同长度的内容,例如/tmp/hosts.

perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2

编辑/tmp/hosts以添加所需的条目。并使用

export LD_LIBRARY_PATH=~/lib

nss_files查看/tmp/hosts而不是/etc/hosts.

相反/tmp/hosts,你也可以做到/dev/fd//3,然后做

exec 3< ~/hosts

例如,这将允许不同的命令使用不同的hosts文件。

$ cat hosts
1.2.3.4 asdasd
$ LD_LIBRARY_PATH=~/lib getent hosts asdasd 3< ~/hosts
1.2.3.4         asdasd

如果nscd已安装并正在运行,您可以通过执行相同的技巧来绕过它,但这次将libc.so.6nscd 套接字的路径(类似于/var/run/nscd/socket)替换为一些不存在的路径。

相关内容