Linux

無法在 chroot 環境中執行重定向

  • August 27, 2017

我已經建立了完整的工作 debootstrap-ed arm chroot 環境。我可以chroot在其中執行命令等。

我正在製作一個自定義 chroot env 的腳本,但我對此感到很掙扎。

例如:

chroot $target_dir echo this is a test > /tmp/test

誰能向我解釋一下,為什麼在這個例子中我的輸出是寫在我的主機環境中,而不是在 chrooted 中?

順便提一下,我可以執行 fe

echo this is a test > $target_dir/tmp/test

但我想知道為什麼 chrooted 執行“失敗”

編輯:

這也有效:

chroot $target_dir /bin/bash -c "echo test > /tmp/test"

當你執行時:

chroot $target_dir echo this is a test > /tmp/test

chroot 命令會發生這種> /tmp/test情況,就像您編寫的那樣:

> /tmp/test chroot $target_dir echo this is a test

如果您希望重定向發生在 chroot 命令內部,一種方法是:

chroot $target_dir sh -c 'echo this is a test > /tmp/test'

…因為這放在shchroot 中,讓 echo 看到正確的重定向目錄。

重定向實際上並沒有發生在chroot. > /tmp/test由您使用的任何外殼處理。如果您實際上傳遞> /tmp/test給*chroot*,那麼它將被傳遞給echo並且您會看到

this is a test > /tmp/test

在您的終端上。當然,你的 shell 沒有被chrooted,所以使用 opens 就可以了/tmp/test。然後,shell execschroot執行檔,它呼叫chroot系統呼叫,然後execs into echo,最後寫入 fd。chroot在整個過程中,您的(un ed)shell 打開的原始文件描述符永遠不會被修改,因此您的chrootedecho能夠寫入它。

這是一個故意的功能。允許外部程序chroot打開文件,然後其chrooted 子程序只能訪問chroot父程序設計傳遞給它們的那些文件。

如果您希望重定向發生chroot 內,您需要生成一個知道如何解釋它的 shell:

chroot $dir bash -c "echo this is a test > /tmp/test"

現在的操作順序是:(fork使用預設的標準輸入、標準輸出和標準錯誤),,exec chrootchroot現在在 chroot 中),exec bash(知道如何處理重定向),fork(的實現細節bash),打開文件,exec echo(使用新的標準輸出)。

引用自:https://unix.stackexchange.com/questions/388668