stderr do terminal em vermelho, mesmo com sudo

3

Estou tentando criar um exemplo de trabalho para logrotate e, para me ajudar nisso, achei que era uma boa ideia transformar stderr em vermelho.

Por meio de algumas leituras, deparei-me com stderred , que eu pretendia adotar. Eu baixei, fiz e funcionou muito bem para o usuário.

A formatação vermelha, no entanto, é perdida quando o comando é convocado através de sudo . Especificamente, a formatação vermelha é visível com este comando:

$ /usr/games/cowsay -f fudge Yo
cowsay: Could not find fudge cowfile!

mas não com este comando:

$ sudo /usr/games/cowsay -f fudge Yo
cowsay: Could not find fudge cowfile!

Eu tentei editar /root/.bashrc para conter:

export LD_PRELOAD="/home/user/path/to/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

mas aparentemente isso não funciona. O que estou perdendo?

    
por Tfb9 23.12.2015 / 23:46

1 resposta

3

Isso ocorre porque sudo command executa command em sua própria subzela, iniciada por root . Isso significa que seu arquivo ~/.bashrc é ignorado. Isso também significa que quaisquer variáveis de ambiente definidas no shell pai (como o LD_PRELOAD que você está configurando em ~/.bashrc ) não são passadas para o shell sudo . Isso é explicado em man sudoers :

  

Por padrão, a opção env_reset está habilitada. Isso faz com que comandos para   ser executado com um novo ambiente mínimo. No AIX (e no Linux   sistemas sem PAM), o ambiente é inicializado com o   conteúdo do arquivo / etc / environment . O novo ambiente contém   TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME e SUDO_ *   variáveis além de variáveis do processo de chamada   permitido pelas opções env_check e env_keep . Isso é efetivamente   uma lista de permissões para variáveis de ambiente.

Não consegui obter a opção env_keep para trabalhar aqui, não sei porquê. A melhor maneira que encontrei de passar a variável para sudo é criar um arquivo (por exemplo /path/to/foo ) com esta linha:

LD_PRELOAD="/home/terdon/Setups/stderred/build/libstderred.so"

Em seguida, execute sudo visudo e adicione esta linha:

Defaults        env_file="/path/to/foo"

Isso fará com que sudo leia /path/to/foo e adicione quaisquer definições de variáveis ao seu ambiente.

    
por terdon 24.12.2015 / 00:31