Si escribo "sudo" al comienzo de una línea, ¿se aplica al resto de los comandos?

10

Si escribo sudoal comienzo de una línea en bash, ¿se aplica al resto de los comandos?

En otras palabras, es esto:

sudo foo | foo2 | foo3

equivalente a esto:

sudo foo | sudo foo2 | sudo foo3
Mike B
fuente

Respuestas:

11

Como una forma de convencerse a sí mismo de que sudosolo se ejecuta con el primer comando provisto, y todo lo demás después de que se ejecuta el primer conducto como su ID de usuario original, puede usar esta cadena de comandos inútil para verlo.

Ejemplo 1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

Luego, cuando tenga catesos archivos, verá los siguientes nombres de usuario:

$ cat file{1..3}
root
saml
saml

Ejemplo # 2

Sin embargo, si ejecuta una subshell:

$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'

Luego, cuando tenga catestos archivos, verá los siguientes nombres de usuario:

$ cat file{4..6}
root
root
root

Ejemplo # 3

Su comentario sobre sudo foo1 | sudo foo2 ...nunca funcionaría, ya que la salida de sudo foo1sería alimentada sudo foo2. Usando mis whoamiejemplos, esto muestra que esa cadena de comandos no hace nada.

$ sudo whoami | sudo whoami | sudo whoami
root

El primero corrió, pero el segundo y el tercero no hacen nada ya que no están equipados para recibir aportes. Más bien creo que querías escribir algo como esto:

$ sudo whoami;sudo whoami;sudo whoami
root
root
root

Lo que es equivalente a ejecutarlo 3 veces en 3 comandos diferentes. O esto:

$ sudo whoami && sudo whoami && sudo whoami
root
root
root

Pero nunca hagas esto último. Pertenece en la siguiente sección.

Formas oscuras de llamar a sudo

Este no es mi mejor trabajo, pero son otras formas en las que podría haberme visto ejecutar múltiples comandos usando sudo. ¡Los muestro aquí solo para enseñar, no para que otros necesariamente los hagan !

Camino # 1

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

¿Cómo funciona?

El programa echo dentro de las comillas dobles se está ejecutando como root, debido a sudo, pero el shell que está redirigiendo la salida de echo al archivo solo raíz sigue ejecutándose como usted. Su shell actual hace la redirección antes de sudocomenzar.

Camino # 2

$ sudo tee /proc/sys/vm/drop_caches <<<1

¿Cómo funciona?

Este método ejecuta el teeprograma como root Y toma la entrada de una cadena here que se ejecuta antes de sudoinvocar el teecomando.

Camino # 3

# this way
$ sudo -s -- 'whoami'

# or this way
sudo -s -- sh -c 'whoami;whoami'

¿Cómo funciona?

Estos pueden verse diferentes, pero realmente están haciendo lo mismo. Al usar el -sinterruptor, sudoejecutará un solo comando. Nunca podría entender si había una manera de escapar de ella. Nada como esto funcionaría.

# this
$ sudo -s -- 'whoami;whoami'

# or this
$ sudo -s -- 'whoami\;whoami'

Pero al mirar la página de manual, el -sconmutador dice que pasará un solo comando al shell definido en la entrada del /etc/passwdarchivo del usuario . Entonces usamos un truco en la segunda forma, principalmente pasando el shell, otro shell ( sh -c) en el que "backdoor" nuestra cadena de comandos para ejecutar.

Hay más pero me detendré aquí. Estos son solo para mostrarle lo que puede hacer si comprende las cosas, pero no necesariamente deben encadenar basura porque puede, debe tratar de mantener sus pragmas de código en un nivel lógico que tenga sentido para que otros puedan entender y apoyar ellos en el futuro.

slm
fuente
6

No, en tu ejemplo solo fooes ejecutado por sudo. Si desea ejecutar todos los comandos con privilegios escalados, puede generar un shell:

sudo sh -c 'foo | foo2 | foo3'
jordanm
fuente