2011-09-30 67 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之外。 無論如何,謝謝。 –