在我的 Linux 主机上,unshare -m
拒绝 root 权限。
Bubblewrapbwrap --dev-bind / / --ro-bind-data xxxx xxxx
且bwrap --dev-bind / / --tmpfs
不需要 root。 (没有 setuid bwrap
)
如何像 bubblewrap 一样在没有 root 的情况下使用挂载命名空间(但我不想使用 bubblewrap)?
答案1
您需要一个用户命名空间,例如unshare -rm
。
答案2
有些是你自己做的选择
(因为如果没有任何东西已经存在)。
- 用 golang 编写一个包装器,并为其提供所需的功能。
- 在 shell 或 python 中编写一个包装器,运行时使用
sudo
.然后添加一个条目,sudoers
这样您就不需要密码了。然后编写另一个包装器/别名,以便无需运行即可运行打字sudo
。
答案3
如果您需要的只是以非 root 用户身份重新映射文件系统中的目录,并在命令退出时清理的环境中运行子进程,我相信您可以使用该faketree
实用程序可以在这里找到。您可以阅读博客文章在这里描述它。
引用自文档:
- 不需要root,只要系统上启用了 pid 和用户命名空间,任何用户都可以运行它(大多数现代 Linux 发行版上默认设置它们,您可以使用包含的测试来验证)。
- 使用与用户相同的 UID/GID 运行命令,不会创建一个看起来以 root 身份运行的 shell(可以被标志覆盖)
- 不需要
LD_PRELOAD
、 ptrace 或类似的技巧。它适用于静态二进制文件以及需要修改LD_LIBRARY_PATH
或LD_PRELOAD
具有防止跟踪保护的二进制文件。- 仅影响 faketree 中运行的命令,这意味着您可以由同一用户在同一系统上使用不同的参数并行运行 faketree 的多个实例。
- 正确传播环境变量和权限,甚至允许图形工具在 faketree 中正确运行。
- 不依赖 FUSE,磁盘性能和性能不受影响。
- 可以覆盖单个文件,包括
/proc
和/sys
文件。- 尝试正确处理信号,因此 CI/CD 管道中的集成应该很简单。向 faketree 发送 SIGTERM 将传播到子级,并且 faketree 将正确等待所有子级和后代在退出之前终止。 faketree 的A
kill -9
将保证所有后代也被杀死。- 如果包装的命令调用 realpath 或检查文件系统,该命令将仅看到带有挂载的普通文件系统。