Невозможно выполнить перенаправление в среде chroot

Не знаю, правильно ли вы расстались с bash.

Потому что я давно перестал работать с bash.

Но если вам нужен вывод find в цикле, попробуйте следующее:

find . -name '*.xlsx' -print0 |
    while IFS= read -r -d $'\0' z; do
        name="${z%%_*}" 
        dest=".${name//[ .-]/}" 
        mkdir "$dest"
    done
0
27.08.2017, 18:08
2 ответа

Когда вы запускаете:

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

> /tmp/testпроисходит "для" команды chroot, как если бы вы написали:

> /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, позволяя эхо видеть правильный перенаправленный каталог.

4
28.01.2020, 02:19

На самом деле перенаправление не происходит внутри chroot. > /tmp/testобрабатывается любой оболочкой, которую вы используете. Если вы на самом деле передали > /tmp/testвchroot, тогда он будет передан в echo, и вы увидите

this is a test > /tmp/test

на своем терминале. Ваша оболочка, конечно же, не получает chrooted, так что вполне нормально открывать /tmp/test. Затем оболочка execзапускает исполняемый файл chroot, который вызывает системный вызов chroot, а затем execв echo, который, наконец, пишет в файл fd.При этом исходный файловый дескриптор, открытый вашей (un chrooted) оболочкой, никогда не изменяется, поэтому ваш chrooted echoможет писать в него. .

Это преднамеренная функция. Процессу вне chrootразрешено открывать файлы, а затем его chrooted-потомки могут получить доступ только к тем файлам за пределами chroot, которые родительский процесс соизволил передать им.

Если вы хотите, чтобы перенаправление происходило внутриchroot, вам нужно создать оболочку, которая знает, как его интерпретировать:

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

Теперь порядок операций следующий: fork(со стандартным вводом, выводом и выводом по умолчанию), execchroot, chroot(теперь внутри chroot), execbash(знает как обрабатывать перенаправление), fork(подробности реализации bash), open file, exececho(с новым стандартным выводом).

3
28.01.2020, 02:19

Теги

Похожие вопросы