stderr терминала красного цвета, даже с sudo

Я пытаюсь сделать рабочий пример для logrotate, и помочь мне через это я полагал, что это была хорошая идея повернуться stderr к красному.

Посредством некоторого чтения я натолкнулся на stderred, который я означал принимать. Я загрузил его, make'd он, и это работает приятно на пользователя.

Красное форматирование однако потеряно, когда команда вызывается через sudo. А именно, красное форматирование видимо с этой командой:

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

но не с этой командой:

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

Я попытался редактировать /root/.bashrc содержать:

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

но это, по-видимому, не заставляет его работать. Что я пропускаю?

3
задан 31 December 2015 в 22:33

1 ответ

Это вызвано тем, что sudo command выполнения command в его собственной подоболочке, запущенной root. Это означает что Ваш ~/.bashrc файл проигнорирован. Это также означает, что любые переменные среды определили в родительской оболочке (такой как LD_PRELOAD Вы начинаетесь ~/.bashrc) не передаются sudo оболочка. В этом объясняют man sudoers:

По умолчанию env_reset опция включена. Это заставляет команды выполняться с новой, минимальной средой. На AIX (и системы Linux без PAM), среда инициализируется с содержанием/etc/environment файла. Новая среда содержит ТЕРМИН, ПУТЬ, ДОМОЙ, ПОЧТУ, SHELL, LOGNAME, ПОЛЬЗОВАТЕЛЯ, ИМЯ ПОЛЬЗОВАТЕЛЯ и переменные SUDO_* в дополнение к переменным от процесса вызова, разрешенного env_check и env_keep опциями. Это - эффективно белый список для переменных среды.

Я не мог добраться env_keep опция работать здесь, я не знаю почему. Лучшим способом я мог найти передачи переменной к sudo должен создать файл (например, /path/to/foo) с этой строкой:

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

Затем выполненный sudo visudo и добавьте эту строку:

Defaults        env_file="/path/to/foo"

Это вызовет sudo читать /path/to/foo и добавьте любые определения переменной там к его среде.

3
ответ дан 1 December 2019 в 16:26

Другие вопросы по тегам:

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