Salta al contenuto principale

sudo: esegui un comando come amministratore

Inviato da tuxsa il

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 htop

Esempio 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 psql

Serve 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 update

In 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) ALL

L'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/hosts

Con 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 negato

Il 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 nulla

Esempio 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, Arch

La 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 visudo

Non 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 (o sudoedit): modifica un file in modo sicuro.
  • -E: mantiene le variabili d'ambiente dell'utente, se la configurazione lo consente.

Attenzione a

  • Sei amministratore: con sudo il sistema non ti protegge dagli errori. Un sudo rm -rf sbagliato 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 bash eseguono con privilegi massimi uno script che non hai letto. Scarica lo script, leggilo e solo dopo eseguilo.
  • I file creati da root: se lanci con sudo un comando che crea file nella tua cartella personale (per esempio un git clone), quei file risulteranno di proprietà di root e poi non riuscirai a modificarli. Si rimedia con sudo chown -R tuoutente: cartella, ma meglio evitare di usare sudo dove non serve.
  • Il reindirizzamento: sudo comando > file non dà i privilegi alla scrittura nel file. Usa | sudo tee file.
  • Non è su: il comando su ("switch user") cambia utente e richiede la password dell'utente di destinazione; sudo chiede la tua e può limitarsi a un solo comando. Su Ubuntu l'account root è disattivato proprio per spingere a usare sudo.
  • Su un sistema che non è il tuo: se sudo risponde 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à basta chmod.

Riepilogo

ComandoCosa fa
sudo comandoEsegue il comando come amministratore
sudo -u utente comandoEsegue il comando come un altro utente
sudo !!Ripete l'ultimo comando con sudo
sudo -lElenca cosa puoi eseguire
sudo -iApre una shell da amministratore
sudoedit fileModifica un file di sistema in sicurezza
echo x | sudo tee -a fileAggiunge una riga a un file protetto
sudo -kDimentica la password memorizzata
sudo usermod -aG sudo utenteConcede a un utente l'uso di sudo
sudo visudoModifica la configurazione in modo sicuro