cómo pasar variable de entorno a sudo su

Respuestas:

39

Puede hacerlo sin llamar al shell de inicio de sesión:

sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'

o:

sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'

La -popción de sucomando preservar variables de entorno.

Cuonglm
fuente
3
Creo que "-E" preserva las variables de entorno sudo.ws/man/sudo.man.html
Andy
1
@Andy Pero a menudo está prohibido por la configuración de sudo.
Gilles 'SO- deja de ser malvado'
@cuonglm: gracias. Esto funciona. No debería haber llamado al shell de inicio de sesión.
Umang
1
@kenorb: No, -pes una opción su, no sudoen este caso
cuonglm
Hay otros hilos que dicen que -mconserva la variable, otros dicen -c¿cuál es la diferencia? Y uno de los comentarios en estos días de respuesta -E stackoverflow.com/questions/10488758/…
Vishrant
49

Consejo profesional: nunca hay una buena razón para corrersudo su . Para ejecutar un comando como un usuario diferente, use sudo -u username command. Si quieres un shell raíz, ejecuta sudo -io sudo -l. Si ha activado la cuenta raíz, también puede ejecutarlo susolo, pero sudo susimplemente no es útil. Y sí, sé que lo ves en todas partes.

Dicho esto, sudotiene el -Einterruptor que preservará el entorno de la sesión del usuario:

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

Por lo tanto, primero deberá exportar su variable y luego ejecutar sudo -E:

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

El bash -cno es necesario. Sin embargo, si ejecuto sudo -Eu bob echo "$DUMMY", la variable se expande antes de que se inicie el shell raíz, por lo que no demuestra que el comando realmente funcione:

$ 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
fuente
2
Una mejor manera de preservar una variable de entorno es añadirlo a env_keepen sudoers. Tal vez desea: Defaults env_keep += "DUMMY".
lcd047
@ lcd047 pero eso preservará el entorno para todas las invocaciones de sudo. También es más engorroso para una sola variable. Eso solo es útil para algo que siempre debe exportarse.
terdon
Sí, es una compensación, pero no todas las variables de entorno son igualmente dañinas. Hay una diferencia sustancial entre trasladar LD_PRELOADy trasladar LESSCHARDEF. No creo que la conveniencia sea el argumento ganador aquí ...
lcd047
1
@ lcd047 su sugerencia vale la pena publicar como respuesta. Mi punto es que no es práctico para exportar variables arbitrarias. Sí, si hay una variable específica que siempre desea exportar, ese es el camino a seguir, pero no si desea hacerlo una vez y para una variable definida en la misma sesión.
terdon
7

-E hace el trabajo por mí. Del hombresudo -

-E, Indica a la política de seguridad que el usuario desea conservar sus variables de entorno existentes. La política de seguridad puede devolver un error si el usuario no tiene permiso para preservar el medio ambiente.--preserve-env

Amit Jha
fuente
Desafortunadamente, solo hará el trabajo si su administrador no le impidió usar -E.
TorstenS
0

Lo que sigue es una solución que no necesita una para cambiar la política de seguridad.

Ignoraré la suparte, ya que podemos usar la --useropción de sudo.

Queremos pasar variables de entorno a una commandejecución vía sudo. Sin embargo sudo, no permitirá que las variables de entorno se pasen a un comando (existen razones de seguridad válidas para esto, algunas variables pueden ser peligrosas). Un shell se puede usar para establecer variables de entorno y sudopuede ejecutar un shell con un script que se le pasa. Por lo tanto, indique sudoque ejecute un script que establezca las variables de entorno.

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
fuente