sudo改变path – 为什么?

这是没有sudo的PATHvariables:

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

这是sudo的PATHvariables:

 $ 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开始。

从男人sudo:

为防止命令欺骗,sudo在search用户PATH中的命令(如果其中一个或两者都在PATH中)时检查最后一个“。”和“”(都表示当前目录)。 但是请注意,实际的PATH环境variables没有被修改,并且不变地传递给sudo执行的程序。

这是 一个烦人的function Ubuntu上的sudo function 。 请注意,这不会发生在Fedora上,因为sudo不是用–with-secure-path选项build立的。

为了解决这个ubuntu上的“问题”,我在〜/ .bashrc中执行以下操作

 alias sudo='sudo env PATH=$PATH' 

注意上面的这些命令不会重置$ PATH本身。 但是`su'重置它是$ PATH,所以你必须使用-p来告诉它不要。 IE:

 sudo su -p 

如果有人跑过这个,并且只想禁用所有用户改变的pathvariables。
通过使用命令: visudo来访问你的sudoers文件。 你应该看到下面的行:

默认值env_reset

您应该在下一行添加以下内容

默认值!secure_path

secure_path默认启用。 这个选项指定了当sudoing时要做什么$ PATH。 感叹号将禁用该function。

PATH是一个环境variables,因此默认由sudo重置。

您需要特殊的权限才能执行此操作。

man sudo

        -E -E (保留环境)选项将覆盖env_reset
           在sudoers(5)选项)。 只有在比赛中,
            ing命令有SETENV标签或setenv选项在sudo-
            ERS(5)。
       要为该命令设置的环境variables也可以传递
        VAR = valueforms的命令行,例如
        LD_LIBRARY_PATH = / usr / local / pkg / lib。 通过命令传递的variables
       线受到与正常环境相同的限制vari-
       有一个重要的例外。 如果setenv选项设置在
        sudoers,要运行的命令有SETENV标记集或命令
       匹配是ALL,用户可以设置variables,
       吩咐。 请参阅sudoers(5)了解更多信息。

用法示例:

 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 

更新

男人5 sudoers: 

      env_reset如果设置,sudo将重置环境为仅包含
                        LOGNAME,SHELL,USER,USERNAME和SUDO_ * vari-
                        ABLES。 调用者环境中的任何variables
                       匹配env_keep,然后添加env_check列表。
                        env_keep和env_check的默认内容
                       当sudo用root运行时会显示列表
                        -V选项。 如果sudo是用SECURE_PATH编译的
                       选项,其值将用于PATH环境
                       variables。 此标志默认打开。

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

这在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}" 

看起来这个bug已经有一段时间了! 这里有一些错误引用,你可能会发现有帮助(可能要订阅/投票,提示,提示…):


Debian bug#85123(“sudo:SECURE_PATH仍然不能被覆盖”)(从2001年开始!)

在这个版本的sudo中,似乎Bug#20996仍然存在。 更新日志说,它可以在运行时被覆盖,但我还没有发现如何。

他们提到把这样的东西放在你的sudoers文件中:

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

但是当我至less在Ubuntu 8.10中这样做的时候,它给了我这个错误:

 visudo: unknown defaults entry `secure_path' referenced near line 10 

Ubuntu bug#50797(“使用–with-secure-path构build的sudo有问题”)

更糟糕的是,据我所知,不可能在sudoers文件中重新指定secure_path。 因此,例如,如果您想让用户轻松访问/ opt下的某些内容,则必须重新编译sudo。


是。 需要有一种方法来覆盖这个“function”,而不必重新编译。 没有什么比安全偏执者更糟糕的是告诉你什么对你的环境最好,然后不给你一个方法来closures它。


这真的很烦人 由于安全原因,默认情况下保持当前的行为是明智的,但除了从源代码重新编译之外,应该有一种重写它的方式! 许多人需要PATHinheritance。 我想知道为什么没有维护人员看着它,这似乎很容易得出一个可以接受的解决scheme。


我像这样解决了这个问题:

 mv /usr/bin/sudo /usr/bin/sudo.orig 

然后创build一个包含以下内容的文件/ usr / bin / sudo:

 #!/bin/bash /usr/bin/sudo.orig env PATH=$PATH "$@" 

那么你的常规sudo就像非安全pathsudo一样工作


Ubuntu的bug#192651(“sudo path is always reset”)

鉴于这个bug的重复最初是在2006年7月提交的,我不清楚无效的env_keep已经运行了多长时间。 无论强迫用户如何使用上述技巧的优点,当然,sudo和sudoers的手册页应该反映修改PATH的选项是有效多余的。

修改文档以反映实际执行情况不会造成不稳定,并且非常有帮助。


Ubuntu bug#226595(“不可能保留/指定PATH”)

我需要能够在PATH中使用额外的非标准二进制文件夹运行sudo。 已经添加我的要求到/ etc / environment我很惊讶,当我得到错误的命令时,运行它们下sudo …..

我尝试了以下解决scheme,但没有成功:

  1. 使用“ sudo -E ”选项不起作用。 我现有的PATH仍然被sudo重置

  2. 在/ etc / sudoers中将“ Defaults env_reset ”更改为“ Defaults !env_reset ”也不起作用(即使与sudo -E结合使用)

  3. 在/ etc / sudoers中取消注释env_reset (例如“ #Defaults env_reset ”)也不起作用。

  4. 向/ etc / sudoers添加“ Defaults env_keep += "PATH" '也不起作用。

显然,尽pipe有人文档,sudo完全是关于PATH的硬编码,并且不允许保留用户PATH的灵活性。 非常讨厌,因为我不能使用sudo在root权限下运行非默认软件。

这似乎为我工作

 sudo -i 

它采取非sudo PATH

我认为sudo重置PATH实际上是可取的:否则攻击者破坏了你的用户帐户可能会在你的用户PATH上放置各种工具的备份版本,并且在使用sudo的时候会被执行。

(当然有sudo重置path不是这些types的问题的完整解决scheme,但它有帮助)

这确实是你使用时发生的事情

 Defaults env_reset 

在/ etc / sudoers中不使用exempt_groupenv_keep

这样做也很方便,因为您可以将仅对根用户有用的目录(如/sbin/usr/sbin )添加到sudopath中,而无需将其添加到用户path中。 要指定sudo使用的path:

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

现在使用来自业内存储库的sudo。 来自我的configuration的细节:

 root@sphinx:~# cat /etc/sudoers | grep -v -e '^$' -e '^#' Defaults env_reset Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/grub-1.96/sbin:/opt/grub-1.96/bin" root ALL=(ALL) ALL %admin ALL=(ALL) ALL root@sphinx:~# cat /etc/apt/sources.list deb http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe deb http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe deb http://security.ubuntu.com/ubuntu jaunty-security main restricted universe deb-src http://security.ubuntu.com/ubuntu jaunty-security main restricted universe deb http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe deb-src http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe deb http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe deb-src http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe deb http://security.ubuntu.com/ubuntu karmic-security main restricted universe deb-src http://security.ubuntu.com/ubuntu karmic-security main restricted universe root@sphinx:~# root@sphinx:~# cat /etc/apt/preferences Package: sudo Pin: release a=karmic-security Pin-Priority: 990 Package: sudo Pin: release a=karmic-updates Pin-Priority: 960 Package: sudo Pin: release a=karmic Pin-Priority: 930 Package: * Pin: release a=jaunty-security Pin-Priority: 900 Package: * Pin: release a=jaunty-updates Pin-Priority: 700 Package: * Pin: release a=jaunty Pin-Priority: 500 Package: * Pin: release a=karmic-security Pin-Priority: 450 Package: * Pin: release a=karmic-updates Pin-Priority: 250 Package: * Pin: release a=karmic Pin-Priority: 50 root@sphinx:~# apt-cache policy sudo sudo: Installed: 1.7.0-1ubuntu2 Candidate: 1.7.0-1ubuntu2 Package pin: 1.7.0-1ubuntu2 Version table: *** 1.7.0-1ubuntu2 930 50 http://au.archive.ubuntu.com karmic/main Packages 100 /var/lib/dpkg/status 1.6.9p17-1ubuntu3 930 500 http://au.archive.ubuntu.com jaunty/main Packages root@sphinx:~# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin root@sphinx:~# exit exit abolte@sphinx:~$ echo $PATH /home/abolte/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/chromium-17593:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/xpra-0.0.6/bin abolte@sphinx:~$ 

终于在不使用黑客的情况下解决这个问题真是太好了。

 # cat .bash_profile | grep PATH PATH=$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin export PATH # cat /etc/sudoers | grep Defaults Defaults requiretty Defaults env_reset Defaults env_keep = "SOME_PARAM1 SOME_PARAM2 ... PATH" 

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

只需在/etc/sudoers编辑env_keep

它看起来像这样:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE"

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

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE PATH"

closuresterminal,然后再打开。

Secure_path是你的朋友,但如果你想从secure_path免除你自己的事情

 sudo visudo

并追加

默认值exempt_group = your_goup

如果你想豁免一堆用户创build一个组,添加所有的用户,并使用它作为你的exempt_group。 男人5更多的sudoers。

在OpenSUSE发行版的评论中推荐的解决schemebuild议改变:

 Defaults env_reset 

至:

 Defaults !env_reset 

然后大概把下面这行不需要的行注释掉:

 Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE" 

注释掉/ etc / sudores文件中的“Default env_reset”和“Default secure_path …”都适用于我

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

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

呃,如果你不把东西添加到你的path,这不是一个真正的testing:

 bill @ bill-desktop:〜$ ls -l / opt / pkg / bin
共12个
 -rwxr-xr-x 1 root root 28 2009-01-22 18:58 foo
 bill @ bill-desktop:〜$ which foo
 /select/包装/斌/富
 bill @ bill-desktop:〜$ sudo su
根@ bill-desktop:/ home / bill#which foo
根@法案桌面:/首页/比尔# 

当通过ENV_SUPATH定义使用su或sudo时,PATH将被重置,而在/etc/login.defs中定义ENV_PATH

$ PATH是一个环境variables,这意味着$ PATH的值可以有不同的另一个用户。

当你login到你的系统时,你的configuration文件设置决定$ PATH的值。

现在,让我们看看: –

 User | Value of $PATH -------------------------- root /var/www user1 /var/www/user1 user2 /var/www/html/private 

假设这些是不同用户的$ PATH的值。 现在,当你用sudo执行任何命令时,实际上root用户执行该命令。

您可以通过在terminal上执行这些命令来进行确认: –

 user@localhost$ whoami username user@localhost$ sudo whoami root user@localhost$ 

这是原因。 我想对你很清楚。