Qual è lo scopo di "vero" in bash "se sudo vero; poi"


20

Ho hackerato insieme questo script bash che verifica se l'utente ha i privilegi di superutente e se non lo fa lo richiede. Alla fine sto provando a invertire la seconda istruzione 'if' in modo da poter rimuovere le seguenti due righe (l'eco "password ok" e l'altra nella riga seguente)

# Root user only
if [[ "$EUID" != 0 ]]; then
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        echo "Password ok"
    else
        echo "Aborting script"
        exit 1
    fi
fi

echo "do my ops"

Lo scopo di "true" sulla quarta riga è solo un'istruzione null?

Devo invertire il test sulla quarta riga, come posso fare? Ecco cosa ho provato:

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then

2
Se hai intenzione di sottovalutare la domanda, potresti spiegare cosa posso fare per migliorare la domanda? Non è questo il sito di overflow giusto?
Matt Parkins,

4
Non sono sicuro da dove provengano i downvotes; stai cercando di annullare l'affermazione o annullare l'affermazione? Dici di voler sbarazzarti sia del vero / eco sia dell '"altro", quindi qual è il tuo obiettivo finale?
Jeff Schaller


1
@ ctrl-alt-delor seguendo quel link sembra che tutto ciò di cui ho bisogno è mettere un punto esclamativo davanti al sudo e quindi posso rimuovere sia l'eco che l'altro, e ora l'ho provato, che funziona, grazie.
Matt Parkins,

2
Di passaggio, probabilmente dovresti reindirizzare il messaggio di errore al flusso di errori:echo "Aborting script" >&2
Toby Speight,

Risposte:


38

truein bash non è una parola chiave, è un programma che esce istantaneamente con un codice di uscita riuscito. Allo stesso modo, falseè un programma che esce con un codice di uscita non riuscito.

Puoi provarlo eseguendo entrambi i programmi dal tuo terminale e quindi leggendo la $?variabile, che contiene il codice di uscita dell'ultimo programma;

true
echo $? # 0
false
echo $? #1

if sudo truenon è equivalente a if sudo == true. if sudo truesta eseguendo il trueprogramma usando sudoe controllando il codice di uscita.

Perciò:

if sudo false; thensta eseguendo il programma falsecome sudo. Il reso sarà sempre falso.

if sudo true == falseeseguirà il programma truecon gli argomenti ==e falseusando sudo. Questo ovviamente non è quello che volevi.

if [!(sudo true)] sintassi non valida.

Quello che probabilmente stai cercando è

if ! sudo true;

12
Come una correzione leggermente pedante della prima frase: in bash , truee falsesono "builtin", comandi interpretati direttamente dalla shell; nei sistemi simili a Unix in generale , esistono anche come programmi autonomi sul file system. La differenza non ha molta importanza qui, ma per quanto ne so, sudo truesarà in esecuzione il programma autonomo, non il built-in bash.
IMSoP,

31
PS: i miei riassunti preferiti di truee falsesono i titoli nelle loro pagine man: true - do nothing, successfullyefalse - do nothing, unsuccessfully
IMSoP il

3
@IMSoP È profondo.
brainplot

2
Se truenon esistesse, il codice nella domanda mostra perché uno potrebbe aver bisogno di inventarlo! È un programma minimo che può fallire solo se il sistema su cui è acceso è veramente bloccato. Quindi uno può usarlo per stabilire se le proprie credenziali di accesso sono OK.
nigel222,

2
In AT&T SYSV Unix, "true" era uno script shell / bin / true, che consisteva in una grande nota sul copyright nei commenti ... e nient'altro.
Lee Daniel Crocker,

21

Sento che la risposta accettata non ha effettivamente risposto alla tua domanda?

Lo scopo è quello di verificare che tu possa effettivamente sudo.

Come viene eseguito questo controllo è tramite il trueprogramma, come spiegato nella risposta accettata.


1
Essenzialmente, questo. Un'alternativa potrebbe essere quella di verificare se l'utente è nel gruppo sudoers, ma anche solo correre sudo trueè abbastanza facile, anche se un po 'confuso.
Sergiy Kolodyazhnyy il

3
Nota che anche questo richiede sudodi essere installato, quindi i controlli non sarebbero del tutto equivalenti ... potresti essere nel gruppo sudoers e non essere ancora in grado di fare sudo. (Ciò può venire in particolare se, ad esempio, stai scrivendo uno script per impostare una nuova immagine da un tarball rootfs minimo, che potrebbe non avere sudo.)
Mehrdad,

1
L'OP vuole ritirarsi se non puoi fare sudo e sbarazzarti di due linee invece di avere un altro che segue un noop.
mckenzm,

2
E, al contrario, puoi anche essere in grado di sudofar parte del gruppo sudoers se tu (o personalmente o come membro di un altro gruppo) sei elencato in /etc/sudoers. Ma anche sudo truenon è infallibile, poiché l' sudoaccesso può essere concesso solo per comandi specifici, quindi potresti essere in grado sudo true, ma non a sudo something_else, o viceversa. Non esiste un modo ironico di testare se non quello di provare a eseguire il comando con cui si desidera eseguire effettivamente sudo.
Dave Sherohman,

2
Inoltre, puoi essere nel sudoersgruppo e non essere in grado di farlo sudoperché il sudoersgruppo non è elencato nel sudoersfile. Un gruppo con le quattro lettere sudonel suo nome non è un'indicazione valida se un utente in quel gruppo può o meno fare qualsiasi cosa particolare o usare qualsiasi cosa sudo.
jrw32982 supporta Monica il

5

Come vedo in questa sceneggiatura. Sta solo controllando se sudo è abilitato, ecco ...

true restituisce true.

Quindi, in questo caso, se hanno bisogno di eseguire qualsiasi comando con sudo, controlla innanzitutto all'inizio, chiedendo la password solo una volta.

La condizione funziona in questo modo: se sudo esegue correttamente il comando true, restituirà true per la condizione if, quindi sudo è abilitato e l'utente ha digitato correttamente la password, altrimenti è stata digitata la password errata o sudo non è abilitato, lo script non deve continuare.

Gli altri comandi non devono richiedere la password di sudo, poiché l'autenticazione ha esito positivo per la prima volta (ma ciò dipende dalla configurazione di sudo, quindi questi script dipendono molto dalla configurazione dell'ambiente)

Anche "echo password ok" lo dimostra. lo script della shell non chiederà più la password.


1
Gli unici comandi che eseguono sudo ci sono sudo truee sudo -k. Quest'ultimo non richiede esplicitamente una password. Nessuno degli altri comandi nello script viene eseguito tramite sudo, quindi ovviamente non richiedono password, indipendentemente dal fatto che l'autenticazione abbia avuto esito positivo la prima volta.
ilkkachu,

Ho scritto: "Quindi, in questo caso, se hanno bisogno di eseguire qualsiasi comando con sudo, controlla prima di tutto, chiedendo la password una sola volta."
Luciano Andress Martini,
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.