前言
在 centos7 集群上部署一些服务的时候,由于习惯使用非 root 用户,但是非 root 用户安装 java 后,无法在sudo [command]
命令下找到 java。
原因核查
原因其实很简单,因为我的java环境变量是写在/etc/profile.d/my_env.sh
下的,而sudo命令是会重置环境变量,因此没有读到/etc/profile
,导致找不到 java。
解决方案
搜罗了网上很多的解决方案,我每个都试了一次,具体如下:
1、使用 sudo -E 继承当前环境变量
无效。原因应该是如果用户对于指定的环境变量没有权限,则会无效。
2、使用 sudo -i 提升到root环境但忽略.bashrc
有效!翻阅了大量的文档都没有提到 sudo -i
,但是这个参数竟然有效。参考《sudo 入门指南》这篇文章给了大概的原理说明。
3、修改/etc/sudoers文件,将Defaults env_reset改为 Defaults !env_reset
无效,据说此改动是取消sudo
对Path
的重置,但我测试没有任何变化。
4、修改/etc/sudoers文件中的env_keep参数
无效,使用Defaults env_keep += "env1 env2"
的方式修改env_keep
参数,测试发现无用。有可能是我env_keep
写得不对?
5、修改/etc/sudoers文件中的secure_path参数
有效!
把机器上的 $Path
的值,替换/etc/sudoers
中secure_path
值,再执行 sudo 命令发现可以找到 java。
总结
建议是使用sudo -E
或sudo -i
,尽量不要修改/etc/sudoers
文件。一方面是/etc/sudoers
维护麻烦,另一方面是本来/etc/sudoers
作为只读文件目的就是不希望被修改。(题外话,据说还可以通过在/etc/sudoers.d
目录下新增文件并添加环境变量,实现环境变量不重置。但此方法并没有找到相关文章借鉴,就此作罢。)