como passar variável de ambiente para sudo su

25

Eu 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.

    
por Umang 09.05.2015 / 08:51

4 respostas

30

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 opção -p do comando su preserva as variáveis de ambiente.

    
por 09.05.2015 / 09:10
41

Dica profissional: Nunca há uma boa razão para executar sudo su . Para executar um comando como um usuário diferente, use sudo -u username command . Se você quiser um shell de root, execute sudo -i ou sudo -l . Se você tiver ativado a conta raiz, também poderá executar su sozinho, mas sudo su simplesmente não será útil. E sim, eu sei que você vê em todos os lugares.

Dito isso, sudo tem a opção -E 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.

Então, primeiro você precisa exportar sua variável e, em seguida, executar sudo -E :

$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy

O bash -c não é necessário. No entanto, se eu executar sudo -Eu bob echo "$DUMMY" , a variável será expandida antes que o shell raiz seja lançado, portanto, isso não demonstrará que o comando realmente funciona:

$ 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
    
por 09.05.2015 / 10:51
5

-E faz o trabalho para mim. Do homem sudo -

-E, --preserve-env
Indicates to the security policy that the user wishes to pre‐ serve their existing environment variables. The security policy may return an error if the user does not have permis‐ sion to preserve the environment.

    
por 29.11.2015 / 16:35
0

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

Ignorarei a parte su , pois podemos usar a opção --user de sudo .

Queremos passar variáveis de ambiente para uma command run via sudo . No entanto, sudo não permitirá que variáveis de ambiente sejam passadas para um comando (existem razões de segurança válidas 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, informe 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
"
    
por 10.06.2018 / 00:06