Path 为什么sudo会改变路径?
这是不带sudo的Path 为什么sudo会改变路径?,path,environment-variables,sudo,Path,Environment Variables,Sudo,这是不带sudo的路径变量: $ echo 'echo $PATH' | sh /opt/local/ruby/bin:/usr/bin:/bin 这是sudo的路径变量: $ 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上) 更新
路径
变量:
$ echo 'echo $PATH' | sh
/opt/local/ruby/bin:/usr/bin:/bin
这是sudo的路径
变量:
$ 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上)
更新:据我所知,没有一个脚本是以root changePATH
的形式启动的
从mansudo
:
为了防止命令欺骗,sudo
选中“`..”和“`”(都表示
当前目录)搜索时的最后一个目录
对于用户路径中的命令(如果
一个或两个在路径中)注意,
然而,这是实际的路径
未修改环境变量
并且会原封不动地传递给程序
sudo执行的操作。
PATH
是一个环境变量,因此默认情况下由sudo重置
您需要特殊权限才能允许执行此操作
从mansudo
-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).
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
更新
这是一个恼人的函数,这是许多发行版上sudo的一个特性
为了在ubuntu上解决这个“问题”,我做了
我的~/.bashrc中有以下内容
alias sudo='sudo env PATH=$PATH'
注意:上面的内容适用于不重置$PATH本身的命令。
但是'su'将其重置为$PATH,因此您必须使用-p来告诉它不要这样做。即:
sudo su -p
看起来这个bug已经存在了很长时间了!以下是一些您可能会觉得有用的bug参考(并且可能希望订阅/投票,提示,提示…)
这个版本的sudo似乎仍然存在Bug#20996。这个 changelog说它可以在运行时被重写,但我还没有 发现了如何 他们提到在你的sudoers文件中放入类似的内容:
Defaults secure_path="/bin:/usr/bin:/usr/local/bin"
但当我至少在Ubuntu 8.10中这样做时,它给了我这个错误:
visudo: unknown defaults entry `secure_path' referenced near line 10
更糟糕的是,据我所知,它 无法重新指定安全路径 在sudoers文件中。因此,如果 例如,您希望向您的用户提供 轻松访问/opt下的内容, 你必须重新编译sudo
对。需要有一种方法来解决这个问题 覆盖此“功能”,而无需 重新编译。没有比这更糟的了 安全偏执狂告诉你发生了什么 最适合您的环境,而不是 给你一个关闭它的方法
这真让人讨厌。可能是 明智的做法是通过 出于安全原因而默认,但是 应该有一种方法来覆盖它 而不是从源代码重新编译 密码!许多人需要一条路 遗产我想知道为什么没有 维护人员对此进行了调查,似乎 容易想出一个可以接受的方案 解决方案
我是这样处理的:
mv /usr/bin/sudo /usr/bin/sudo.orig
然后创建一个文件/usr/bin/sudo,其中包含以下内容:
#!/bin/bash
/usr/bin/sudo.orig env PATH=$PATH "$@"
然后,您的常规sudo就像非安全路径sudo一样工作
考虑到这个bug的一个副本 最初是在2006年7月提交的,我不是 清楚无效的环境保持多长时间 已经开始运作了。不管怎样 强制用户使用的优点 像上面列出的那些把戏, 当然,sudo和 sudoers应该反映这样一个事实: 修改路径的选项包括 实际上是多余的 修改文档以反映 实际执行不会破坏稳定 而且非常有用
我需要能和你一起跑sudo 中的其他非std二进制文件夹 这条路。已经添加了我的 对/etc/environment I的要求 当我在这件事上出错时,我很惊讶 运行命令时缺少命令 在sudo之下 我尝试了以下方法来修复此问题 没有成功:
sudo-E
”选项无效。我的现有路径仍然被sudo重置Defaults env_reset
”更改为“Defaults!env_reset
”——也不起作用(即使与sudo-E组合使用时)env_reset
(例如“”Defaults env_reset
”)也不起作用Defaults env_keep+=”PATH“
”——也不起作用呃,如果你不在你的路径上添加一些东西,那就不是真正的测试: 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# bill@bill-桌面:~$ls-l/opt/pkg/bin 总数12 -rwxr-xr-x 1根根目录28 2009-01-22 18:58 foo bill@bill-桌面:~$which foo /opt/pkg/bin/foo bill@bill-桌面:~$sudo su root@bill-桌面:/home/bill#哪个foo root@bill-桌面:/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:~$
在不使用黑客的情况下最终解决了这个问题,这真是太好了。只需在/etc/sudoers中注释掉“Defaults env_reset”安全路径是您的朋友,但如果您想免除自己的安全路径,只需这样做即可
# 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"
sudo visudo
sudovisudo
并附加
Defaults exempt_group=your_goup
默认值组=您的组
如果要豁免一组用户创建一个组,请将所有用户添加到该组中,并将其用作豁免组。man 5 sudoers获取更多信息。以防其他人运行此操作,并且只想禁用所有用户的所有路径变量更改。
使用命令访问sudoers文件:
visudo
。您应该在某处看到以下行:
默认环境重置
您应该在下一行添加以下内容
默认值!安全路径
默认情况下启用安全路径。此选项指定执行sudo时生成$PATH的内容。感叹号将禁用该功能。
# 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"
sudo visudo
Defaults exempt_group=your_goup
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"
Defaults env_reset
Defaults secure_path="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin"
sudo -i
sudo mv $HOME/bash/script.sh /usr/sbin/
User | Value of $PATH
--------------------------
root /var/www
user1 /var/www/user1
user2 /var/www/html/private
user@localhost$ whoami
username
user@localhost$ sudo whoami
root
user@localhost$