Básicamente necesito hacer esto:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Esto no funciona ¿Cómo puedo pasar la variable env $ DUMMY a su? -p no funciona con -l.
Básicamente necesito hacer esto:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Esto no funciona ¿Cómo puedo pasar la variable env $ DUMMY a su? -p no funciona con -l.
Respuestas:
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.
-pes una opción su, no sudoen este caso
-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/…
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
env_keepen sudoers. Tal vez desea: Defaults env_keep += "DUMMY".
sudo. También es más engorroso para una sola variable. Eso solo es útil para algo que siempre debe exportarse.
LD_PRELOADy trasladar LESSCHARDEF. No creo que la conveniencia sea el argumento ganador aquí ...
-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
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
"
sudo -iu ec2-user echo $DUMMY?