有时候在执行某些脚本的时候,需要使用到sudo命令,但是如果没有设置好环境变量,则可能造成命令执行失败的问题,比如:

root@fcbai:~$ sudo -u hive hive
Unable to determine Hadoop version information.
'hadoop version' returned:
ERROR: Cannot execute /usr/bin/../libexec/hadoop-config.sh.

这是因为默认的sudo,除了提权的作用外,还会基于sudo的配置,重置掉环境变量,导致真正执行的环境变量和需要的环境变量不一致,从而出现sudo找不到环境变量,引起命令失败的问题。

而sudo命令会重置环境变量,查看文件/etc/sudoers,可以看到这样的配置:

Defaults      env_reset

解决办法也比较简单,思路就是在执行sudo的时候,不要使用sudo的配置去覆盖环境变量,而是使用当前需要提权的用户自己的环境变量,有多种方式去达到这个目的,其中一个方式就是使用-E参数,比如:

sudo -E hive hive

-E显示的设置当前的命令不要去重置环境变量,而是使用当前用户的环境变量,这样设置麻烦的地方就在每一个命令都要这样显示的去配置,也可以把这个配置项设置在配置文件里面,比如:

修改/etc/sudoers文件,将Defaults env_reset改为 Defaults !env_reset,这样以后使用sudo就再也不会重置环境变量了,也不需要通过-E去设置,需要注意一下,/etc/sudoers是只读文件,vim不能更改,要使用visudo命令(不用加文件名)来更改内容。

不过大部分环境变量我们一般都用不着,这种情况就可以在配置中添加env_keep,来使指定的几个环境变量保持不变:

  • 具体的做法是在 /etc/sudoers中添加语句 Defaults env_keep += “env1 env2” ,这样环境变量env1 和env2就可以在sudo执行时保留原来的值
  • 不过既然/etc/sudoers是个只读文件,就不是用来让我们改来改去的;还除了它,我们还可以在目录/etc/sudoers.d/下随便创建文件,写入 Defaults env_keep += “env1 env2”,效果和在/etc/sudoers中是一样的,也更加方便删除和修改

这样就可以继续保持原来的用法:

sudo -u hive hive

sudo的更多用法可以查看:https://wiki.archlinux.org/title/Sudo


扫码手机观看或分享: