Sudo изменяет PATH - почему?

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

От человека sudo:

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

Ответ 1

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

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

alias sudo='sudo env PATH=$PATH'

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

sudo su -p

Ответ 2

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

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

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

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

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

Ответ 3

PATH - это переменная среды, и по умолчанию она является reset 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 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}" 

Ответ 4

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


Ошибка Debian # 85123 ( "sudo: SECURE_PATH по-прежнему нельзя переопределить" ) (из 2001!)

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

Говорят, что в вашем файле 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 "[email protected]"

то ваш обычный sudo работает так же, как sudo без защищенного пути


Ошибка Ubuntu # 192651 ( "путь sudo всегда reset" )

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

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


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

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

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

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

  • Изменение "Defaults env_reset" до "Defaults !env_reset" в /etc/sudoers также не помогло (даже в сочетании с sudo -E)

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

  • Добавление 'Defaults env_keep += "PATH"' в /etc/sudoers также не помогло.

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

Ответ 5

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

sudo -i 

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

Ответ 6

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

(конечно, имея sudo reset, 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

Работает теперь с использованием sudo из кармических репозиториев. Детали из моей конфигурации:

[email protected]:~# 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
[email protected]:~# 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
[email protected]:~# 

[email protected]:~# 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
[email protected]:~# 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
[email protected]:~# 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
[email protected]:~# exit
exit
[email protected]:~$ 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
[email protected]:~$ 

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

sudo visudo

И добавьте

Defaults exempt_group=your_goup

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

Ответ 12

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

Ответ 13

закомментируйте оба "По умолчанию env_reset" и "Default secure_path..." в файле /etc/sudores для меня

Ответ 14

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

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

Ответ 16

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

Ответ 17

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

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

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

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

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

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

[email protected]$ whoami
username
[email protected]$ sudo whoami
root
[email protected]$ 

Вот почему. Я думаю, что это ясно для вас.