我有一个 unix 安装,它应该可以用作 chroot 和独立系统。如果它作为 chroot 运行,我不想运行任何服务(cron、inetd 等),因为它们会与主机系统发生冲突或变得多余。
如何编写根据是否在 chroot 中运行而行为不同的 shell 脚本?我的迫切需要是一个现代 Linux 系统,它/proc安装在 chroot 中,并且脚本以 root 身份运行,但也欢迎更多可移植的答案。(如果 /proc 未安装,请参阅如何判断我正在 chroot 中运行?对于没有/proc.的 Linux 的情况。)
更一般地说,适用于其他收容方法的建议会很有趣。实际问题是,这个系统是否应该运行任何服务?(答案在 chroot 中是否定的,在成熟的虚拟机中是;我不知道诸如 jails 或容器之类的中间情况。)
Gil*_*il' 55
我在这里所做的是测试init进程的根(PID 1)是否与当前进程的根相同。虽然/proc/1/root总是一个链接/(除非init它自己被 chroot 了,但这不是我关心的情况),跟随它会导致“主”根目录。此技术用于 Debian 中的一些维护脚本,例如在 chroot 中安装后跳过启动 udev。
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
Run Code Online (Sandbox Code Playgroud)
(顺便说一下,chroot如果 chrooted 进程具有 root 访问权限,那么这又是为什么对安全无用的另一个例子。非 root 进程无法读取/proc/1/root,但/proc/1234/root如果有一个 PID 1234 的正在运行的进程以相同的方式运行,它们可以跟随用户。)
如果您没有 root 权限,您可以查看/proc/1/mountinfo和/proc/$$/mountinfo(filesystems/proc.txt在 Linux 内核文档中简要介绍)。这个文件是世界可读的,并且包含了大量关于文件系统进程视图中每个挂载点的信息。该文件中的路径受到影响读取器进程的 chroot 的限制(如果有)。如果进程读取/proc/1/mountinfo使用chroot到文件系统,是从全球根不同(假设PID 1根是全球根),则不适合入门/的出现/proc/1/mountinfo。如果进程读取/proc/1/mountinfo被 chroot 到全局根文件系统上的目录,则 中会/出现一个条目/proc/1/mountinfo,但具有不同的挂载 ID。顺便说一下,根字段($4) 表示 chroot 在其主文件系统中的位置。
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
Run Code Online (Sandbox Code Playgroud)
这是一个纯 Linux 解决方案。它可以推广到具有足够相似性的其他 Unix 变体/proc(/proc/1/root我认为Solaris 有一个类似的,但不是mountinfo)。
l0b*_*0b0 24
正如Portable way to find inode number和Detecting a chroot jail from inside 所述,您可以检查 inode 编号是否/为2:
$ ls -di /
2 /
Run Code Online (Sandbox Code Playgroud)
不同于 2 的 inode 编号表示明显的根不是文件系统的实际根。这不会检测碰巧植根于挂载点或具有随机根 inode 编号的操作系统上的 chroot 。
tho*_*nic 10
虽然显然不如此处列出的许多其他选项可移植,但如果您使用的是基于 Debian 的系统,请尝试ischroot.
请参阅:https : //manpages.debian.org/jessie/debianutils/ischroot.1.en.html
要直接在控制台中获取状态,请使用 ischroot:
ischroot;echo $?
退出代码:
0 if currently running in a chroot
1 if currently not running in a chroot
2 if the detection is not possible (On GNU/Linux this happens if the script is not run as root).
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35819 次 |
| 最近记录: |