Як зробити так, щоб `sudo` зберігав $ PATH?


123

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

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

тоді я можу спробувати запустити команду просто добре (за винятком того, що вона не спрацьовує, тому що їй потрібен 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, до речі. Потрібна заздрість
Хакан Баба

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 для таких типів випадків, де: псевдонім psudo = "sudo env \" PATH = $ PATH \ "". Тоді моє звичайне використання судо не впливає.
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на поведінку з / п / т 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

Можливо, не саме те, що вимагає ОП, але це може допомогти:

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.