無法在 chroot 環境中執行重定向
我已經建立了完整的工作 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'
…因為這放在
sh
chroot 中,讓 echo 看到正確的重定向目錄。
重定向實際上並沒有發生在
chroot
.> /tmp/test
由您使用的任何外殼處理。如果您實際上傳遞> /tmp/test
給*chroot
*,那麼它將被傳遞給echo
並且您會看到this is a test > /tmp/test
在您的終端上。當然,你的 shell 沒有被
chroot
ed,所以使用 opens 就可以了/tmp/test
。然後,shellexec
schroot
執行檔,它呼叫chroot
系統呼叫,然後exec
s intoecho
,最後寫入 fd。chroot
在整個過程中,您的(un ed)shell 打開的原始文件描述符永遠不會被修改,因此您的chroot
edecho
能夠寫入它。這是一個故意的功能。允許外部程序
chroot
打開文件,然後其chroot
ed 子程序只能訪問chroot
父程序設計傳遞給它們的那些文件。如果您希望重定向發生在chroot 內,您需要生成一個知道如何解釋它的 shell:
chroot $dir bash -c "echo this is a test > /tmp/test"
現在的操作順序是:(
fork
使用預設的標準輸入、標準輸出和標準錯誤),,exec
chroot
(chroot
現在在 chroot 中),exec
bash
(知道如何處理重定向),fork
(的實現細節bash
),打開文件,exec
echo
(使用新的標準輸出)。