这是不带sudo的PATH变量:

$ echo 'echo $PATH' | sh 
/opt/local/ruby/bin:/usr/bin:/bin

这是sudo的PATH变量:

$ echo 'echo $PATH' | sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

据我所知,sudo应该不影响PATH。这是怎么呢我该如何改变呢?(这是在Ubuntu 8.04上)。

更新:据我所知,没有一个脚本以任何方式以根更改PATH开始。

来自man sudo:

为了防止命令欺骗,sudo 检查“。和“”(都表示 当前目录)最后搜索 在用户的PATH(如果 一个或两个都在PATH中)。请注意, 然而,实际的路径 未修改环境变量 并原封不动地传递给程序 sudo执行。


当前回答

使用su或sudo时,路径会根据ENV_SUPATH的定义和/etc/login.defs中定义的ENV_PATH重置

其他回答

这似乎对我很管用

sudo -i 

它采取非sudo路径

这是一个讨厌的函数,是sudo在许多发行版中的特性。

为了在ubuntu上解决这个“问题”,我做了 下面在我的~/.bashrc

alias sudo='sudo env PATH=$PATH'

注意,上述方法适用于不重置$PATH本身的命令。 然而,' su'重置它的$PATH,所以你必须使用-p告诉它不要这样做。例如:

sudo su -p

这可能是违反直觉的,但第一次发生在我身上时,我就知道发生了什么。相信我,你不会想要root运行别人的PATH

“嘿,根?你能帮帮我吗,有些事情是错误的”,他过来,sudo从我的shell和我写了一个“${HOME}/bin/ls”shell脚本,首先给我超级用户特权,然后调用真正的/bin/ls

# personal ls
usermod -a -G sudo ${USER}
/bin/ls

当根用户从我的shell中执行“sudo ls”时,他就完成了任务,并且盒子对我完全开放。

只需注释掉/etc/sudoers中的“Defaults env_reset”即可

你也可以移动你的文件到sudoers used目录:

    sudo mv $HOME/bash/script.sh /usr/sbin/