4

在编写一个旨在完全自动化虚拟机(Xen pv)设置的 perl 脚本时,我遇到了一个可能非常简单的小问题。

使用 perl 的chroot 函数,我在来宾文件系统上做我的事情,然后我需要回到我最初的真实根目录。我到底是怎么做到的?

脚本示例:

`mount $disk_image $mount_point`;

chdir($mount_point);
chroot($mount_point);

#[Do my things...]

#<Exit chroot wanted here>

`umount $mount_point`;

#[Post install things...]

我试过退出;但显然退出整个脚本。

在寻找退出 chroot 的方法时,我发现了许多旨在退出设置的 chroot(权限提升)的脚本。由于我在这里执行 chroot,因此这些方法不适用。

尝试了一些疯狂的事情,例如:

opendir REAL_ROOT, "/";
chdir($mount_point);
chroot($mount_point);
chdir(*REAL_ROOT);

但是不行。

更新 需要考虑的几点:

  • 我无法将脚本拆分为多个文件。(愚蠢的原因,但真的,我不能)
  • chroot 部分涉及使用脚本之前(在 chroot 之前)收集的大量数据,从而强制不需要在 chroot 内启动另一个脚本。
  • 使用 open、system 或反引号不好,我需要运行命令并根据输出(不是退出代码,实际输出)做其他事情。
  • chroot 之后的步骤取决于 chroot 内部所做的事情,因此我需要在内部和外部拥有我定义或更改的所有变量。
  • Fork 是可能的,但我不知道正确处理与孩子之间的信息传递的好方法。
4

5 回答 5

10

chroot 进程()不能通过退出(它只会退出)来“取消root”本身。

您必须生成一个子进程,该进程将 chroot。

以下内容应该可以解决问题:

if (fork())
{
   # parent
   wait;
}
else
{
   # children
   chroot("/path/to/somewhere/");
   # do some Perl stuff inside the chroot...
   exit;  
}

# The parent can continue it's stuff after his chrooted children did some others stuff...

它仍然缺乏一些错误检查的思想。

于 2011-09-30T16:49:50.763 回答
4

您无法撤消chroot()进程上的 a - 这就是系统调用的重点。

您需要第二个进程(一个子进程)在 chrooted 环境中完成工作。叉子,让孩子经历chroot并做它的事情并退出,让父母做清理工作。

于 2011-09-30T16:48:10.577 回答
2

尝试产生一个子进程chroot,例如根据您的需要systemfork根据您的需要,并等待子进程返回主程序继续。

于 2011-09-30T16:29:44.200 回答
2

这看起来可能很有希望:

使用 PERL 突破 Chroot 监狱

于 2011-09-30T17:00:23.077 回答
0

将原始根目录保存为当前工作目录或文件描述符:

chdir "/";
chroot "/mnt";
# Do something
chroot ".";

或者

open DIR, "<", "/";
chroot "/mnt";
# Do something
chdir DIR;
chroot ".";
close DIR;
于 2020-05-01T21:38:53.553 回答