Não é possível executar o redirecionamento no ambiente chroot

0

Eu configurei o ambiente de chroot do braço debootstrap-ed com todo o trabalho. Eu posso chroot , executar comandos, etc.

Estou fazendo um script que irá customizar o chroot env, mas eu luto com isso.

Por exemplo:

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

Alguém pode me explicar, por que neste exemplo recebo uma saída escrita em meu ambiente de host, não em chrooted?

Só para mencionar, eu poderia executar f.e.

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

mas gostaria de saber porque a execução do chrooted 'falha'

Editar:

Isso também funciona:

chroot $target_dir /bin/bash -c "echo test > /tmp/test"
    
por fugitive 27.08.2017 / 16:41

2 respostas

3

Quando você executa:

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

O > /tmp/test acontece "para" o comando chroot, como se você tivesse escrito:

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

Se você quiser que o redirecionamento ocorra dentro do comando chroot, uma maneira seria:

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

... como isso coloca sh dentro do chroot, deixando echo ver o diretório redirecionado correto.

    
por 27.08.2017 / 17:07
1

O redirecionamento não está realmente ocorrendo dentro de chroot . > /tmp/test é manipulado pelo shell que você está usando. Se você realmente passou > /tmp/test para chroot , ele seria passado para echo e você veria

this is a test > /tmp/test

no seu terminal. Você shell, é claro, não está recebendo chroot ed, por isso é perfeitamente bem com a abertura de /tmp/test . Em seguida, o shell exec s o executável chroot , que chama a chamada de sistema chroot e, em seguida, exec s em echo , que finalmente grava no fd. Por tudo isso, o descritor de arquivo original que seu shell (un chroot ed) abriu nunca é modificado, então o chroot ed echo é capaz de gravar nele.

Este é um recurso deliberado. Um processo fora do chroot tem permissão para abrir arquivos e, em seguida, seus filhos chroot ed podem acessar apenas os arquivos fora do chroot que o processo pai se dignou a passar para eles.

Se você quiser que o redirecionamento ocorra dentro do chroot, você precisa gerar um shell que saiba como interpretá-lo:

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

A ordem das operações é agora: fork (com padrão stdin, stdout e stderr), exec chroot , chroot (agora dentro do chroot), exec bash (sabe como manipular o redirecionamento), fork (detalhes da implementação de bash ), arquivo aberto, exec echo (com nova stdout).

    
por 27.08.2017 / 17:07