偶尔发现的一个问题,平时主要使用 Ubuntu 操作系统,有时候安装一些软件会用加一些自定义PATH,往往为了方便都会把配置写到 /etc/environment 里面,这样所有用户包括root都有效:
jwang@jwang:~$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
/bin:/usr/games:/usr/local/games:/home/jwang/MyBin:/opt/go/bin"
export GOPATH=/home/jwang/Go
比如说安装了go,在使用 sudo go 这样命令的时候会报错,但是切换到 root 用户却没有问题,使用普通用户也没问题,查了一下发现原来 sudo 里面有一些配置:
sudo visudo
在这个 /etc/sudoers 文件里面,有一个secure_path配置,大家一看就知道了,它的意思当你使用 sudo+command 这种形式执行命令的时候会从其配置的路径里面寻找命令,肯定是没有你自定义的PATH的,这个主要是安全考虑。
解决方法有几种:
- 直接把自定义PATH路径配置在secure_path里面,简单粗暴,就是有点麻烦
- 将 Defaults env_reset 改成 Defaults !env_reset 取消掉对PATH变量的重置,然后在.bashrc中最后添加alias sudo='sudo env PATH=$PATH',这个感觉更麻烦
- 直接把这3行注释掉,经测试完全没有任何问题