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

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

是否可以添加仅特定于特定用户的主机列表?也许是特定于用户的主机文件?

该机制还应该补充文件中的条目/etc/hosts

答案1

您正在寻找的功能是在 glibc 中实现的。您可以通过设置环境变量来定义自定义主机文件HOSTALIASES。该文件中的名称将由gethostbyname(参见文档)。

示例(在 Ubuntu 13.10 上测试):

$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null

一些限制:

  • HOSTALIASES仅适用于使用getaddrinfo(3)或的应用程序gethostbyname(3)
  • 为了设定值/设置gid/设定帽应用程序中,libc 会清理环境,这意味着设置HOSTALIASES会丢失。是 setuid root 或net_raw在执行时被赋予了能力(因为它需要侦听 ICMP 数据包),因此除非您在调用 之前已经是 root,否则HOSTALIASES将无法使用。pingping

答案2

除了LD_PRELOAD技巧之外。可能适用于某些系统的一个简单替代方案是对处理主机名解析的系统库的副本进行二进制编辑,以替换/etc/hosts为您自己的路径。

例如,在 Linux 上:

如果您不使用nscd,请复​​制libnss_files.so到您自己的某个位置,例如:

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

(共享库可能位于其他地方,例如/lib/libnss_files.so.2

现在,对副本进行二进制编辑以将/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(这里使用两个斜杠,以便 的长度/dev/fd//3与 的长度相同/etc/hosts),然后执行

exec 3< ~/hosts

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

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

答案3

使用该命令创建的私有挂载空间unshare可用于向 shell 进程以及从该 shell 启动的任何后续子进程提供私有 /etc/hosts 文件。

# Start by creating your custom /etc/hosts file
[user] cd ~
[user] cat >my_hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 news.bbc.co.uk
EOF

[user] sudo unshare --mount
# We're now running as root in a private mountspace. 
# Any filesystem mounts performed in this private mountspace
# are private to this shell process and its children

# Use a bind mount to install our custom hosts file over /etc/hosts
[root] mount my_hosts /etc/hosts --bind

[root] cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 news.bbc.co.uk

[root] exec su - appuser

[appuser] # Run your app here that needs a custom /etc/hosts file

[appuser] ping news.bbc.co.uk
PING news.bbc.co.uk (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.026 ms
^C
--- news.bbc.co.uk ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.026/0.044/0.062/0.018 ms

答案4

一种解决方案是让每个用户都在一个单独的 中chroot,这样他们每个人都可以拥有自己的单独的/etc/hosts

相关内容