Bash Scripting: richiede l'esecuzione dello script come root (o con sudo)


26

Sto provando a scrivere uno script bash (in Ubuntu) che eseguirà il backup di una directory usando tar.

Come posso fare un controllo nello script in modo che possa essere eseguito solo come root (o con sudo)?

Ad esempio, se un utente esegue lo script, dovrebbe dire che questo script deve essere eseguito con i privilegi di sudo e quindi chiudere. Se lo script viene eseguito come root, continuerà oltre il controllo.

So che deve esserci una soluzione semplice, non sono riuscito a trovarlo su Google.

Risposte:


37

Per estrarre l'UID efficace utilizzare questo comando:

id -u

Se il risultato è '0', allora lo script è in esecuzione come root o usa sudo. Puoi eseguire il controllo facendo qualcosa del tipo:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi

5
Consiglierei di qualificare pienamente il percorso di id (ad esempio, / usr / bin / id). Altrimenti un utente subdolo potrebbe scrivere il proprio script / binario che restituisce sempre 0 e quindi inserirlo in una posizione che esiste in precedenza nel percorso degli utenti in esecuzione.
ktower,

Concordato. Riparando con una modifica.
Scott Pack,

6
Chiunque 'subdolo' cerchi di eseguire lo script non verrà fermato da te utilizzando il percorso completo dell'ID.
theotherreceive

Sono d'accordo con l'altro ... è uno script bash. La qualificazione del cestino "id" non impedisce comunque a chiunque sia seriamente intenzionato a aggirare l'assegno. Meglio lasciarlo non qualificato per la portabilità.
Chris,

1
Questo non risponde al requisito "sudo".
GregB

17

Presumo che tu lo sappia cambiando la proprietà in root

chown root:root file

e impostando le autorizzazioni su 700

chmod 700 file

realizzerai la stessa cosa - senza il suggerimento di correre come sudo.

Ma inserirò questa risposta per completezza.


3
Questa è una soluzione più adatta rispetto alla risposta accettata. - I miei $ 0,02
Chris,

Nota a margine: il controllo della sceneggiatura in git diventa più difficile. Per risolvere,sudo git add <file>
Chaim Eliyah,

2

Qual è il tuo obiettivo qui, informare l'utente che dovrebbero eseguire lo script come root o come una sorta di precauzione di sicurezza?

Se vuoi solo informare l'utente che uno qualsiasi dei suggerimenti sull'ideale va bene, ma sono utili come le gomme su un cavallo come una precauzione di sicurezza - non c'è nulla che impedisca a un utente di copiare lo script, eliminando la dichiarazione if, e eseguendolo comunque.

Se si tratta di un problema di sicurezza, lo script deve essere impostato su 700, di proprietà di root: root, in modo che non sia leggibile o eseguibile da nessun altro utente.


Oppure, potrebbe essere lo script richiede l'accesso a file o comandi accessibili solo a root per svolgere il suo lavoro, come nel mio caso
chrisbunney,

2

Puoi anche usare il comando whoami.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi

In realtà l'uid 0 è l'account utente speciale con privilegio completo. "root" è semplicemente l'etichetta / nome più comune mappato a quell'UID. Non deve essere "root" e un utente malintenzionato può tentare di sfruttarlo.
0xSheepdog,

2

La variabile bash $EUIDmostra l'UID effettivo su cui è in esecuzione lo script, se vuoi assicurarti che lo script venga eseguito come root, controlla se $EUIDcontiene il valore 0 oppure no:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

Questo è meglio della soluzione con /usr/bin/id(per gli script bash!) Perché non richiede un comando esterno.


1
Invece di uscire, potrebbe richiedere all'utente l'accesso sudo sostituendo la echoriga con sudo "$0" "$@"e sostituendola exit 2con exit $?.
schumacher574,

Buona idea. Tuttavia, la domanda ha richiesto uno script che si è chiuso, non è stato eseguito sudo da solo.
neuhaus

0

Un modo semplice per rendere lo script eseguibile solo da root è quello di avviare lo script con la riga:
#!/bin/su root


-1

"#! / bin / su root" consente agli utenti in modalità superutente di eseguire lo script senza usare la password di root. Se vuoi che i super utenti eseguano lo script con risultati come root, questo lo fa.

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.