如何解决sudo命令找不到环境变量的问题

在通过sudo运行命令时,系统会默认重置环境变量为安全的环境变量,也就是说,先前设置的变量都会失效,只有少数配置文件中指定的环境变量能够保存下来。

sudo的配置文件是/etc/sudoers,需要root权限才能读取,运行以下命令:

  1. sudo sed '/^#/d;/^$/d' /etc/sudoers

sudo的配置如下图所示:

sudo配置文件

请注意,第3行的Defaults env_reset表示默认会重置环境变量,因此自定义的变量会在sudo环境中失效,也就不会获取正确的变量值。第4行至第8行的env_keep配置项,用于保留部分环境变量不被重置,需要保留的变量就写入双引号之中。第9行的secure_path配置项,其中包含的路径将被当做sudo环境的PATH变量使用,如果在sudo环境无法找到某些命令,那么可以将这些命令的路径加入该配置项之中。

综上所述,sudo命令找不到环境变量或命令的问题,有三种解决方法:

1. sudo -E

加上-E选项后,用户可以在sudo执行时保留当前用户已存在的环境变量,不会被sudo重置。另外,如果用户对于指定的环境变量没有权限,则会报错。

2. 修改sudo配置文件

在内部测试机器中,安全性要求不高,总是需要加上-E参数来执行脚本,这个安全设定也不是很方便。因此,可以通过修改/etc/sudoers文件的env_keepsecure_path配置项,来指定sudo环境中需要保留的环境变量和路径。

3. 手动添加变量

手动在脚本中设置所需的变量,在执行sudo脚本前先将所需要的变量写入到需要执行的脚本开头。