Bash - substituição de processo no chroot sem / dev e / proc

3

Eu tenho uma cadeia chroot sem /dev e /proc montado. Quando tento fazer a substituição do processo aqui, isso acontece:

bash-4.4# cat <(ls)   
cat: open /dev/fd/63: No such file or directory

Eu tentei criar /dev/fd manualmente e garanti que todos os usuários tivessem permissões suficientes, mas isso não ajudou.

Existe alguma maneira de fazer isso funcionar sem montar nada do sistema externo?

    
por karlosss 18.11.2017 / 11:32

1 resposta

10

No Linux, /dev/fd é um link simbólico para /proc/self/fd , onde /proc/self é um link simbólico para o diretório de processo do processo de chamada. /proc/$pid/fd , em seguida, contém links mágicos para os filehandles abertos. Bash usa isso para fazer canais que podem ser acessados por nome de arquivo sem precisar deixar nada no sistema de arquivos real.

Então, você precisa montar /proc e criar o link simbólico /dev/fd .

Alternativamente, você pode ver se é possível fazer com que o Bash use pipes nomeados no sistema de arquivos, de acordo com o manual , deve ser uma opção:

Process substitution is supported on systems that support named pipes (FIFOs) or the /dev/fd method of naming open files.

Mas isso parece exigir uma recompilação. O script configure detecta automaticamente se /dev/fd está disponível, mas você pode desativá-lo em config.h , excluir a linha

#define HAVE_DEV_FD 1

(Ou altere para #undef HAVE_DEV_FD para ter certeza. E não cometa o erro que cometi: alterar o 1 para um 0 não funciona.)

Com essas configurações, você obtém

$ ./bash -c 'ls -l <(echo foo)'
prw------- 1 itvirta itvirta 0 Nov 18 13:13 /tmp/sh-np.pldKay

No entanto, se você fizer isso com ls ou algum outro comando que não vá ler o pipe, tanto o pipe quanto o processo do shell ficarão por aí.

    
por 18.11.2017 / 11:51