Al usar && y sudo en el primer comando, ¿el segundo comando también se ejecuta como sudo?


64

Si ejecuto un comando.

sudo some-command && some-other-command

¿El segundo comando también se ejecuta con sudoprevilege?

Respuestas:


110

TL; DR: NO


El primer comando es

sudo some-command

El segundo comando es

some-other-command

El comando sudotoma el siguiente comando y lo ejecuta con privilegios elevados. Sin &&embargo, no pertenece a un comando y el intérprete lo interpreta antes de ejecutar el primer comando. Le dice a bash que primero ejecute el primer comando y, en caso de éxito, el segundo.

Entonces el sudono sabe sobre el && some-other command. Cuando finaliza el proceso elevado, bash toma su valor de retorno y luego ejecuta el otro comando, que nuevamente no conoce el primero.

Esto se puede demostrar fácilmente:

$ sudo whoami && whoami
root
username

Para alcanzar lo que desea, puede iniciar un bash elevado y dejar que ejecute ambos comandos:

$ sudo bash -c 'whoami && whoami'
root
root

Entonces, ambos comandos se ejecutan como root, ya que todo el proceso descrito anteriormente se ejecuta en un proceso elevado, es decir, la sesión bash comenzó con este comando, que se cierra inmediatamente después de finalizar. Aún así, ambos whoamino saben de la existencia del otro.

Esto no se adapta a ningún propósito, pero para esta demostración, la forma más fácil es simplemente hacer

sudo some-command && sudo some-other-command

29
+1 para el whoamiejemplo.
Carl H


¡Esta demostración es realmente genial! ¡Tengo que pensarlo cuando intente enseñar sudo a otros la próxima vez!
Fragmentación necesaria

20

No. Algunos ejemplos que hacen esto son:

sudo some-command && sudo some-other-command 
sudo sh -c "some-command && some-other-command"

o si quieres comandos de nido, incluso puedes hacer:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • El segundo usa otro caparazón.
  • Tenga en cuenta que cuando usa 'o "en la segunda versión, necesita escapar de los que están en los comandos o parámetros de ese comando (es decir, \' o \") para que esto se vuelva complejo muy rápidamente.

El tercer método no funciona: $ sudo -s -- whoami && whoamidaroot username
BartekChom

@BartekChom lo siento, me perdí las citas sobre eso
Rinzwind

sudo -s -- "whoami && whoami"parece dar el comando no encontrado, más o menos lo mismo que el comando "whoami && whoami". ¿Cómo usar esta construcción con &&? Veo que sudo -s cd ..no da ningún error en comparación con sudo cd ...
BartekChom

He aprendido algo nuevo hoy sudo bash <<"EOF":! ¡Gracias! :-)
Fabby

4

No, debes escribir sudo dos veces o hacer algo como

sudo bash -c 'foo && bar'

2

&&significa que el comando del lado derecho (segundo) solo se ejecutará si el comando del lado anterior (primero) tiene éxito, es decir, el código de salida lo $?es 0.

Los dos comandos son diferentes entre sí y se ejecutarán en sus propios entornos, por lo que el segundo comando no se ejecutará con sudoprivilegios.

Esto te dejará claro:

$ sudo whoami && whoami 
root
foobar

1

NO, y lo siguiente fue una vez muy comúnmente macro'd.

sudo reboot && exit

Casi todos deberían haber hecho esto al menos una vez

sudo apt-get update && sudo apt-get upgrade

Por lo tanto, es una gran pregunta de entrevista "mickey mouse".

Esto se prueba tan fácilmente que la pregunta puede sospecharse en un ejercicio de relleno de estadísticas.


0

En la línea de comando, cuando veas

$ command one && command two

la intención típica es ejecutar el comando que sigue a && solo si el primer comando es exitoso.

¿El otro comando también se ejecuta como sudo?

absolutamente no, esto es solo como escribir dos comandos consecutivos, esto && no otorga ningún privilegio adicional a un comando. Es solo un separador .

Para demostrarlo, tomemos un ejemplo.

touch fileA fileB 

Creé dos archivos archivo A y archivo B. Ahora ejecutaré el comando

sudo chown test:test fileA && chown test:test fileB

Estoy cambiando el usuario y el propietario del grupo de estos archivos a prueba de nombre de usuario y grupo. Ahora el primer comando debería ejecutarse, ¿y el otro?

El resultado es:

chown: changing ownership of `fileB': Operation not permitted

Por lo tanto, el comando no se ejecutó ya que necesita sudoy, aunque podemos concluir que && no es un reemplazo del segundosudo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.