Як передати змінну оточення в sudo su


30

Мені в основному потрібно це зробити:

DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'

Це не працює. Як я можу передати змінну env $ DUMMY на su? -p не працює з -l.


А як просто sudo -iu ec2-user echo $DUMMY?
муру

1

Відповіді:


39

Ви можете це зробити без виклику оболонки для входу:

sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'

або:

sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'

-pВаріант suкоманди зберегти змінні оточення.


3
Я думаю, що "-E" зберігає змінні середовища sudo.ws/man/sudo.man.html
Енді

1
@Andy Але це часто заборонено конфігурацією sudo.
Жиль "ТАК - перестань бути злим"

@cuonglm - дякую. Це працює. Не слід було викликати оболонку входу.
Умань

1
@kenorb: Ні, -pце варіант su, не sudoв цьому випадку
cuonglm

Є й інші потоки, які говорять, що -mзберігає змінну, інші кажуть, -cу чому різниця? І один з коментарів в цій відповіді днів -E stackoverflow.com/questions/10488758 / ...
Vishrant

49

Порада поради: Ніколи насправді немає вагомих причин бігатиsudo su . Щоб виконати команду як інший користувач, використовуйте sudo -u username command. Якщо ви хочете кореневу оболонку, запустіть sudo -iабо sudo -l. Якщо ви активували кореневий обліковий запис, ви також можете запускати suпоодинці, але sudo suце просто не корисно. І так, я знаю, ти це бачиш скрізь.

При цьому sudoє -Eперемикач, який збереже середовище сеансу користувача:

 -E, --preserve-env
        Indicates to the security policy that the user wishes to preserve 
        their existing environment variables.  The security policy may
        return an error if the user does not have permission to 
        preserve the environment.

Отже, спочатку потрібно експортувати змінну, а потім виконати sudo -E:

$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy

Це bash -cне потрібно. Однак, якщо я запускаю sudo -Eu bob echo "$DUMMY", змінна розширюється до запуску кореневої оболонки, тому вона не демонструє, що команда насправді працює:

$ sudo -u bob echo $DUMMY  ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY'  ## works as expected
D:dummy

2
Кращий спосіб зберегти змінну середовища - це додати її env_keepв sudoers. Може бути , це подобається: Defaults env_keep += "DUMMY".
lcd047

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

Так, це компроміс, але не всі змінні середовища однаково шкідливі. Існує істотна різниця між перенесенням LD_PRELOADта перенесенням LESSCHARDEF. Я не думаю, що зручність має бути виграшним аргументом тут ...
lcd047

1
@ lcd047 вашу пропозицію, безумовно, варто опублікувати як відповідь. Моя думка, що це не є практичним для експорту довільних змінних. Так, якщо є певна змінна, яку завжди потрібно експортувати, це шлях, але не, якщо ви хочете зробити це один раз і для змінної, визначеної в одному сеансі.
тердон

7

-E робить роботу для мене. Від людини sudo-

-E, Позначає політиці безпеки, що користувач бажає передбачати наявні змінні середовища. Політика безпеки може повернути помилку, якщо користувач не має дозволу на збереження навколишнього середовища.--preserve-env


На жаль, це зробить роботу лише в тому випадку, якщо ваш адміністратор не обмежив вас у використанні -E.
TorstenS

0

Далі йде рішення, яке не потрібно для зміни політики безпеки.

Я проігнорую suчастину, оскільки ми можемо використовувати --userваріант sudo.

Ми хочемо передати змінні середовища до commandзапуску через sudo. Однак sudoзабороняється передавати змінні середовища команді (для цього є дійсні причини безпеки, деякі змінні можуть бути небезпечними). Оболонку можна використовувати для встановлення змінних оточуючих середовищ і sudoможе запускати оболонку з переданим до неї скриптом. Тому скажіть sudoзапустити скрипт, який встановлює змінні середовища.

var_a=someThing
var_b=someOtherThing

sudo bash -c "
    export var_a=\"${var_a}\"
    export var_b=\"${var_b}\"

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