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


当前回答

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

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

其他回答

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

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

PATH是一个环境变量,因此在默认情况下由sudo重置。

您需要特殊的权限才能被允许这样做。

来自man sudo

       -E  The -E (preserve environment) option will override the env_reset
           option in sudoers(5)).  It is only available when either the match-
           ing command has the SETENV tag or the setenv option is set in sudo-
           ers(5).
       Environment variables to be set for the command may also be passed on
       the command line in the form of VAR=value, e.g.
       LD_LIBRARY_PATH=/usr/local/pkg/lib.  Variables passed on the command
       line are subject to the same restrictions as normal environment vari-
       ables with one important exception.  If the setenv option is set in
       sudoers, the command to be run has the SETENV tag set or the command
       matched is ALL, the user may set variables that would overwise be for-
       bidden.  See sudoers(5) for more information.

用法示例:

cat >> test.sh
env | grep "MYEXAMPLE" ;
^D
sh test.sh 
MYEXAMPLE=1 sh test.sh
# MYEXAMPLE=1
MYEXAMPLE=1 sudo sh test.sh 
MYEXAMPLE=1 sudo MYEXAMPLE=2 sh test.sh 
# MYEXAMPLE=2

更新

man 5 sudoers : 

     env_reset       If set, sudo will reset the environment to only contain
                       the LOGNAME, SHELL, USER, USERNAME and the SUDO_* vari-
                       ables.  Any variables in the caller's environment that
                       match the env_keep and env_check lists are then added.
                       The default contents of the env_keep and env_check
                       lists are displayed when sudo is run by root with the
                       -V option.  If sudo was compiled with the SECURE_PATH
                       option, its value will be used for the PATH environment
                       variable.  This flag is on by default.

所以可能需要检查这个是/没有编译。

在Gentoo中是默认的

# ( From the build Script )
....
ROOTPATH=$(cleanpath /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin${ROOTPATH:+:${ROOTPATH}})
....
econf --with-secure-path="${ROOTPATH}" 

呃,如果你没有在你的路径中添加一些东西,这就不是一个真正的测试:

bill@bill-desktop:~$ ls -l /opt/pkg/bin
total 12
-rwxr-xr-x 1 root root   28 2009-01-22 18:58 foo
bill@bill-desktop:~$ which foo
/opt/pkg/bin/foo
bill@bill-desktop:~$ sudo su
root@bill-desktop:/home/bill# which foo
root@bill-desktop:/home/bill# 

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

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

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

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

我认为实际上让sudo重置PATH是可取的:否则,攻击者已经破坏了你的用户帐户,可以在你的用户的PATH上放置各种工具的后门版本,并且在使用sudo时它们将被执行。

(当然,让sudo重置PATH并不能完全解决这类问题,但它有帮助)

这确实是当你使用

Defaults env_reset

在/etc/sudoers中,不使用豁免组或env_keep。

这也很方便,因为您可以将只对根目录有用的目录(例如/sbin和/usr/sbin)添加到sudo路径,而不必将它们添加到用户的路径中。使用实例指定sudo使用的路径。

Defaults secure_path="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin"