是否可以添加仅特定于特定用户的主机列表?也许是特定于用户的主机文件?
该机制还应该补充文件中的条目/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
将无法使用。ping
ping
答案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.6
nscd 套接字的路径(类似于/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
。