Как заставить `sudo` сохранить $ PATH?


123

Мне нужно запустить программу, установленную в / opt / godi / sbin (пользовательский каталог). Если я добавлю этот каталог в мой путь, добавив следующую строку в мой файл .bashrc

export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

тогда я могу попытаться выполнить команду просто отлично (за исключением того, что она терпит неудачу, потому что она нуждается в sudo). Однако, когда я пытаюсь использовать sudo:

sudo godi_console

Я получаю следующую ошибку

sudo: godi_console: command not found

Проверка переменной PATH после использования sudo показывает, что она не включает ту же переменную PATH, что и у обычного пользователя:

$ sudo sh
# echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Почему ПУТЬ не то же самое? Я делаю что-то неправильно? Я работаю в Debian Jessie и, к сожалению, я не могу обойти эту проблему, передав sudo абсолютную ссылку на godi_console, потому что сама godi_console также зависит от правильной установки PATH.


2
Попробуй sudo -E godi_console. -Eозначает «сохранить окружающую среду».
D_Bye

5
@D_Bye, это не будет работать, если secure_pathи / или env_reset сконфигурированы, как это имеет место во многих sudoразвертываниях, как в Debian.
Стефан Шазелас

@StephaneChazelas Спасибо за информацию - я не пользуюсь Debian, поэтому, возможно, мне следовало просто помолчать!
D_Bye


Связанный вопрос, о suнет sudo, является unix.stackexchange.com/questions/460478 .
JdeBP

Ответы:


149

Вы всегда можете сделать:

sudo env "PATH=$PATH" godi_console

В качестве меры безопасности на Debian, /etc/sudoersимеет secure_pathопцию установить безопасное значение.

Обратите внимание, что:

sudo "PATH=$PATH" godi_console

Где sudoтрактует ведущие аргументы, содержащие =символы, как присваивания переменных среды, также будет работать при работе godi_consoleс вашим $PATH (в отличие от secure_path) в его среде, но не повлияет sudoна путь поиска исполняемого файла, поэтому не поможет sudoв его поиске godi_console.


5
Мне больше нравится этот ответ, так как он позволяет избежать необходимости изменять настройки глобально (т.е. сохраняет принцип наименьших привилегий)
Алоис Махдал

5
sudo "PATH=$PATH" godi_console не работал в CentOs7 кстати. Нужен env
Хакан Баба

1
@ StéphaneChazelas Когда- sudo "PATH=$PATH" godi_consoleнибудь действительно работает? sudoпринимает VAR=valueаргументы, влияющие на среду запускаемой команды, но в отличие от envили bash, sudoпохоже, не позволяет этому влиять на то, как выглядит команда. Я только что протестировал это (недавно) на Ubuntu 16.04. Но я попытался добавить эту exempt_groupопцию в sudoers(просто для тестирования - я не считаю это решением!), И результаты оказались поразительными. Команды форм PATH="$PATH" sudo some-commandначали работать, но те формы до sudo PATH="$PATH" some-command сих пор не сделали.
Элия ​​Каган

2
@ballsatballsdotballs. Поскольку этот псевдоним должен влиять только на ваши интерактивные оболочки, он должен быть относительно безвредным.
Стефан Шазелас

2
Я просто создаю псевдоним psudo для этих типов случаев, где: alias psudo = "sudo env \" PATH = $ PATH \ "". Тогда мое нормальное использование sudo не затронуто.
mikeTronix

46

Вы также можете установить PATH по умолчанию в /etc/sudoers

отредактируйте файл используя visudo

и обновите строку так, как вы хотите: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin


18

SUDO выполняет сброс переменных env по умолчанию.

Ознакомьтесь с его руководством и опцией env_reset.

Вам просто нужно отключить его в / etc / sudoers.


5
Здорово! В Ubuntu вы можете видеть и комментировать строки secure_path и env_reset. Делает систему значительно менее безопасной, так что будьте осторожны.
RawwrBag

Отключение, env_resetпохоже, не влияет sudoна поведение w / r / t PATH.
Занна

5

Это работает :

sudo $(which your_command)

Пример вызова моего gpsскрипта, в котором перечислены процессы графического процессора Nvidia:

$ sudo gps
sudo: gps: command not found
$ sudo $(which gps)
  PID TTY          TIME CMD
 9922 tty7     02:42:47 Xorg

Пояснение:

$ set -x;sudo $(which gps);set +x
++ which gps
+ sudo /home/xyztuv/myScripts/shl/gps
  PID TTY          TIME CMD
 9922 tty7     02:42:39 Xorg
+ set +x

3
sudo --preserve-env=PATH env [command]

это ovverrides secure_path на моем конце


1

Это сработало:

sudo "PATH=$PATH" [your command]

Не меняйте $ PATH со своим значением пути, вы просто пишете это так

пример: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....


0

Может быть, не совсем то, что запрашивает OP, но это может помочь:

sudo -u the_user PATH=$PATH:/opt/godi/bin sh -c 'echo $PATH'

Это изменяет PATH внутри команды sudoed.

Редактировать: я не уверен, что я имел в виду под этим, так как вышесказанное в значительной степени глупость. Вместо этого используйте следующее:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.