Si escribo sudo
al 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
Como una forma de convencerse a sí mismo de que sudo
solo 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.
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Luego, cuando tenga cat
esos archivos, verá los siguientes nombres de usuario:
$ cat file{1..3}
root
saml
saml
Sin embargo, si ejecuta una subshell:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
Luego, cuando tenga cat
estos archivos, verá los siguientes nombres de usuario:
$ cat file{4..6}
root
root
root
Su comentario sobre sudo foo1 | sudo foo2 ...
nunca funcionaría, ya que la salida de sudo foo1
sería alimentada sudo foo2
. Usando mis whoami
ejemplos, 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.
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 !
$ 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 sudo
comenzar.
$ sudo tee /proc/sys/vm/drop_caches <<<1
¿Cómo funciona?
Este método ejecuta el tee
programa como root Y toma la entrada de una cadena here que se ejecuta antes de sudo
invocar el tee
comando.
# 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 -s
interruptor, sudo
ejecutará 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 -s
conmutador dice que pasará un solo comando al shell definido en la entrada del /etc/passwd
archivo 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.
No, en tu ejemplo solo foo
es ejecutado por sudo
. Si desea ejecutar todos los comandos con privilegios escalados, puede generar un shell:
sudo sh -c 'foo | foo2 | foo3'