mac 修复sudo命令执行时http_proxy等环境变量的缺失问题

2024年09月14日 02:13  ·  阅读 460

前言

在使用sudo时,经常发生一些和普通用户或root用户直接执行时不一样的现象。 最常见的是,明明配置了全局网络代理http_proxy,但是在sudo时却还是没有代理。 甚至在某些必须要代理的环境下,sudo的命令会直接卡主,比如sudo curlsudo pip install等。

这是因为sudo会默认清理掉一些环境变量,以确保执行环境的干净,并减少安全风险。 http_proxy等环境变量,就被默认清理掉了。

修复http_proxy等环境变量

使用sudo visudosudo vim /etc/sudoers,修改sudo的配置文件,添加以下一行:

Defaults env_keep += "http_proxy https_proxy ftp_proxy no_proxy"

这里的环境变量可以填写任意内容,这里是以几个代理为示例。 但是某些特殊的环境变量,即使填写了也不会生效,比如PATHUSER等。

正常情况下,保存后直接生效。 但如果修改时不小心,写出了语法错误,就会出现以下情况。

修复/etc/sudoers中的语法错误

$ sudo vim /etc/sudoers
>>> /etc/sudoers: 语法错误 near line 9 <<<
sudo: /etc/sudoers 中第 9 行附近有解析错误
sudo: 没有找到有效的 sudoers 资源,退出
sudo: 无法初始化策略插件

如果修改/etc/sudoers文件出现语法错误并保存后,再次执行sudo会出现以上错误(或其英文版)。 这会陷入一种窘境:一方面需要root权限来再次修改,另一方面sudo却无法使用。

解决方案有四种:

  1. 通过su,登录root。但是一些系统配置下,root是无法登录的,或者强密码设完即丢。
  2. 使用其它sudo类软件。但是,一般是没有安装的,而安装又需要sudo apt install ...
  3. 重装系统,或者在恢复模式、U盘系统等情况下做文件操作……
  4. 通过pkexec visudo修改。还好一般发行版都留下了pkexec这道门。

还是用最后一种吧,其它三种都更麻烦。

评论
全部评论