为什么sudo更改PATH?

这是没有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。

. bb0
149812 次浏览

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

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

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

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

看起来这个bug已经存在很长一段时间了!以下是一些你可能会觉得有用的bug参考(可能会想订阅/投票,提示,提示…)


Debian bug #85123 ("sudo: SECURE_PATH still can't be overridden") (from 2001!)

看起来Bug#20996在这个版本的sudo中仍然存在。的 changelog说它可以在运行时被覆盖,但我还没有 发现如何。< / p >

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

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

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

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

Ubuntu bug #50797 ("sudo built with——with-secure-path is problem ")

更糟的是,据我所知,它 无法重新指定secure_path 在sudoers文件里。如果,对于 例如,您希望为用户提供的服务 轻松访问/opt下的内容, 你必须重新编译sudo.

.

.
< p >是的。There 需要 to be a way to 重写这个“特性”而不需要 重新编译。没有比这更糟糕的了 安全偏执者告诉你什么是 对你的环境最好,然后不是 给你一个关闭它的方法。


这真的很烦人。可能是 明智的做法是保持当前的行为 出于安全原因默认,但是 应该有办法推翻它 除了从源代码重新编译 代码!很多人都需要PATH 继承。我想知道为什么不是 维护者似乎在研究它 很容易想出一个可以接受的 解决方案。< / p >

我是这样做的:

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

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

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

那么您的常规sudo就像非安全路径sudo一样工作


Ubuntu bug #192651 ("sudo path is always reset"

给定此错误的副本为 最初是在2006年7月提交的,我不是 清楚一个无效的env_keep多长时间 一直在运作。无论 强迫用户使用的优点 如上所列的技巧, 当然是sudo的手册页 Sudoers应该反映这一事实 修改路径的选项为 有效的冗余。< / p >

修改文档以反映 实际执行不会破坏稳定


Ubuntu bug #226595 ("impossible to retain/specify PATH") .

我需要能够运行sudo 附加的非std二进制文件夹 的路径。已经添加了我的 要求/etc/environment我 当我出现错误时感到惊讶 运行命令时缺少命令 在sudo…< / p >

我尝试以下来解决这个问题 Without success:

.输出说明
  1. 使用“sudo -E”选项-没有工作。我现有的PATH仍然被sudo重置

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

  3. 取消注释env_reset(例如:/etc/sudoers中的"#Defaults env_reset")也不能工作。

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

很明显,尽管是男人 文档- sudo是完全的 硬编码关于PATH,而不是 在以下方面允许任何灵活性 保留用户的PATH。非常 讨厌的是我不能运行非默认 在root权限下使用的软件 sudo . < / p >

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

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#

工作现在使用sudo从业力库。我的配置细节:

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”即可

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

sudo visudo

和附加

Defaults exempt_group=your_goup

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

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

违约env_reset

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

违约! secure_path

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

OpenSUSE发行版评论中的推荐解决方案建议更改:

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/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"

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

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

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

这确实是当你使用

Defaults env_reset

在/etc/sudoers中不使用exempt_groupenv_keep

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

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

这似乎对我很管用

sudo -i

它采用非sudo PATH

注释掉/etc/sudores文件中的“Default env_reset”和“Default secure_path…

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

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

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

美元的路径是一个环境变量,这意味着其他用户的美元的路径值可能不同。

当你登录到你的系统时,你的配置文件设置决定美元的路径的值。

现在,让我们来看看:-

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

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

可以在终端上执行以下命令确认:—

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

这就是原因。我想你很清楚了。

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

“嘿,根?你能帮帮我吗?有点不对劲。他走过来,sudo从我的壳里出来,我写了一个&;${HOME}/bin/ls"Shell脚本,首先给我超级用户权限,然后调用真正的/bin/ls.

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

分钟根用户执行“sudo ls"从我的壳里,他完成了,盒子向我敞开。