¿Por qué "sudo -u root echo` whoami` "no devuelve root?

11

¿Cómo se usa sudo para ejecutar un comando como usuario root real en Ubuntu? Originalmente pensé que este era el comportamiento predeterminado de sudo, hasta que ejecuté:

myuser@localhost:~$ sudo echo `whoami`
myuser

myuser@localhost:~$ sudo -u root echo `whoami`
myuser

Sin embargo, este es el tipo de comportamiento que quiero, pero solo en una sola línea:

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root
Cerin
fuente
11
¿Por qué echo whoami? Solo di sudo whoami .. devuelve root
Neo

Respuestas:

26

De hecho, hace ejecutarlas como root. Pero, lo que te está sucediendo es que los ticks posteriores se evalúan antes de las sudo ejecuciones, ya que son necesarios para evaluar el comando. Más directamente, ¿por qué no solo esto?

sudo whoami

Sus whoamiticks en la parte posterior se evalúan realmente en una subshell como el usuario actual, por lo que ve lo que hace.

Error fatal
fuente
2
Esto está mal. sudo se ejecuta con privilegios de root pero no como root.
Manfred Moser
@Moser, ¿entonces por qué su comando imprime "root"?
Cerin
44
@ManfredMoser: se ejecuta con el UID de 0(cero), que es exactamente lo que la gente llama "raíz". (Habría tenido razón si sudosolo extendiera sus capacidades sin cambiar realmente el UID. Pero eso no es lo que hace.)
user1686
1
M. Moser podría haber estado señalando que el UID de conjunto solo cambia la ID de usuario efectiva del proceso, requiriendo que el proceso en sí mismo cambie la ID de usuario real, como realmente lo sudohace. Pero al leer la respuesta xyr, este no parece haber sido el caso.
JdeBP
7

El subshell ( whoami) se ejecuta primero, como usted, y el resultado ( myuser) se coloca en el sudocomando; lo que sudove es echo myuser. Piense en ello como un atajo para:

tmpvar=`whoami`
sudo echo "$tmpvar"
Kevin
fuente
1

Parece que hay algo de suposición aquí ...

Los backticks obviamente están haciendo lo que otros explicaron, expandiéndose whoamiantes de invocar 'sudo', y dejando los backticks fuera de 'root', como se esperaba.

Pero es útil comprender lo que realmente está sucediendo con sudo (8). ¡Así que realmente miré la página del manual!

"El uid y gid real y efectivo están configurados para que coincidan con los del usuario objetivo ..."

Por lo tanto, parece que el comportamiento observado no tiene nada que ver con la diferencia entre la identificación de usuario real y efectiva.

También es ilustrativo hacer "sudo printenv" y compararlo solo con "printenv", lo que realmente me sorprendió un poco. Muestra que [i] algunas [/ i] variables exportadas están disponibles y otras no: informa la INICIO, RUTA, PS1, SHELL, TERM y EDITOR del usuario que invoca, pero no otras como MANPATH, CVSROOT, LD_LIBRARY_PATH, o ENV. Eso parece un poco extraño, ya que podría hacer que los programas se comporten de manera diferente a como el usuario original o como root.

Jan Steinman
fuente
0

sudo le permite ejecutar cualquier comando con privilegios de root, pero no como usuario root. La razón por la que esto es útil es que con esta configuración, varias personas pueden tener derechos de root y todo el registro, etc., sigue indicando quién realizó los cambios.

Esta configuración es mejor que compartir contraseñas raíz. Como tal, ha reemplazado tener usuarios root en muchas distribuciones, incluida Ubuntu.

sudo su, por otro lado, lo convierte en el usuario root y, por lo tanto, realmente no debe usarse.

Esta diferencia también explica su comportamiento observado (correcto).

Manfred Moser
fuente
66
No. Lo que explica el comportamiento es una cuestión muy simple de cómo funciona la sustitución de comandos en el shell. No tiene nada que ver con los privilegios.
JdeBP
-2

Sudo otorga temporalmente privilegios a quien sea que sea (dado que se le permite sudo en primer lugar) privilegios de nivel raíz.

Para ser root, deberías iniciar sesión como root que está bloqueado en Ubuntu de forma predeterminada.

Debe tener cuidado con esto, sudo no es root. Si desea mostrar que Fred está ejecutando algo como sudo, che3d las variables de entorno SUDO, SUDO_COMMAND podría ser la más útil.

Tony Hopkinson
fuente
¿La raíz está bloqueada en Ubuntu? ¿Estás seguro de eso? Sé que se desaconseja, pero pensé que simplemente lo hicieron un poco más difícil para un novato al configurar una contraseña oscura con un UUID, que se puede cambiar con los métodos habituales.
Marty Fried