# Sudo

Sudo (abbreviazione dalla lingua inglese di super user do, "esegui come super utente"), in informatica, è un programma per i sistemi operativi Unix e Unix-like che, con dei vincoli, permette di eseguire altri programmi assumendo l'identità (e di conseguenza anche i privilegi) di altri utenti.
Originariamente il nome stava per super user do, poiché le prime versioni di sudo erano progettate per eseguire comandi solo come superutente; tuttavia, le versioni successive hanno aggiunto la possibilità di eseguire comandi non solo come superutente, ma anche come altri utenti (cosiddetti sudoer).
Alcuni sistemi come macOS e Ubuntu installano sudo nativamente, mentre in altri esso va eventualmente installato in un secondo tempo.

## Caratteristiche

I vincoli con cui sudo esegue programmi sono espressi nel file di configurazione /etc/sudoers, che normalmente è modificabile solo dall'utente root: in esso sono definiti gli utenti che possono eseguire comandi tramite sudo, le identità che possono assumere ed i comandi che possono eseguire con eventuali vincoli sui parametri, con o senza richiesta di autenticazione. Oltre che nel suddetto file di configurazione, tali informazioni possono essere memorizzate (con uno schema specifico per sudo) anche in un servizio di directory che sudo poi può interrogare via LDAP, offrendo quindi modo di condividere la stessa configurazione tra host diversi.
Nell'uso comune sudo viene configurato dall'amministratore di sistema per consentire a utenti non privilegiati di eseguire programmi assumendo l'identità dell'utente root, autenticandosi però con le proprie credenziali invece che con quelle di root. Al contrario del comando su ciò permette di evitare di dover diffondere le credenziali di root, semplificando così la gestione della sicurezza. Questo è ad esempio il comportamento predefinito dei sistemi Ubuntu per tutti gli utenti membri del gruppo speciale admin.

## Aspetti legati alla sicurezza

Dal punto di vista della sicurezza occorre tuttavia tenere ben presente che, benché sia possibile limitare i comandi ed i relativi parametri, sudo non effettua controlli di sorta sull'integrità dei file eseguibili che esso va ad avviare, ed è quindi importante assicurarsi che essi non possano essere alterati o sostituiti da utenti non privilegiati, e in particolare da quelli che li eseguono tramite sudo: in caso contrario, l'utente non privilegiato potrebbe alterare tali file in modo da eseguire codice arbitrario, e poi eseguirli con i privilegi concessi tramite sudo, di fatto creando un buco di sicurezza. Ciò si può prevenire ad esempio tramite il meccanismo dei permessi del sistema operativo.
Altre differenze rispetto al comando su consistono nella possibilità di configurare sudo per casi specifici in modo da non richiedere affatto autenticazione (utile per realizzare script non interattivi e non privilegiati che debbono effettuare alcune operazioni privilegiate) e/o limitare i comandi eseguibili ed i relativi parametri.

## Sintassi

La sintassi generale di sudo è la seguente:
Il parametro facoltativo comando indica il comando da eseguire, ed i parametri arg sono i suoi parametri. È possibile assegnare delle variabili d'ambiente per l'esecuzione del comando facendolo precedere da parametri nella forma variabile=valore.
Il doppio trattino -- (facoltativo) indica che i parametri successivi non sono da considerarsi opzioni o assegnazioni di variabili.
Tra le opzioni principali vi sono:

### -u utente

    Assume l'identità di utente invece che quella di root.

### -l

    Elenca i comandi che l'utente corrente può eseguire tramite sudo.

### -i

    Avvia la shell predefinita per l'utente di cui si assume l'identità.
È inoltre possibile accedere alla shell come utente root digitando:

## Esempi

Esegue con l'identità dell'utente root il comando apt-get install apache:
Avvia il comando psql con l'identità dell'utente postgres e preimpostando la variabile d'ambiente LD_LIBRARY_PATH:
Avvia la shell predefinita dell'utente alice: