我想运行一个没有任何互联网接入的程序。
unshare -n ping 127.0.0.1。
作为非特权用户,它返回Operation not permitted,作为特权用户,它返回所需的Network is unreachable。
是否也有任何方法使它对非特权用户起作用?
发布于 2017-06-11 12:49:37
在较晚版本的util中,unshare获得了--map-root-user选项。引用unshare(1)版本2.26.2的话:
-r,-map-root-用户只在当前有效用户和组ID映射到新创建的用户名称空间中的超级用户UID和GID之后才运行程序。这样就可以方便地获得管理新创建的命名空间的各个方面所需的功能(例如在网络命名空间中配置接口或在挂载命名空间中挂载文件系统),即使在非特权运行时也是如此。作为一个简单方便的特性,它不支持更复杂的用例,例如映射UID和GID的多个范围。此选项意味着--setgroup=deny。
因此,在较新的系统上,您可以运行:
unshare -n -r ping 127.0.0.1这将产生预期的Network is unreachable。
在Debian系统上,您可能仍然会得到一个Operation not permitted错误,然后必须首先通过运行以下命令启用非特权用户命名空间:
sudo sysctl -w kernel.unprivileged_userns_clone=1注意:对于范围更广的用例,可以考虑更复杂的bwrap --unshare-net,如简要介绍的另一个答案。
发布于 2019-12-29 13:13:54
除了unshare -n之外,另一种输入新网络命名空间的方法是使用更高级的Bubblewrap (bwrap --unshare-net):
bwrap --bind / / --dev /dev --unshare-net -- your-program args …注意:如果your-program args …是ping 127.0.0.1,您会注意到Bubblewrap不支持ICMP,所以OP示例不会显示“Network is unreachable”。
同样有趣的是,--unshare-net中的程序确实有一个回送接口,但它是一个网络命名空间隔离的接口。
发布于 2018-06-18 12:49:50
您可以使用setcap实用程序来设置unshare。
sudo setcap cap_sys_admin+ep /usr/bin/unshare在此之后,您可以使用unshare -n ping 127.0.0.1,我无法进一步解释它,我也不知道这是否是一个好主意,但它有效,而且whoami没有将root显示为用户名。
https://unix.stackexchange.com/questions/252714
复制相似问题