Мені в основному потрібно це зробити:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Це не працює. Як я можу передати змінну env $ DUMMY на su? -p не працює з -l.
Мені в основному потрібно це зробити:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Це не працює. Як я можу передати змінну env $ DUMMY на su? -p не працює з -l.
Відповіді:
Ви можете це зробити без виклику оболонки для входу:
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
або:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
-p
Варіант su
команди зберегти змінні оточення.
-p
це варіант su
, не sudo
в цьому випадку
-m
зберігає змінну, інші кажуть, -c
у чому різниця? І один з коментарів в цій відповіді днів -E
stackoverflow.com/questions/10488758 / ...
Порада поради: Ніколи насправді немає вагомих причин бігати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
env_keep
в sudoers
. Може бути , це подобається: Defaults env_keep += "DUMMY"
.
sudo
. Він також більш громіздкий для однієї змінної. Це корисно лише для того, що завжди слід експортувати.
LD_PRELOAD
та перенесенням LESSCHARDEF
. Я не думаю, що зручність має бути виграшним аргументом тут ...
-E робить роботу для мене. Від людини sudo
-
-E
, Позначає політиці безпеки, що користувач бажає передбачати наявні змінні середовища. Політика безпеки може повернути помилку, якщо користувач не має дозволу на збереження навколишнього середовища.--preserve-env
Далі йде рішення, яке не потрібно для зміни політики безпеки.
Я проігнорую 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
"
sudo -iu ec2-user echo $DUMMY
?