Почему sudo меняет путь?

Это 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).

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

От man sudo:

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

18 ответов

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

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

alias sudo='sudo env PATH=$PATH'

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

sudo su -p

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

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

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

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

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

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

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

От man sudo

       -E Опция -E (сохранить среду) переопределит env_reset
           вариант в sudoers(5)). Доступно только когда
           Команда ing имеет тег SETENV или опция setenv установлена ​​в sudo-
           ERS (5).
       Переменные среды, которые должны быть установлены для команды, также могут быть переданы
       командная строка в виде VAR= значение, например
       LD_LIBRARY_PATH= / usr / local / pkg / lib. Переменные, передаваемые по команде
       На линии распространяются те же ограничения, что и на обычную
       в состоянии с одним важным исключением. Если опция setenv установлена ​​в
       sudoers, команда для запуска имеет установленный тег SETENV или команду
       matched равно ALL, пользователь может устанавливать переменные, которые чрезмерно
       велено. Смотрите 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

Обновить

man 5 sudoers: 

     env_reset Если установлено, sudo будет сбрасывать среду, чтобы она содержала только переменные LOGNAME, SHELL, USER, USERNAME и SUDO_*. Затем добавляются все переменные в среде вызывающего, которые соответствуют спискам env_keep и env_check. Содержимое по умолчанию списков env_keep и env_check отображается, когда sudo запускается пользователем root с параметром -V. Если sudo был скомпилирован с параметром SECURE_PATH, его значение будет использоваться для переменной среды PATH. Этот флаг включен по умолчанию.

Поэтому, возможно, нужно проверить, что это / не скомпилировано в.

По умолчанию в 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}" 

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


Ошибка 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.


Да. Должен быть способ переопределить эту "функцию" без перекомпиляции. Нет ничего хуже, чем фанаты безопасности, которые говорят вам, что лучше для вашей среды, а затем не дают вам способа отключить их.


Это действительно раздражает. Возможно, было бы разумно сохранить текущее поведение по умолчанию из соображений безопасности, но должен быть способ переопределить его, кроме перекомпиляции из исходного кода! Многие люди нуждаются в наследовании PATH. Я удивляюсь, почему никакие сопровождающие не смотрят на это, и кажется, что легко найти приемлемое решение.


Я работал вокруг этого так:

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 должны отражать тот факт, что опции для изменения PATH фактически избыточны.

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


Ubuntu bug # 226595 ("невозможно сохранить / указать путь")

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

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

  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 - тоже не сработало.

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

Казалось, это работает для меня

sudo -i 

который берет на себя не судо PATH

Я думаю, что на самом деле желательно, чтобы 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"

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

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

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

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

Просто отредактируйте 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"

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

Secure_path - ваш друг, но если вы хотите освободить себя от secure_path, просто сделайте

sudo visudo

И добавить

По умолчанию exempt_group = your_goup

Если вы хотите освободить группу пользователей от создания группы, добавьте в нее всех пользователей и используйте ее в качестве группы exempt_group. человек 5 sudoers для большего.

Вы также можете переместить ваш файл в каталог sudoers:

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

Закомментируйте оба "Default env_reset" и "Default secure_path ..." в файле /etc/sudores.

Рекомендуемое решение в комментариях к дистрибутиву 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"

Это может показаться нелогичным, но в первый раз, когда это случилось со мной, я знал, что происходит. Поверьте мне, вы не хотите, чтобы root запускал чужой PATH

"Эй, корень? Можете ли вы помочь мне, что-то не так", и он приходит и sudo из моей оболочки, и я написал сценарий оболочки "${HOME}/bin/ls", который сначала дает мне привилегии суперпользователя, а затем вызывает реальный /бин/л.с.

личный лс

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

Небольшой пользователь root делает «sudo ls» из моей оболочки, он закончил, и коробка широко открыта для меня.

PATH будет сброшен при использовании su или sudo по определению ENV_SUPATH и ENV_PATH, определенных в /etc/login.defs

$PATH - это переменная среды, и это означает, что значение $PATH может отличаться для других пользователей.

Когда вы входите в свою систему, настройки вашего профиля определяют значение $PATH.

Теперь давайте посмотрим:-

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

Предположим, что это значения $PATH для другого пользователя. Теперь, когда вы выполняете любую команду с помощью sudo, в действительности пользователь root выполняет эту команду.

Вы можете подтвердить, выполнив эти команды на терминале:-

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

Это причина. Я думаю, это ясно для вас.

Э-э, это не совсем тест, если вы не добавили что-то на свой путь:

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
/ Опт / упак / bin / Foo
bill@bill-desktop:~$ sudo su
root@bill-desktop:/home/bill# which foo
корень @ счета-рабочий стол: / Главная / банкнота # 
Другие вопросы по тегам