Risposte:
Per convincerti che sudo
viene eseguito solo utilizzando il primo comando fornito, e tutto il resto dopo il primo pipe viene eseguito come ID utente originale, puoi utilizzare questa catena di comandi inutili per vederlo.
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Quindi quando cat
quei file vedrai i seguenti nomi utente:
$ cat file{1..3}
root
saml
saml
Tuttavia, se si esegue una subshell:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
Quindi quando cat
questi file vedrai i seguenti nomi utente:
$ cat file{4..6}
root
root
root
Il tuo commento su sudo foo1 | sudo foo2 ...
non funzionerebbe mai, dal momento che l'output da sudo foo1
verrebbe alimentato sudo foo2
. Usando i miei whoami
esempi questo mostra che quella catena di comandi non fa nulla.
$ sudo whoami | sudo whoami | sudo whoami
root
Il primo correva, ma il 2 ° e il 3 ° non fanno nulla poiché non sono attrezzati per ricevere input. Piuttosto penso che volessi scrivere qualcosa del genere:
$ sudo whoami;sudo whoami;sudo whoami
root
root
root
Il che equivale a eseguirlo 3 volte su 3 diversi prompt dei comandi. O questo:
$ sudo whoami && sudo whoami && sudo whoami
root
root
root
Ma non fare mai quest'ultimo. Appartiene alla prossima sezione.
Questi non sono i miei lavori migliori ma sono altri modi in cui potresti avermi visto eseguire più comandi usando sudo
. Li mostro qui solo per insegnare non così che gli altri li facciano necessariamente !
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
Come funziona?
Il programma echo racchiuso tra virgolette doppie è in esecuzione come root, a causa di sudo, ma la shell che reindirizza l'output di echo sul file solo root è ancora in esecuzione come te. La shell corrente esegue il reindirizzamento prima dell'inizio sudo
.
$ sudo tee /proc/sys/vm/drop_caches <<<1
Come funziona?
Questo metodo esegue il tee
programma come root AND accetta input da una stringa qui che viene eseguita prima di sudo
invocare il tee
comando.
# this way
$ sudo -s -- 'whoami'
# or this way
sudo -s -- sh -c 'whoami;whoami'
Come funziona?
Questi potrebbero sembrare diversi ma stanno davvero facendo la stessa cosa. Quando si utilizza l' -s
opzione, sudo
verrà eseguito un singolo comando. Non sono mai riuscito a capire se c'era un modo per sfuggire. Niente di simile funzionerebbe.
# this
$ sudo -s -- 'whoami;whoami'
# or this
$ sudo -s -- 'whoami\;whoami'
Ma guardando la pagina man, lo -s
switch dice che passerà un singolo comando alla shell definita nella voce dell'utente del /etc/passwd
file. Quindi usiamo un trucco nella seconda forma, passando principalmente la shell, un'altra shell ( sh -c
) in cui eseguiamo "backdoor" la nostra stringa di comandi.
Ce ne sono altri ma mi fermerò qui. Questi sono solo per mostrarti cosa puoi fare se capisci le cose, ma non dovresti necessariamente semplicemente fare una cianciata insieme perché puoi, dovresti cercare di mantenere i pragmi del codice a un livello logico che abbia senso in modo che gli altri possano capire e supportare loro in futuro.