Как заставить `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.

hugomg
источник
2
Попробуй sudo -E godi_console. -Eозначает «сохранить окружающую среду».
D_Bye
5
@D_Bye, это не будет работать, если secure_pathи / или env_reset сконфигурированы, как это имеет место во многих sudoразвертываниях, как в Debian.
Стефан Шазелас
@StephaneChazelas Спасибо за информацию - я не пользуюсь Debian, поэтому, возможно, мне следовало просто помолчать!
D_Bye
stackoverflow.com/questions/257616/sudo-changes-path-why
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
Связанный вопрос, о 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

michaelbn
источник
18

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

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

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

KWubbufetowicz
источник
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
SebMa
источник
3
sudo --preserve-env=PATH env [command]

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

untore
источник
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'
phil294
источник