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 -p
opción de su
comando preservar variables de entorno.
-p
es una opción su
, no sudo
en este caso
-m
conserva 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 -i
o sudo -l
. Si ha activado la cuenta raíz, también puede ejecutarlo su
solo, pero sudo su
simplemente no es útil. Y sí, sé que lo ves en todas partes.
Dicho esto, sudo
tiene el -E
interruptor 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 -c
no 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_keep
en 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_PRELOAD
y 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 su
parte, ya que podemos usar la --user
opción de sudo
.
Queremos pasar variables de entorno a una command
ejecució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 sudo
puede ejecutar un shell con un script que se le pasa. Por lo tanto, indique sudo
que 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
?