终端的标准错误显示为红色,即使使用 sudo

终端的标准错误显示为红色,即使使用 sudo

我正在尝试为创建一个工作示例,为了帮助我完成此操作,我认为变为红色logrotate是一个好主意。stderr

通过阅读,我发现标准错误,我打算采用它。我下载了它,制作了它,它对用户来说运行良好。

但是,当通过 调用命令时,红色格式会丢失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}"

但这显然不起作用。我遗漏了什么?

答案1

这是因为在由 启动的自己的子 shell 中sudo command运行。这意味着您的文件将被忽略。这还意味着在父 shell 中定义的任何环境变量(例如您在 中设置的)都不会传递给shell。这在 中有解释:commandroot~/.bashrcLD_PRELOAD~/.bashrcsudoman sudoers

默认情况下,env_reset 选项处于启用状态。这会导致使用新的最小环境执行命令。在 AIX(以及没有 PAM 的 Linux 系统)上,使用 /etc/environment 文件的内容初始化环境。新环境包含 TERM、PATH、HOME、MAIL、SHELL、LOGNAME、USER、USERNAME 和 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并将任何变量定义添加到其环境中。

相关内容