无论我怎么努力,似乎LD_LIBRARY_PATH使用 sudo 运行命令后,环境变量不会保留。我设法让它保留下来的唯一方法是,每当我从命令行调用命令时,sudo
在我的命令前面加上LD_LIBRARY_PATH=/the/path
,但我不想每次都这样做。
似乎 env_keep 选项忽略了这个变量,exempt_group 选项也是如此。
我的 %group 目前ALL=(ALL) NOPASSWD:ALL
在 sudoers 中具有访问权限。我希望这个特定的环境变量能够保留在我运行的任何命令中。
我怎样才能做到这一点?
我的服务器正在运行 Red Hat Enterprise Linux 5.7。
答案1
您可能希望使用
Defaults env_keep += "LD_LIBRARY_PATH FRED"
CentOS 6.2
但是对with 的快速测试Sudo version 1.7.4p5
没有通过LD_LIBRARY_PATH
,但确实通过了FRED
。 sudoers 手册页有这样的说法
请注意,大多数操作系统上的动态链接器将删除 可以从 setuid 可执行文件的环境中控制动态链接,包括 sudo。根据操作系统的不同,这可能包括 _RLD、DYLD_、LD_、 LDR_、LIBPATH、SHLIB_PATH 等。这些类型的变量已从 在 sudo 开始执行之前,环境就已经存在,因此, sudo 可以保留它们
因此看起来系统LD_LIBRARY_PATH
在 sudo 看到它之前就将其从环境中删除了。
答案2
为了让它发挥作用,我必须这样做:
- 添加
Defaults env_keep += "LD_LIBRARY_PATH"
到 sudoers - 在我的 .bashrc 文件中添加此别名:
alias sudo='sudo LD_LIBRARY_PATH=/mypath'
现在,我使用 sudo 调用的任何命令都会设置变量。
答案3
这不仅发生在 LD_LIBRARY_PATH 上,还发生在其他一些可能影响构建环境的环境变量上。在我的例子中,sudo 已变成:
sudo -HE env PATH=${PATH} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} PYTHONPATH=${PYTHONPATH} my_command
答案4
听起来你export LD_LIBRARY_PATH
还没有完成。这样做将使环境变量对所有内容都可用,并解决你遇到的这个问题。
或者,如果您想要一个万无一失的持久环境变量,请考虑将其附加到您的bashrc
(~/.bashrc
)文件中,然后打开一个新的终端会话。