Почему sudo меняет путь? - PullRequest
278 голосов
/ 03 ноября 2008

Это переменная PATH без sudo:

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

Это переменная PATH с 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).

ОБНОВЛЕНИЕ: насколько я вижу, ни один из сценариев никоим образом не запускался с корневым изменением PATH.

С man sudo:

Чтобы предотвратить подделку команд, sudo проверяет ``. '' и `` '' (оба обозначают текущий каталог) последний при поиске для команды в ПУТИ пользователя (если один или оба в ПУТИ). Примечание, однако, что фактический ПУТЬ переменная окружения не изменена и передается без изменений в программу это sudo выполняется.

Ответы [ 17 ]

232 голосов
/ 03 ноября 2008

Это раздражающая функция функция sudo во многих дистрибутивах.

Чтобы обойти эту «проблему» в Ubuntu, я делаю следующее в моем ~ / .bashrc

alias sudo='sudo env PATH=$PATH'

Обратите внимание, что вышесказанное будет работать для команд, которые сами не сбрасывают $ PATH. Однако `su 'сбрасывает это $ PATH, поэтому вы должны использовать -p, чтобы запретить. I.E.:

sudo su -p
117 голосов
/ 31 декабря 2010

В случае, если кто-то еще сталкивается с этим и хочет просто отключить изменение всех путей для всех пользователей. Откройте файл sudoers с помощью команды: visudo. Вы должны увидеть где-то следующую строку:

По умолчанию env_reset

, который вы должны добавить следующее в следующей строке

По умолчанию! Secure_path

secure_path включен по умолчанию. Эта опция указывает, что делать $ PATH при sudoing. Восклицательный знак отключает эту функцию.

32 голосов
/ 03 ноября 2008

PATH - это переменная окружения, которая по умолчанию сбрасывается с помощью sudo.

Вам нужны специальные разрешения, чтобы иметь возможность делать это.

С man sudo

       -E  The <b>-E</b> (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 <b>VAR</b>=value, e.g.
       <b>LD_LIBRARY_PATH</b>=/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}" 
17 голосов
/ 17 декабря 2008

Похоже, эта ошибка существовала довольно давно! Вот некоторые ссылки на ошибки, которые вы можете найти полезными (и, возможно, захотите подписаться на / голосовать, подсказка, подсказка ...):


Ошибка Debian # 85123 («sudo: SECURE_PATH все еще нельзя переопределить») (с 2001 года!)

Кажется, что ошибка # 20996 все еще присутствует в этой версии sudo. История изменений говорит, что это может быть переопределено во время выполнения, но я еще не открыл как.

Они упоминают, что поместили что-то подобное в ваш файл sudoers:

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

но когда я делаю это по крайней мере в Ubuntu 8.10, это выдает мне эту ошибку:

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

Ошибка Ubuntu # 50797 («sudo, созданный с помощью --with-secure-path проблематичен»)

Хуже того, насколько я могу судить, это невозможно повторно указать secure_path в файле 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 без безопасного пути


Ошибка Ubuntu # 192651 («путь sudo всегда сбрасывается»)

Учитывая, что дубликат этой ошибки был Первоначально подал в июле 2006 года, я не ясно, как долго неэффективный env_keep был в эксплуатации. Безотносительно Преимущества принуждения пользователей к трудоустройству трюки, подобные перечисленным выше, конечно, справочные страницы для sudo и sudoers должны отражать тот факт, что варианты для изменения пути эффективно резервируется.

Изменение документации для отражения фактическое исполнение не дестабилизирует и очень полезно.


Ошибка Ubuntu # 226595 («невозможно сохранить / указать путь»)

Мне нужно иметь возможность запускать sudo с дополнительные не стандартные двоичные папки в путь. Уже добавив мой требования к / etc / environment я был удивился, когда я получил ошибки о пропущенные команды при запуске под судо .....

Я пытался исправить это без успеха:

  1. Использование опции "sudo -E" - не сработало. Мой существующий PATH все еще сбрасывался с помощью sudo

  2. Изменение "Defaults env_reset" на "Defaults !env_reset" в / etc / sudoers - также не работает (даже в сочетании с sudo -E)

  3. Раскомментирование env_reset (например, "#Defaults env_reset") в / etc / sudoers - также не работает.

  4. Добавление 'Defaults env_keep += "PATH"' в / etc / sudoers - также не работает.

Понятно - несмотря на мужчину документация - sudo полностью жестко закодированы относительно PATH и не разрешить любую гибкость в отношении сохраняя пользователей PATH. Очень раздражает, поскольку я не могу запустить не по умолчанию Программное обеспечение с правами root с использованием Судо.

13 голосов
/ 21 февраля 2012

Мне показалось, что это работает

sudo -i 

, который принимает не sudo PATH

11 голосов
/ 09 декабря 2011

Я думаю, что на самом деле желательно, чтобы sudo сбрасывал PATH: в противном случае злоумышленник, взломавший вашу учетную запись, мог бы поместить версии всех видов инструментов с резервным копированием в PATH ваших пользователей, и они будут выполняться при использовании sudo.

(конечно, сброс sudo в PATH не является полным решением проблем такого рода, но это помогает)

Это действительно то, что происходит, когда вы используете

Defaults env_reset

в / etc / sudoers без использования exempt_group или env_keep.

Это также удобно, поскольку вы можете добавлять каталоги, которые полезны только для пользователя root (например, /sbin и /usr/sbin), в путь sudo, не добавляя их в пути ваших пользователей. Чтобы указать путь, который будет использоваться sudo:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin"
7 голосов
/ 02 июля 2009

Работает теперь, используя 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:~$ 

Замечательно, что наконец-то это решено без использования хака.

4 голосов
/ 16 декабря 2009
# 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"
3 голосов
/ 09 августа 2011

Просто отредактируйте env_keep в /etc/sudoers

Это выглядит примерно так:

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"

Закройте терминал, а затем снова откройте.

3 голосов
/ 19 марта 2010

Просто закомментируйте «значения по умолчанию env_reset» в / etc / sudoers

...