Basicamente, preciso fazer isso:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Isso não funciona. Como posso passar a variável env $ DUMMY para su? -p não funciona com -l.
Basicamente, preciso fazer isso:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Isso não funciona. Como posso passar a variável env $ DUMMY para su? -p não funciona com -l.
Respostas:
Você pode fazer isso sem chamar o shell de login:
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
ou:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
A -p
opção de su
comando preservar variáveis de ambiente.
-p
é a opção de su
, não sudo
neste caso
-m
preservar a variável, outros dizem -c
qual é a diferença? E um dos comentários nestes dias de resposta -E
stackoverflow.com/questions/10488758/…
Dica profissional: nunca há realmente uma boa razão para executarsudo su
. Para executar um comando como um usuário diferente, use sudo -u username command
. Se você deseja um shell raiz, execute sudo -i
ou sudo -l
. Se você ativou a conta root, também pode executar su
sozinho, mas isso sudo su
não é útil. E sim, eu sei que você vê isso em todos os lugares.
Dito isto, sudo
tem a -E
opção que preservará o ambiente da sessão do usuário:
-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.
Portanto, você primeiro precisará exportar sua variável e, em seguida, execute sudo -E
:
$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy
The bash -c
is not needed. However, if I run sudo -Eu bob echo "$DUMMY"
, the variable is expanded before the root shell is launched so it doesn't demonstrate that the command actually works:
$ 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
em sudoers
. Talvez assim: Defaults env_keep += "DUMMY"
.
sudo
. Também é mais complicado para uma única variável. Isso é útil apenas para algo que sempre deve ser exportado.
LD_PRELOAD
e transitar LESSCHARDEF
. Eu não acho que conveniência deve ser o argumento ganhar aqui ...
-E faz o trabalho para mim. Do homem sudo
-
-E
, Indica à política de segurança que o usuário deseja preservar suas variáveis de ambiente existentes. A política de segurança pode retornar um erro se o usuário não tiver permissão para preservar o meio ambiente.--preserve-env
O que se segue é uma solução que não precisa de uma para alterar a política de segurança.
Ignorarei a su
parte, pois podemos usar a --user
opção de sudo
.
Queremos passar variáveis de ambiente para uma command
execução via sudo
. No entanto sudo
, não permitirá que variáveis de ambiente sejam passadas para um comando (há motivos de segurança válidos para isso, algumas variáveis podem ser perigosas). Um shell pode ser usado para definir variáveis de ambiente e sudo
pode executar um shell com um script passado para ele. Portanto, diga sudo
para executar um script que defina as variáveis de ambiente.
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
?