как передать переменную окружения в sudo su


30

Мне в основном нужно сделать это:

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

Это не работает Как я могу передать переменную env $ DUMMY в su? -p не работает с -l.


А как насчет просто sudo -iu ec2-user echo $DUMMY?
Муру

Ответы:


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/…
Вишрант

49

Совет для профессионалов: никогда не бывает веской причины для бегаsudo su . Чтобы запустить команду от имени другого пользователя, используйте sudo -u username command. Если вам нужна корневая оболочка, запустите sudo -iили sudo -l. Если вы активировали учетную запись root, вы также можете запускать ее 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.