Se digito "sudo" all'inizio di una riga, si applica al resto dei comandi?


10

Se scrivo sudoall'inizio di una riga in bash, si applica al resto dei comandi?

In altre parole, è questo:

sudo foo | foo2 | foo3

equivalente a questo:

sudo foo | sudo foo2 | sudo foo3

Risposte:


11

Per convincerti che sudoviene 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.

Esempio 1

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

Quindi quando catquei file vedrai i seguenti nomi utente:

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

Esempio n. 2

Tuttavia, se si esegue una subshell:

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

Quindi quando catquesti file vedrai i seguenti nomi utente:

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

Esempio n. 3

Il tuo commento su sudo foo1 | sudo foo2 ...non funzionerebbe mai, dal momento che l'output da sudo foo1verrebbe alimentato sudo foo2. Usando i miei whoamiesempi 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.

Modi oscuri di chiamare sudo

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 !

Modo n. 1

$ 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.

Modo n. 2

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

Come funziona?

Questo metodo esegue il teeprogramma come root AND accetta input da una stringa qui che viene eseguita prima di sudoinvocare il teecomando.

Modo n. 3

# 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' -sopzione, sudoverrà 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 -sswitch dice che passerà un singolo comando alla shell definita nella voce dell'utente del /etc/passwdfile. 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.


6

No, solo nel tuo esempio fooviene eseguito da sudo. Se si desidera eseguire tutti i comandi con privilegi di escalation, è possibile generare una shell:

sudo sh -c 'foo | foo2 | foo3'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.