2011-09-30 238 views
3

虽然编写一个perl脚本旨在完全自动化虚拟机(XenPv)的设置,但是我遇到了一个小问题,可能很简单。如何退出perl脚本中的chroot?

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

脚本示例:

`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的方式我发现了一些脚本,它们的目标是退出已经 setup chroot(特权升级)。由于我在这里做chroot这些方法不适用。

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

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

但没有去。

UPDATE 几点考虑:

  • 在多个文件中我不能分割的脚本。 (愚蠢的原因,但真的,我不能)
  • chroot部分涉及到使用脚本较早收集的大量数据(在chroot之前),强制需要不在chroot中启动另一个脚本。
  • 使用开放,系统或反引号是不好的,我需要运行命令和基于输出(不是退出代码,实际输出)做其他事情。
  • chroot之后的步骤取决于chroot内部完成的工作,因此我需要在内部和外部定义或更改所有变量。
  • 叉是可能的,但我不知道一个好的方法来正确处理从孩子到孩子的信息传递。
+2

我想你需要到餐桌chroot的一部分,等待它的退出。 –

回答

9

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... 

它剧照缺少的检查认为一些错误。

+0

感谢大家提到这是不可能的。并提供叉子解决方案。 不像我预期的那样优雅,但会做。感谢这个例子。 –

2

尝试产生一个儿童进程,例如chroot,例如,用systemfork视您的需要而定,并等待孩子返回主程序继续。

+0

这是我做的第一件事。但是太有限了。 我需要运行命令并获取它们的输出。 做'open(chroot,“chroot'$ mount_point'/ bin/bash |”);'不可读/写,但只有一个或另一个。 –

+1

你需要运行perl命令吗?只是叉 –

+1

@Alexandre - 使用'IPC :: Open3'来执行外部命令的读写操作。 – mob

4

您无法撤销进程上的chroot()--这是系统调用的全部要点。

您需要第二个进程(子进程)在chrooted环境中完成这项工作。叉,让孩子接受chroot并做好自己的工作并离开,让父母去做清理工作。

2

这看起来似乎是有希望的:

Breaking Out of a Chroot Jail Using PERL

+0

这个页面讨论退出一个chroot并且发射一个shell,这是特权升级。我试过,但在我的情况下,它不能工作。我需要卸载脚本正在运行的驱动器,所以我需要它被杀死或在chroot之外。 无论如何,谢谢。 –