como passar variável de ambiente para sudo su

30

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.

Umang
fonte
Que tal simplesmente sudo -iu ec2-user echo $DUMMY?
muru
1
Possível duplicata de Como fazer com que o `sudo` preserve $ PATH?
kenorb

Respostas:

39

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 -popção de sucomando preservar variáveis ​​de ambiente.

cuonglm
fonte
3
Eu acho que as variáveis de ambiente "-e" conservas sudo.ws/man/sudo.man.html
Andy
1
@ Andy Mas muitas vezes é proibido pela configuração do sudo.
Gilles 'SO- stop be evil'
@cuonglm - obrigado. Isso funciona. Não deveria ter chamado o shell de login.
Umang
1
@kenorb: Não, -pé a opção de su, não sudoneste caso
cuonglm
Há outros tópicos que dizem -mpreservar a variável, outros dizem -cqual é a diferença? E um dos comentários nestes dias de resposta -E stackoverflow.com/questions/10488758/…
Vishrant
49

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 -iou sudo -l. Se você ativou a conta root, também pode executar susozinho, mas isso sudo sunão é útil. E sim, eu sei que você vê isso em todos os lugares.

Dito isto, sudotem a -Eopçã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
terdon
fonte
2
A melhor maneira de preservar uma variável de ambiente é para adicioná-lo env_keepem sudoers. Talvez assim: Defaults env_keep += "DUMMY".
lcd047
@ lcd047 mas isso preservará o ambiente para todas as chamadas de sudo. Também é mais complicado para uma única variável. Isso é útil apenas para algo que sempre deve ser exportado.
terdon
Sim, é uma troca, mas nem todas as variáveis ​​de ambiente são igualmente prejudiciais. Há uma diferença substancial entre transitar LD_PRELOADe transitar LESSCHARDEF. Eu não acho que conveniência deve ser o argumento ganhar aqui ...
lcd047
1
@ lcd047 sua sugestão certamente vale a pena postar como resposta. O que quero dizer é que não é prático exportar variáveis ​​arbitrárias. Sim, se houver uma variável específica que você sempre deseja exportar, esse é o caminho a seguir, mas não se você quiser fazer isso de uma vez e para uma variável definida na mesma sessão.
terdon
7

-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

Amit Jha
fonte
Infelizmente, ele só fará o trabalho se o seu administrador não o impedir de usar -E.
TorstenS
0

O que se segue é uma solução que não precisa de uma para alterar a política de segurança.

Ignorarei a suparte, pois podemos usar a --useropção de sudo.

Queremos passar variáveis ​​de ambiente para uma commandexecuçã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 sudopode executar um shell com um script passado para ele. Portanto, diga sudopara 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
"
ctrl-alt-delor
fonte