Quando si usa && e sudo sul primo comando, anche il secondo comando viene eseguito come sudo?


64

Se eseguo un comando.

sudo some-command && some-other-command

Anche il secondo comando viene eseguito con sudoprevilege?

Risposte:


110

TL; DR: NO


Il primo comando è

sudo some-command

Il secondo comando è

some-other-command

Il comando sudoaccetta il seguente comando ed esegue con privilegi elevati. La &&, tuttavia, non appartiene a un comando e viene interpretato dalla shell, prima di eseguire il primo comando. Dice a bash di eseguire prima il primo comando e, in caso di successo, il secondo.

Quindi il sudonon sa del && some-other command. Quando termina il processo elevato, bash prende il suo valore di ritorno, quindi esegue l'altro comando, che di nuovo non conosce il primo.

Questo può essere dimostrato facilmente:

$ sudo whoami && whoami
root
username

Per raggiungere ciò che desideri, puoi avviare una bash elevata e lasciar eseguire entrambi i comandi:

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

Quindi ora entrambi i comandi vengono eseguiti come root, poiché l'intero processo sopra descritto viene eseguito in un processo elevato, ovvero la sessione bash è iniziata con questo comando, che termina immediatamente dopo aver terminato. Tuttavia, entrambi whoaminon conoscono l'esistenza degli altri.

Questo non soddisfa alcuno scopo, ma per questa dimostrazione, il modo più semplice è semplicemente farlo

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

29
+1 per l' whoamiesempio.
Carl H,


Questa dimostrazione è davvero fantastica! Ci devo pensare quando cerco di insegnare sudo agli altri la prossima volta!
Frammentazione necessaria

20

No. Alcuni esempi che lo fanno sono:

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

o se vuoi comandi nest puoi anche fare:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • Il 2 usa un'altra shell.
  • Ricorda che quando usi 'o "nella seconda versione devi sfuggire a quelli nei comandi o parametri di quel comando (es. \' O \") in modo che possano diventare complessi molto rapidamente.

Il terzo metodo non funziona: $ sudo -s -- whoami && whoamiroot username
BartekChom il

@BartekChom mi dispiace di aver perso le citazioni su quello
Rinzwind

sudo -s -- "whoami && whoami"sembra dare il comando non trovato, più o meno lo stesso del comando "whoami && whoami". Come usare questa costruzione con &&? Vedo che sudo -s cd ..non dà alcun errore al contrario sudo cd ...
BartekChom,

Ho imparato qualcosa di nuovo oggi sudo bash <<"EOF":! Grazie! :-)
Fabby,

4

No, o devi scrivere sudo due volte o fare qualcosa del genere

sudo bash -c 'foo && bar'

2

&&significa che il comando di destra lati (secondo) verrà eseguito solo solo se il timore lati comando (prima) è riuscito cioè codice di uscita $?è 0.

I due comandi sono diversi l'uno dall'altro e verranno eseguiti nei rispettivi ambienti, quindi il secondo comando non verrà eseguito con sudoprivilegio.

Questo ti chiarirà:

$ sudo whoami && whoami 
root
foobar

1

NO, e una volta molto comunemente era macro.

sudo reboot && exit

Quasi tutti avrebbero dovuto farlo almeno una volta

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

Quindi è un'ottima domanda per l'intervista a "Topolino".

Questo è così facilmente testato che la domanda può essere sospettata di un esercizio di riempimento stat.


0

Sulla riga di comando, quando vedi

$ command one && command two

l'intento tipico è quello di eseguire il comando che segue && solo se il primo comando ha esito positivo.

L'altro comando funziona anche come sudo?

assolutamente no, questo è proprio come scrivere due comandi consecutivi, questo && non dà alcun privilegio aggiunto a un comando. È solo un separatore .

Per dimostrarlo, facciamo un esempio.

touch fileA fileB 

Ho creato due file fileA e fileB. Ora eseguirò il comando

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

Sto cambiando il proprietario dell'utente e del gruppo di questi file in test del nome utente e del gruppo. Ora il primo comando dovrebbe essere eseguito mentre per quanto riguarda l'altro?

L'output è:

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

Quindi il comando non è stato eseguito poiché è necessario sudoe sebbene possiamo concludere che && non è un sostituto del secondosudo

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.