Почему 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:

To prevent command spoofing, sudo checks ``.'' and ``'' (both denoting current directory) last when searching for a command in the user's PATH (if one or both are in the PATH). Note, however, that the actual PATH environment variable is not modified and is passed unchanged to the program that sudo executes.

Есть ли у root что-нибудь, что устанавливает PATH в .bashrc? Предполагается, что, поскольку вы работаете в Linux, sh на самом деле является bash.

Greg Hewgill 03.11.2008 03:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
291
2
142 561
17

Ответы 17

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

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

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

alias sudo='sudo env PATH=$PATH'

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

sudo su -p

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

Chris Jester-Young 18.05.2009 20:10

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

Brian Armstrong 20.06.2009 06:24

Я запутался. Крис, вы имеете в виду, что "это заставляет вас написать полный путь к программе, которая является внутри the $ PATH"? Или вы имеете в виду "... это за пределами пути по умолчанию / безопасного $ PATH"?

Jason R. Coombs 27.03.2010 03:19

Это не только нелогично, но и неправильно задокументировано. Читая справочные страницы для sudo и сравнивая конфигурацию с ящиком Fedora, я подумал, что путь следует сохранить. Действительно, sudo -V даже говорит: «Сохраняемые переменные среды: PATH».

Jason R. Coombs 27.03.2010 03:20

Этот ответ больше не работает (ubuntu 9.10, кармическая коала). Пожалуйста обновите!

Delirium tremens 27.04.2010 01:17

@ Джейсон: Последний. (Извините, меня не предупредили о вашем ответе, вероятно, потому, что он не начинался с «@Chris»; я знал об этом только потому, что эта ветка упоминалась в чате в последнее время.)

Chris Jester-Young 03.03.2011 20:39

Обратите внимание, что этот псевдоним может испортить некоторые вещи, например "sudo -s"

tvon 29.02.2012 20:40

это раздражает. период. если бы он мог «сделать вас троянцем» с помощью sudo, он мог бы сделать вас троянцем и без него. Конечно, сложнее, но если вы запускаете код из неправильного места даже со своим обычным пользователем, то все уже достаточно плохо.

gcb 14.03.2012 00:53

@ JasonR.Coombs: да, рекламная документация раздражает. вот почему я уважаю openBSD за то, что она относится к документации как к коду. это было бы ошибкой блокировки. на убунту ...

gcb 14.03.2012 00:54

Не используйте псевдоним sudo; см. ответ от @Jacob о значениях по умолчанию env_reset.

greg_1_anderson 19.08.2012 22:35

Этот псевдоним использует замену переменной без кавычек, которая выполняется от имени пользователя root. (это также вызывает два ненужных fork / execs при каждой команде, которую вы запускаете с ним). Даже если безопасность не так важна для вашего компьютера, это просто кажется мне злом. Посмотрите решение, используя! Secure_path и env_keep.

dataless 28.09.2014 01:42

Почему за него проголосовали # 1? Этот ответ не отвечает на вопрос OP относительно Почему sudo изменяет путь и предоставляет сомнительное «решение» без объяснения потенциальных недостатков! Полезность этой функции основана на мнении, и читатель должен решить, учитывая объективный список плюсов и минусов.

cdgraham 06.03.2019 19:09

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


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

It seems that Bug#20996 is still present in this version of sudo. The changelog says that it can be overridden at runtime but I haven't yet discovered how.

Они упоминают, что в вашем файле 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, проблематичен")

Worse still, as far as I can tell, it is impossible to respecify secure_path in the sudoers file. So if, for example, you want to offer your users easy access to something under /opt, you must recompile sudo.


Yes. There needs to be a way to override this "feature" without having to recompile. Nothing worse then security bigots telling you what's best for your environment and then not giving you a way to turn it off.


This is really annoying. It might be wise to keep current behavior by default for security reasons, but there should be a way of overriding it other than recompiling from source code! Many people ARE in need of PATH inheritance. I wonder why no maintainers look into it, which seems easy to come up with an acceptable solution.


I worked around it like this:

mv /usr/bin/sudo /usr/bin/sudo.orig

then create a file /usr/bin/sudo containing the following:

#!/bin/bash
/usr/bin/sudo.orig env PATH=$PATH "$@"

then your regular sudo works just like the non secure-path sudo


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

Given that a duplicate of this bug was originally filed in July 2006, I'm not clear how long an ineffectual env_keep has been in operation. Whatever the merits of forcing users to employ tricks such as that listed above, surely the man pages for sudo and sudoers should reflect the fact that options to modify the PATH are effectively redundant.

Modifying documentation to reflect actual execution is non destabilising and very helpful.


Ошибка Ubuntu № 226595 («невозможно сохранить / указать ПУТЬ»)

I need to be able to run sudo with additional non-std binary folders in the PATH. Having already added my requirements to /etc/environment I was surprised when I got errors about missing commands when running them under sudo.....

I tried the following to fix this without sucess:

  1. Using the "sudo -E" option - did not work. My existing PATH was still reset by sudo

  2. Changing "Defaults env_reset" to "Defaults !env_reset" in /etc/sudoers -- also did not work (even when combined with sudo -E)

  3. Uncommenting env_reset (e.g. "#Defaults env_reset") in /etc/sudoers -- also did not work.

  4. Adding 'Defaults env_keep += "PATH"' to /etc/sudoers -- also did not work.

Clearly - despite the man documentation - sudo is completely hardcoded regarding PATH and does not allow any flexibility regarding retaining the users PATH. Very annoying as I can't run non-default software under root permissions using sudo.

Эээ, это не совсем тест, если вы ничего не добавляете к своему пути:

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# 

Теперь работает с использованием 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:~$ 

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

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

Jason R. Coombs 27.03.2010 03:40
# 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"

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

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

sudo visudo

И добавить

Defaults exempt_group=your_goup

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

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

Defaults env_reset

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

Defaults !secure_path

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

другой способ: Defaults env_keep = "PATH"

gcb 14.03.2012 01:01

По умолчанию! Secure_path отлично работал в современных системах; на старом компьютере с Ubuntu 8.04 значение по умолчанию env_keep = "PATH" помогло.

greg_1_anderson 19.08.2012 22:34

Вместо отключения secure_path вы можете добавить к нему. Например, в моем случае я добавил строку «Defaults secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / some / custom / directory», где «some / custom / directory» - это путь, который мне нужен сделать доступным для sudo.

Hector Correa 15.10.2012 21:25

Решение @HectorCorrea - лучший способ ИМО.

chakrit 07.04.2013 11:27

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

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

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

Подождите, PATH нужно 2 **? Зачем PATH нужен **?

CMCDragonkai 18.05.2014 10:20

@CMCDragonkai Он был отформатирован полужирным шрифтом (в уценке), но кто-то (переполнение стека не позволяет мне указывать пальцем) отредактировал его, чтобы пометить как код.

1j01 12.05.2015 22:28

Я думаю, что на самом деле желательно, чтобы sudo сбрасывал PATH: в противном случае злоумышленник, скомпрометировавший вашу учетную запись пользователя, может поместить бэкдор-версии всех видов инструментов в 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"

злоумышленник, получивший доступ к учетной записи sudoer, может сделать еще худшие вещи.

user508546 21.03.2012 00:55

Достойный совет. На сервере ubuntu 12.04 аналогичный параметр установлен по умолчанию.

Tsutomu 07.07.2012 06:34

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

sudo -i 

который берет на себя не-sudo PATH

sudo -i не помогает в Ubuntu (я проверял Ubuntu 14.04.3 LTS). $ PATH все еще изменен sudo.

Marcin Raczyński 26.02.2016 12:26

закомментировать как "Default env_reset", так и "Defaults secure_path ..." в файле / etc / sudoers работает для меня

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по теме