Мне в основном нужно сделать это:
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
. Если вы активировали учетную запись 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
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
?