Почему 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.....
Я попытался следующее, чтобы исправить это без успеха:
С использованием "
sudo -E
"опция - не сработала. Моя существующая переменная PATH все еще сбрасывалась с помощью sudoМеняется
Defaults env_reset
"до"Defaults !env_reset
"в / etc / sudoers - также не работает (даже в сочетании с sudo -E)раскомментировав
env_reset
(например, "#Defaults env_reset
") в / etc / sudoers - тоже не сработало.Добавление '
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 корень @ счета-рабочий стол: / Главная / банкнота #