Como descartar o stderr no shell Bash restrito?

6

No meu .bashrc existem alguns comandos que redirecionam o erro padrão para / dev / null , e isso não é permitido em rbash :

bash: /dev/null: restricted: cannot redirect output

Existe alguma maneira de contornar isso (curto de modificar Bash)? Ou seja, para

  • descartar erro padrão de outra forma ou
  • tente redirecionar apenas se for permitido.
por l0b0 23.01.2013 / 16:14

2 respostas

6

Você pode fechar o stderr como em:

ls /blah 2>&-

Embora isso funcione na maioria dos casos, pode causar problemas, pois aplicativos mal escritos podem acabar abrindo um novo arquivo que obteria automaticamente 2 como o descritor de arquivo e poderia acabar escrevendo mensagens de erro onde você não gostaria eles para.

Isso também significa que qualquer gravação no stderr feita pelo aplicativo retornará com um erro (EBADF) que pode afetar seu comportamento.

Como os canais são permitidos, você pode fornecer um comando que descarta todas as suas entradas. Aqui, usando grep -v '^' (mas você pode usar tail -n 0 ou sed d ou um script chamado discard que faz cat > /dev/null ):

{ ls /blah 2>&1 >&3 | grep -v '^'; } 3>&1

Alternativamente, você poderia ter o que inicia esse shell restrito iniciá-lo com o fd 3 (por exemplo) redirecionado para /dev/null ( rbash 3> /dev/null ), então você pode fazer dentro do shell restrito:

ls /blah 2>&3

Qual é permitido:

$ rbash -c 'ls /blah 2>&3' 3> /dev/null
$

Você pode verificar se o redirecionamento para /dev/null é permitido / funciona ou não com:

if true 2>&- > /dev/null; then
  echo allowed
fi

Você pode verificar se o shell está restrito ou não:

case $- in
  (*r*) echo restricted
esac
    
por 23.01.2013 / 21:59
2

A partir de man rbash , parece que qualquer redirecionamento é proibido: (os seguintes itens não são permitidos ou não são executados) redirecting output using the >, >|, <>, >&, &>, and >> redirection operators

Parece que você pode gerar outro script de shell para fazer o redirecionamento porque When a command that is found to be a shell script is executed, rbash turns off any restrictions in the shell spawned to execute the script.

Assim, enquanto você não pode $ foo 2>/dev/null , parece que você pode executar $ bar onde a barra contém #/bin/bash
foo 2>/dev/null

Teria que ser configurado antecipadamente a partir de um ambiente bash completo porque o rbash também não permitia specifying command names containing / , o que parece proibir o seu diretório atual ./bar mas não o /bin/bar implícito

Por favor, note: eu não tentei isso ainda

    
por 23.01.2013 / 19:30