sudo permette di eseguire un singolo comando con i privilegi di un altro utente, di solito l'amministratore (root). È il modo in cui, sulla maggior parte delle distribuzioni, si installano programmi, si modificano file di sistema e si gestiscono i servizi senza lavorare continuamente da amministratore.
Cos'è
sudo viene letto di solito come superuser do, "esegui come superutente", anche se più precisamente significa "substitute user do", cioè "esegui come un altro utente". È fornito dal pacchetto sudo, installato di serie su Ubuntu e su molte altre distribuzioni; su installazioni minime (per esempio Debian o i container) può mancare.
Ci sono due ruoli diversi da tenere a mente:
rootè l'account dell'amministratore, che può fare qualsiasi cosa sul sistema e per questo non si usa per il lavoro di tutti i giorni.sudoè il comando che ti presta quei poteri solo per il tempo di un'operazione, se la configurazione del sistema te lo consente.
Cosa fa
Controlla nel file di configurazione /etc/sudoers se hai il diritto di eseguire il comando richiesto, ti chiede la tua password (non quella di root) e poi lancia il comando con i privilegi richiesti. Dopo la prima autenticazione ricorda la password per alcuni minuti, di solito cinque, così non te la richiede a ogni comando. Ogni uso viene registrato nei log di sistema, quindi resta traccia di chi ha fatto cosa.
Su Debian e Ubuntu il diritto di usare sudo è dato dall'appartenenza al gruppo sudo; su Fedora, RHEL e Arch dal gruppo wheel.
Come si usa
Sintassi base: si scrive sudo davanti al comando che si vuole eseguire.
$ sudo [opzioni] comando [argomenti]Esempio 1: leggere un file riservato
$ cat /etc/shadow
cat: /etc/shadow: Permesso negato
$ sudo cat /etc/shadow
[sudo] password di enzo:
root:!:19500:0:99999:7:::
...Il file /etc/shadow, che contiene gli hash delle password, è leggibile solo da root. Con sudo il comando viene eseguito con i suoi privilegi. Mentre digiti la password sul terminale non compare nulla, nemmeno asterischi: è normale, il testo viene comunque registrato.
Esempio 2: installare e aggiornare programmi
Il caso d'uso più frequente: i comandi che modificano il sistema richiedono privilegi.
$ sudo apt update
$ sudo apt install htopEsempio 3: eseguire un comando come un altro utente con -u
Per impostazione predefinita sudo agisce come root, ma con -u scegli un altro utente:
$ sudo -u www-data ls /var/www/html
$ sudo -u postgres psqlServe a provare cosa vede o può fare un determinato servizio, senza diventare amministratore.
Esempio 4: ripetere l'ultimo comando con sudo !!
Se hai dimenticato di scrivere sudo, non serve riscrivere tutto:
$ apt update
E: Impossibile aprire il file di lock ... (Permesso negato)
$ sudo !!
sudo apt updateIn Bash !! viene sostituito con l'ultimo comando digitato.
Esempio 5: sapere cosa puoi fare con -l
$ sudo -l
L'utente enzo può eseguire i seguenti comandi su portatile:
(ALL : ALL) ALLL'opzione -l (list) elenca i comandi che puoi eseguire con sudo. In questo caso, tutti.
Esempio 6: aprire una shell da amministratore con -i o -s
$ sudo -i
# whoami
root
# exit
$Con -i (login) ottieni una shell di root, riconoscibile dal simbolo # al posto di $; per tornare normale si digita exit. È comodo quando devi eseguire molti comandi di amministrazione, ma proprio per questo è più rischioso: ogni errore avviene con i privilegi massimi. Se puoi, preferisci sudo davanti ai singoli comandi.
Esempio 7: modificare un file di sistema in modo sicuro
$ sudo nano /etc/hosts
$ sudoedit /etc/hostsCon sudoedit (o sudo -e) l'editor parte con i tuoi permessi su una copia temporanea del file, che viene poi salvata al posto dell'originale: è più sicuro che avviare l'editor come amministratore.
Esempio 8: la trappola del reindirizzamento
Un errore classico: scrivere in un file di sistema con >.
$ sudo echo "127.0.0.1 miosito.local" >> /etc/hosts
bash: /etc/hosts: Permesso negatoIl comando echo parte con sudo, ma il reindirizzamento >> lo esegue la tua shell, con i tuoi permessi, prima ancora di lanciare sudo. Per risolvere, il comando che scrive deve essere quello con i privilegi:
$ echo "127.0.0.1 miosito.local" | sudo tee -a /etc/hosts
$ sudo sh -c 'echo "127.0.0.1 miosito.local" >> /etc/hosts'Il comando tee -a scrive l'input nel file aggiungendolo in coda; nella seconda forma l'intera riga viene eseguita da una shell avviata con sudo.
Esempio 9: dimenticare o rinnovare la password
$ sudo -k # dimentica la password: la prossima volta verrà richiesta
$ sudo -v # rinnova la validità senza eseguire nullaEsempio 10: dare a un utente il diritto di usare sudo
Lo fa un amministratore, aggiungendo l'utente al gruppo giusto:
$ sudo usermod -aG sudo mario # Debian, Ubuntu
$ sudo usermod -aG wheel mario # Fedora, RHEL, ArchLa modifica vale dal login successivo: l'utente deve uscire e rientrare. L'opzione -a (append) è indispensabile: senza di essa l'utente verrebbe tolto da tutti gli altri gruppi.
Per regole più precise (consentire solo certi comandi, o certi utenti) si modifica il file di configurazione con visudo, che controlla la sintassi prima di salvare:
$ sudo visudoNon modificare mai /etc/sudoers con un editor qualsiasi: un errore di sintassi può impedirti di usare sudo. Meglio ancora, aggiungi un file dedicato in /etc/sudoers.d/, sempre tramite sudo visudo -f.
Esempio 11: uso negli script
Di solito non si scrive sudo dentro uno script: è meglio far girare lo script con sudo e verificare all'inizio che lo sia davvero:
#!/bin/bash
if [ "$EUID" -ne 0 ]; then
echo "Esegui questo script con sudo"
exit 1
fi
apt update
echo "Elenco pacchetti aggiornato"Lo si lancia con sudo ./aggiorna.sh. La variabile EUID contiene l'identificativo dell'utente effettivo, e vale 0 solo per root.
Opzioni utili
-u utente: esegue il comando come l'utente indicato.-i: avvia una shell di login da amministratore;-s: avvia una shell mantenendo il tuo ambiente.-l: elenca cosa sei autorizzato a eseguire.-k: dimentica la password memorizzata;-v: rinnova la validità senza eseguire nulla.-e(osudoedit): modifica un file in modo sicuro.-E: mantiene le variabili d'ambiente dell'utente, se la configurazione lo consente.
Attenzione a
- Sei amministratore: con
sudoil sistema non ti protegge dagli errori. Unsudo rm -rfsbagliato può cancellare ciò che a un utente normale sarebbe vietato. Rileggi sempre il comando, soprattutto prima di Invio. - Non eseguire comandi che non capisci: istruzioni trovate online del tipo
curl ... | sudo basheseguono con privilegi massimi uno script che non hai letto. Scarica lo script, leggilo e solo dopo eseguilo. - I file creati da
root: se lanci consudoun comando che crea file nella tua cartella personale (per esempio ungit clone), quei file risulteranno di proprietà diroote poi non riuscirai a modificarli. Si rimedia consudo chown -R tuoutente: cartella, ma meglio evitare di usaresudodove non serve. - Il reindirizzamento:
sudo comando > filenon dà i privilegi alla scrittura nel file. Usa| sudo tee file. - Non è
su: il comandosu("switch user") cambia utente e richiede la password dell'utente di destinazione;sudochiede la tua e può limitarsi a un solo comando. Su Ubuntu l'accountrootè disattivato proprio per spingere a usaresudo. - Su un sistema che non è il tuo: se
sudorisponde che non sei nel file sudoers, l'incidente viene registrato e segnalato all'amministratore. Non è un errore da aggirare. - I privilegi non sono sempre necessari: se un comando funziona senza
sudo, non aggiungerlo. Per i permessi di un file di tua proprietà bastachmod.
Riepilogo
| Comando | Cosa fa |
|---|---|
sudo comando | Esegue il comando come amministratore |
sudo -u utente comando | Esegue il comando come un altro utente |
sudo !! | Ripete l'ultimo comando con sudo |
sudo -l | Elenca cosa puoi eseguire |
sudo -i | Apre una shell da amministratore |
sudoedit file | Modifica un file di sistema in sicurezza |
echo x | sudo tee -a file | Aggiunge una riga a un file protetto |
sudo -k | Dimentica la password memorizzata |
sudo usermod -aG sudo utente | Concede a un utente l'uso di sudo |
sudo visudo | Modifica la configurazione in modo sicuro |