Это переменная 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 выполняется.
Это раздражающая функция особенность 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
- это переменная среды, и по умолчанию она является 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}"
Похоже, эта ошибка существует довольно давно! Вот некоторые ссылки на ошибки, которые могут оказаться полезными (и могут захотеть подписаться на голосование, подсказку, подсказку...):
Ошибка 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 "$@"
то ваш обычный 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, используя Судо.
Казалось, это сработало для меня
sudo -i
который принимает не-sudo PATH
Я думаю, что на самом деле желательно иметь 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"
Работает теперь с использованием 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:~$
Замечательно, наконец, решить эту проблему без использования взлома.
# 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"
Закройте терминал, а затем снова откройте.
Просто закомментируйте "По умолчанию env_reset" в/etc/sudoers
Secure_path - ваш друг, но если вы хотите освободить себя от secure_path, просто выполните
sudo visudo
И добавьте
Defaults exempt_group=your_goup
Если вы хотите освободить группу пользователей, создайте группу, добавьте к ней всех пользователей и используйте это как свою исключенную группу. man 5 sudoers для больше.
Вы также можете переместить свой файл в каталог, используемый sudoers:
sudo mv $HOME/bash/script.sh /usr/sbin/
закомментируйте оба "По умолчанию 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"
$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$
Вот почему. Я думаю, что это ясно для вас.
PATH будет reset при использовании su или sudo по определению ENV_SUPATH и ENV_PATH, определенному в/etc/login.defs
Er, это не действительно тест, если вы не добавляете что-то на свой путь:
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#