Як змусити судо зберегти змінні середовища?


47

Використовуючи sudo 1.7.4p4 на Solaris 5.10 та sudo 1.6.7p5 на RHEL4 u6, я не можу зрозуміти, як зберегти змінні середовища, наприклад $ PYTHONPATH. Я додав цей рядок до судерів, але це не має ніякого значення:

Defaults !env_reset

Я щось роблю не так, або установка sudo просто не поважає прапор env_reset?

Редагувати: Принаймні, на Solaris ми з’ясували, що ця проблема залежить від оболонки! Стандартною кореневою оболонкою є Bourne, якщо sudo bashз іншого боку ми запускаємо bash під sudo ( ),! Env_preset збереже довкілля (включаючи PATH та LD_LIBRARY_PATH). Це я маю сказати досить заплутану поведінку.


Відповіді:


44

Використовуйте обережно, є проблеми безпеки із sudo та змінними.

З man sudoersя виявив, що ви повинні використовувати

За замовчуванням env_reset
За замовчуванням env_keep + = "PYTHONPATH OTHERVARIABLE YETANOTHER"

У Ubuntu sudoдійсно зберігає деякі змінні. sudo -iбільше схожий на вхід як root, а потім запуск команди. Обидва можуть бути незручними, коли перший sudo nano myfileзалишає файли, що належать root, всередині вашого будинку, а останній sudo -i nano myfileнамагатиметься відкрити / root / myfile.


Біжи

sudo printenv PATH

і подивіться, що це дає. Ось це дає

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

наприклад. Тепер запустіть sudo visudoі додайте рядок

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

замінюючи тим, що ви знайшли напередодні. Додайте до нього новий шлях, якщо вам потрібно.

Про бібліотеки:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Дистрибутиви Linux потребують великої обережності PATH, і ви дійсно повинні бути обережні, перш ніж грати з ним. Будьте особливо обережні щодо додавання шляхів на зразок " ." або /home/username, це незахищено.

Однією з небезпек додавання шляхів є те, що він відкриває можливість файлів на цих шляхах виконувати root, відкриваючи вікно в системній безпеці, яке може використовуватися шкідливим програмним забезпеченням. Можуть бути й інші небезпеки. Просто переконайтеся, що знаєте, що робите. Обхід sudoзаходів безпеки може зробити ваш Solaris таким же безпечним, як і Windows XP.


Дякую за пропозицію. Принаймні, на Solaris виявляється, що env_keep працює лише частково, оскільки ігнорує PATH та LD_LIBRARY_PATH. Може бути, sudo побудований з налаштуваннями, які змушують відмовитись від збереження "небезпечних" змінних?
aknuds1

Чи працювало це з іншим дозволеним, як AKNUDS? Ви також можете запустити sudo-sudo -V (так, двічі sudo!) І подивитися, що він говорить. Тут вищезазначене рішення добре працює з PYTHONPATH, але PATH дійсно здається особливим. Справжня проблема з PATH. В Ubuntu вони будують судо, навмисно перетворюючи PATH.
користувач39559

env_keep для мене зберегли PYTHONPATH та HOME, тому там явно відбувається деяка фільтрація.
aknuds1

У своєму переглянутому рішенні ви пропонуєте мені, щоб я накрутив судо PATH, змінивши secure_path, правда? Я не думаю, що хочу цього робити. Ми, мабуть, близькі до відповіді на моє запитання; Я думаю, що sudo побудований для того, щоб ігнорувати reset_env та ігнорувати такі змінні, як PATH та LD_LIBRARY_PATH, коли вони вказані env_keep. Я думаю, що я можу обійтися без збереження PATH / LD_LIBRARY_PATH під судо, це не
велика вага

Це не вийде, тому що sudoписьменники були обережними, не даючи вам це зробити. Ви не хочете, щоб шкідливі бібліотеки завантажувались, оскільки вони були знайдені на шляху, який використовує sudo. Отже, тому це скидається. Якщо ви кодуєте речі, призначені для запуску під корінь, скопіюйте їх у відповідну системну директорію.
користувач39559

8

Як зауважували інші, сповивання sudoersпотрібно робити обережно.

Більш простий підхід для більш простих випадків, коли є певні змінні середовища, які ви хочете зберегти, - це просто передати змінну середовища, яку ви хочете безпосередньо, через sudo (це показано, як [VAR=value]у довідці cmdline sudo).

Дивіться цей невеликий приклад, де я також продемонстрував це для більше ніж однієї змінної.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Для оригінального PYTHONPATHприкладу у питанні просто використовуйте наступне:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Створення псевдоніма для такого типу речей зручно. Так:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'

1
може бути добре зробити так - псевдонім sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - а потім використовувати його sudopy some_script.py
Able Mac

@AbleMac Ви праві. Це була помилка ... я виправлю. Дякую!
Russ

3

З вами Defaults !env_resetвиглядає нормально, якщо припустити, що ви також не викликаєте судо з -Eможливістю вибору.

Ви можете спробувати повністю видалити цей запис.

Ви перевірили, що редагуєте правильний файл sudoers? Я здогадуюсь, що це може бути /etc/sudoersабо /usr/local/etc/sudoersзалежно від того, як він був встановлений. Ви редагували це за допомогою visudo?

Як ти керуєш судо? sudo python, sudo su, sudo su -, sudo -s, Що - то ще? Тільки sudo pythonі sudo suзберегли б ваше оточення.

Що env | grep PYTHONPATHговорить? Якщо нічого, переконайтесь, що PYTHONPATH експортується за допомогою запуску export PYTHONPATHта повторіть спробу.

Що sudo env | grep PYTHONPATHговорить? Якщо воно друкує очікуване значення, то щось інше переписує ваше значення PYTHONPATH. Можливо, root .bashrc або .bash_profile або файли конфігурації для всієї системи.


1
Я впевнений, що я редагую правильні судори, при цьому інсталяційний префікс відповідає sudo. Я веду судо як "судо су". Мені доведеться повернутися до вас, на жаль, за кілька днів, до решти ваших пропозицій. Дякую!
aknuds1

1
Спробуйте змінити неважливе налаштування, наприклад, editorабо passpromptпобачити, чи є у вас правильний файл. Або скористайтеся strace, dtrace, truss або подібним і подивіться, які файли вони відкриваються.
Мікель

env | grep PYTHONPATH, оскільки мій користувач роздруковує очікуване значення, під судо, однак, нічого не друкується. Редагуючи sudoers, я можу забезпечити збереження PYTHONPATH, змінивши "env_keep". Однак env_keep не збереже PATH або LD_LIBRARY_PATH. Я думаю, що sudo має обмеження безпеки, щоб не зберігати такі змінні, як PATH та LD_LIBRARY_PATH? Можливо, час налаштування часу?
aknuds1

1
! env_reset ігнорується, наскільки я можу сказати, але я можу повторно перевірити завтра. Я впевнений, що env_delete не встановлений, але я також можу це перевірити.
aknuds1

1
Я підтвердив, що! Env_reset ігнорується, а env_delete не встановлюється.
aknuds1

-1

Відповідно до документації Ubuntu для LD_LIBRARY_PATH :

Ви повинні використовувати /etc/ld.so.conf.d/*.conf файли конфігурації

Тоді:

  1. Додайте ld.soфайл конфігурації /etc/ld.so.conf.d/разом із вашим шляхомLD_LIBRARY_PATH

  2. Оновіть кеш за допомогою:

    sudo ldconfig -v
    

Приємно, але питання не в Ubuntu. Підказка. Наступного разу подивіться на теги під питанням.
DavidPostill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.