Path 为什么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上) 更新

这是不带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上)

更新:据我所知,没有一个脚本是以root change
PATH
的形式启动的

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重置

  • 将/etc/sudoers中的“
    Defaults env_reset
    ”更改为“
    Defaults!env_reset
    ”——也不起作用(即使与sudo-E组合使用时)

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

  • 向/etc/sudoers添加“
    Defaults env_keep+=”PATH“
    ”——也不起作用

  • 很明显,尽管这个男人 文档-sudo完全是 关于路径的硬编码,不存在 允许在以下方面有任何灵活性: 保留用户路径。非常 恼人的是,我不能运行非默认值 使用根权限下的软件 苏多


    呃,如果你不在你的路径上添加一些东西,那就不是真正的测试:

    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$