На самом деле перенаправление не происходит внутри chroot
. > /tmp/test
обрабатывается любой оболочкой, которую вы используете. Если вы на самом деле передали > /tmp/test
вchroot
, тогда он будет передан в echo
, и вы увидите
this is a test > /tmp/test
на своем терминале. Ваша оболочка, конечно же, не получает chroot
ed, так что вполне нормально открывать /tmp/test
. Затем оболочка exec
запускает исполняемый файл chroot
, который вызывает системный вызов chroot
, а затем exec
в echo
, который, наконец, пишет в файл fd.При этом исходный файловый дескриптор, открытый вашей (un chroot
ed) оболочкой, никогда не изменяется, поэтому ваш chroot
ed echo
может писать в него. .
Это преднамеренная функция. Процессу вне chroot
разрешено открывать файлы, а затем его chroot
ed-потомки могут получить доступ только к тем файлам за пределами chroot
, которые родительский процесс соизволил передать им.
Если вы хотите, чтобы перенаправление происходило внутриchroot, вам нужно создать оболочку, которая знает, как его интерпретировать:
chroot $dir bash -c "echo this is a test > /tmp/test"
Теперь порядок операций следующий: fork
(со стандартным вводом, выводом и выводом по умолчанию), exec
chroot
, chroot
(теперь внутри chroot), exec
bash
(знает как обрабатывать перенаправление), fork
(подробности реализации bash
), open file, exec
echo
(с новым стандартным выводом).