这是不带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执行。


当前回答

以防其他人碰到这个,想要禁用所有用户的所有路径变量更改。 使用命令:visudo访问sudoers文件。你应该在某处看到下面这行:

违约env_reset

你应该在下一行加上哪一个

违约! secure_path

缺省情况下,开启Secure_path。该选项指定sudo时要使什么为$PATH。感叹号禁用该功能。

其他回答

Secure_path是你的朋友,但如果你想让自己免于Secure_path,那就这样做吧

sudo visudo

和附加

Defaults exempt_group=your_goup

如果您想免除一堆用户,创建一个组,将所有用户添加到其中,并使用它作为您的豁免组。男人5 sudoer更多。

以防其他人碰到这个,想要禁用所有用户的所有路径变量更改。 使用命令:visudo访问sudoers文件。你应该在某处看到下面这行:

违约env_reset

你应该在下一行加上哪一个

违约! secure_path

缺省情况下,开启Secure_path。该选项指定sudo时要使什么为$PATH。感叹号禁用该功能。

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

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

alias sudo='sudo env PATH=$PATH'

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

sudo su -p

这似乎对我很管用

sudo -i 

它采取非sudo路径

只需在/etc/sudoers中编辑env_keep即可

它看起来是这样的:

默认值env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L language LINGUAS XDG_SESSION_COOKIE"

只需要在最后附加PATH,所以在更改之后,它看起来就像这样:

默认值env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L language LINGUAS XDG_SESSION_COOKIE路径"

关闭终端,然后再次打开。