如何在 perl 脚本中退出 chroot?

问题描述 投票:4回答:5

在写一个 perl 脚本的时候,我遇到了一个小问题,也许是非常简单的问题,这个问题是为了完全自动化地设置虚拟机(Xen pv)。

使用perl的 根功能 我在客人文件系统上做我的事情,然后我需要回到我最初的真正的根。我到底该怎么做呢?

脚本的例子。

`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或backticks都不好,我需要运行命令,并根据输出(不是退出代码,是实际输出)做其他事情。
  • 在chroot之后的步骤取决于在chroot内部所做的事情,因此我需要把我在chroot内部定义或改变的所有变量放在外面。
  • Fork是可能的,但我不知道如何正确处理子程序的信息传递。
linux perl chroot
5个回答
10
投票

被chroot的进程()不能通过退出来 "取消chroot"(这样就会退出)。

你必须产生一个子进程,它将会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...

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


4
投票

你不能撤销一个 chroot() 进程上--这就是系统调用的全部意义。

你需要第二个进程(子进程)在chroot环境中完成工作。 分叉,并让子进程在系统调用中进行 chroot 并做它的事情并退出,让父进程来做清理工作。


2
投票

试着生出一个子进程,让它来做它的 chroot例如,与 systemfork 根据您的需求,并等待孩子返回主程序继续。


2
投票

这个看起来可能很有希望。

"用PERL突破Chroot监狱


0
投票

将原来的根目录保存为当前的工作目录或文件描述符。

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

open DIR, "<", "/";
chroot "/mnt";
# Do something
chdir DIR;
chroot ".";
close DIR;
© www.soinside.com 2019 - 2024. All rights reserved.