分享一个解决 sudo 命令找不到环境变量的小技巧

良许Linux

共 1491字,需浏览 3分钟

 ·

2020-07-27 18:48



点击「阅读原文」查看良许原创精品视频。

作者:Mike

来自:奇妙的Linux世界

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

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

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

$ 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 重置。另外,如果用户对于指定的环境变量没有权限,则会报错。

  1. 修改 sudo 配置文件

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

当然你也可以用更简单粗暴的方式:直接将 Defaults env_reset 改成 Defaults !env_reset 来取消掉对 PATH 变量的重置,然后在 .bashrc 中最后添加 alias sudo='sudo env PATH=$PATH'。这样 sudo 执行命令时所搜寻的路径就是系统的 PATH 变量中的路径,如果你想添加其他变量方法也是类似。

  1. 手动添加变量

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

参考文档

  1. https://www.google.com

  2. http://ghoulich.xninja.org/2017/05/09/how-to-find-env-variables-when-exec-sudo-commands/

  3. http://www.ibm.com/developerworks/cn/aix/library/au-sudo/index.html


良许个人微信


添加良许个人微信即送3套程序员必读资料


→ 精选技术资料共享

→ 高手如云交流社群





本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!

推荐阅读:

常用算法复杂度速查表,蹲坑的功夫都能背

Linux cut 命令详解

5个基本Linux命令行工具的现代化替代品


5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「1024」,即可免费获取!!



浏览 66
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报