我正在尝试为创建一个工作示例,为了帮助我完成此操作,我认为变为红色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。这在 中有解释:command
root
~/.bashrc
LD_PRELOAD
~/.bashrc
sudo
man 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
并将任何变量定义添加到其环境中。