Unix
Unix
UNIX
LINUX
(UBUNTU)
prof. Claudio Maccherani
Perugia, 1995/2015
INDICE
PROCESSO............................................................................................... 2
STATI dei PROCESSI ................................................................................. 2
CREAZIONE e TERMINAZIONE dei processi .................................................. 3
SINCRONIZZAZIONE tra processi ............................................................... 4
AVVIO del SISTEMA e Processi di Sistema.................................................... 4
MEMORIA CENTRALE................................................................................. 4
INPUT/OUTPUT......................................................................................... 4
Comando PS (process status)..................................................................... 5
FILE SYSTEM............................................................................................ 6
Struttura delle Directory del FILE SYSTEM.................................................... 7
PERMESSI tradizionali UNIX ....................................................................... 8
Principali COMANDI LINUX ........................................................................10
Riga di Comando / TERMINALE / SHELL ......................................................14
EDITOR di testo NANO..............................................................................20
AMMINISTRAZIONE del SISTEMA: Comando SUDO ......................................21
PROCESSO
Un programma è un insieme finito di istruzioni e di dati definiti dal programmatore per descrivere
un determinato algoritmo; è un’entità “statica”.
Un processo è l’insieme delle azioni che vengono eseguite per eseguire un programma; è un’entità
“dinamica”. Si può dire che “un processo è un programma in esecuzione”.
Il sistema “vede” un processo come un insieme di aree di memoria e di struttue dati che ne
costituiscono l’immagine. La vita di un processo è determinata dall’evoluzione nel tempo della sua
immagine.
o CREAZIONE, AVVIO, I.D.L. (Image Definition and Loading): è lo stato in cui si crea il
processo caricandolo da disco e preparando la sua immagine iniziale.
o PRONTO, READY: è lo stato in cui sono i processi che sono pronti ad utilizzare la CPU.
o ESECUZIONE, RUNING: è lo stato del processo corrente, cioè di quello che sta
utilizzando la CPU.
o ATTESA, BLOCCATO, WAITING: è lo stato dei processi che attendono il verificarsi di
un evento (tipicamente la fine di una operazione di I/O).
o SOSPESO, SU DISCO, SWAPPED: è lo stato dei processi la cui immagine è stata
mmentaneamente copiata su disco per far posto in memoria centrale a processi con priorità
maggiore.
o TERMINAZIONE, ZOMBI: è lo stato dei processi la cui esecuzione è terminata e che sono
in attesa di essere eliminati definitivamente dalla memoria centrale.
Zombi
i
Running
b
c d
Ready
a e
Waiting
f
I.D.L. gg g
h Swapped
Esiste una TABELLA dei PROCESSI generale che contiene, per ogni processo attivo,
l’identificatore del processo (PID), l’identificatore dell’utente cui è associato il processo (UID), lo stato
del processo (S), informazioni di scheduling (quali la priorità), gli indirizzi di memoria centrale e di
disco dei segmenti del processo, l’eventuale identificativo dell’evento in attesa del quale il processo è
bloccato.
Per quanto riguarda le Procedure RIENTRANTI (quelle il cui codice può essere spartito tra più
processi), esiste una TABELLA dei TESTI che contiene, per ogni procedura spartita (rientrante),
l’indirizzo in memoria centrale, l’indirizzo su disco, il numero dei processi che spartiscono la
procedura. Quando il numero dei processi che la utilizzano diventa va a 0 la procedura viene tolta dalla
memoria centrale.
I processi vengono creati tramite la primitiva di sistema fork. La fork, lanciata dal processo
corrente, provoca la scissione del processo in due processi indipendenti, padre e figlio, quasi identici
(spartiscono gli stessi files e i segmenti rientranti). Entrambi riprendono l’esecuzione dall’istruzione
successiva la fork. La fork restituisce al processo padre l’identificativo del figlio e 0 al processo figlio.
Il processo padre può attendere, per riprendere l’esecuzione, che il processo figlio termini. In questo
caso si pone in stato di attesa mediante la primitiva wait. Il processo figlio, mediante una primitiva
exec rimpiazza se stesso con una copia del programma da eseguire (cioè il codice e l’area dati del
processo figlio vengono rimpiazzati dal codice e dall’area dati del programma da eseguire). Il processo
figlio comunica la propria terminazione mediante la primitiva exit, che risveglia il processo padre.
La base della sincronizzazione è l’evento. Ad ogni evento è associata la lista dei processi che lo
attendono. Un processo può mettersi in attesa che si verifichi un certo evento, cioé autosospendersi,
mediante la primitiva sleep. Quando si verifica un evento vengono risvegliati tutti i processi che lo
attendono. Questo avviene mediante la primitiva wakeup.
Quando UNIX viene avviato (bootstrap) viene caricato in memoria centrale il kernel, vengono creati
due processi, swapper (o sched) - PID 0 - e init - PID 1 - che cessano di essere attivi solamente alla
chiusura del sistema (shutdown), viene installato lo spool. Swapper manda in esecuzione i procedimenti
del kernel e gestisce lo swapping dei programmi da memoria centrale a disco (si occupa dello scheduling
a livello intermedio). Init crea un processo (getty) per ogni terminale collegato dal quale un utente può
aprire una sessione di lavoro.
All’attivazione di unix si entra in modalità monoutente e successivamente si passa (ctrl d) in modalità
multiutenza. Prima di passare in multiutenza viene mandato in esecuzione un procedimento del kernel
che crea i processi update (per l’attualizzazione periodica, ad esempio ogni 30 secondi, dell’area
utilizzata dal file system) e cron (cioè la sveglia, il processo che si incarica di eseguire i comandi
collegati ad una determinata data ed ora quali at, crontab, etc.).
Tutti i processi shell sono figli di init (infatti hanno PPID 1). Anche i processi getty (attivi nei
terminali scollegati, in attesa di collegamento) sono figli di init (hanno PPID 1). Quando un utente si
collega da un terminale il processo getty del terminale genera un processo login che permette la
connessione dell’utente al sistema e manda in esecuzione la shell sh. Getty e Login terminano, mentre la
Shell resta collegata ad Init.
Quindi va in esecuzione la procedura /etc/profile che definisce l’ambiente di base comune a tutti gli
utenti e la procedura /usr/directory-di-login/.profile che definisce l’ambiente del singolo utente.
MEMORIA CENTRALE
La memoria centrale è gestita mediante la tecnica delle partizioni variabili con modalità first fit (si
sceglie la partizione libera di indirizzo più basso). Se un processo aumenta le dimensioni si cerca in m.c.
una partizione più grande per contenerlo. Se la si trova vi si copia il processo, altrimenti il processo
viene salvato su disco in attesa di essere ricaricato in m.c. Di questo si occupa il processo di sistema
Swapper.
INPUT/OUTPUT
Le unità di input/output vengono trattate come file. Tali unità hanno il proprio nome e si usano le
stesse operazioni di lettura/scrittura sia sui files che sulle unità di I/O.
Tutte le operazioni di I/O sono stream oriented (trattano stringhe che terminano con un delimitatore).
Ogni dispositivo è gestito da un particolare programma detto driver che risiede nella directory /dev.
Il disco viene gestito in blocchi di dimensione fissa (di 512 o 1024 o 2048 o 4096 byte). I blocchi
liberi sono gestiti mediante una lista libera. Quando si ha bisogno di un blocco per memorizzare un
file, viene preso il primo della lista libera; quando si liberano dei blocchi essi vengono inseriti in
testa alla lista libera (che viene gestita con modalità LIFO). In effetti unix non gestisce nella lista
direttamente i blocchi liberi, ma i puntatori ai blocchi liberi (blocchi indice).
I vari files sono memorizzati in blocchi non necessariamente contigui e saranno individuati dal
loro nome (dal punto di vista dell’utente) e dal numero dell’i-node loro associato (dal punto di vista
del sistema). I nomi dei file possono essere al massimo di 14 caratteri (maiuscole, minuscole, cifre,
“_” e “.”) e si possono utilizzare i caratteri jolly “*” e “?” (come in MS-DOS). Il pathname ha la
stessa struttura del pathname dell’MS-DOS, con l’unica differenza che invece del carattere “\” si
utilizza il carattere “/”.
Per ogni file il sistema mantiene una tabella i-node (index node), individuata dall’i-number, di
dimensione fissa, che contiene le informazioni relative al file: informazioni generali (tipo -
normale, speciale, directory -, permessi di accesso, numero di link - collegamenti - identificativo del
proprietario, identificativo del gruppo, dimensioni in bytes, data e ora creazione o ultima modifica,
data ultimo accesso, data ultima modifica dell’i-node) e informazioni di struttura sulla
collocazione fisica del file, diverse in funzione del tipo di file. La struttura del file è data da 13
puntatori ad altrettanti blocchi:
In totale si possono avere file di 10 + 128 + 1282 + 1283 = 2.113.674 × 512 = 1.082.201.088 byte
Ad ogni file è associato il proprio tipo ed i permessi (dell’utente, del gruppo, degli altri). Il tipo
di file può essere: “d” directory / “c” device / “-” normale. I permessi sono di lettura (“r” / “-”), di
scrittura (“w” / “-”), di esecuzione (“x” / “-”).
Ogni file, escluse le directories, può comparire, con lo stesso nome o anche con nomi diversi, in
più di una directory; ogni file ha cioé un nunico i-node, ma può avere nomi diversi. Il numero di link
specifica quanti riferimenti diversi si hanno per lo stesso file.
Il file system di Linux e Unix è organizzato in una struttura ad albero gerarchica. Il livello
più alto del file system è / (directory root). Nella filosofia di Unix e Linux, tutto è
considerato un file (inclusi i dischi fissi, le partizioni e i dispositivi rimovibili). Questo
significa che tutti gli altri file e directory (inclusi gli altri dischi e partizioni) esistono sotto
la directory root .
Per esempio, /home/mario/ubuntu.odt mostra il path assoluto al file ubuntu.odt presente
nella directory mario all'interno della directory home che a sua volta è contenuta nella
directory root (/).
All'interno della directory root (/) è presente un insieme di directory comuni a tutte le
distribuzioni Linux. Quello che segue è un elenco delle directory più comuni presenti nella
directory root (/):
Questi permessi sono associati all'inode che rappresenta i dati del file o della directory, e non al
nome del file, per cui due o più collegamenti fisici allo stesso inode avranno necessariamente gli
stessi permessi, anche se collocati in directory diverse.
Classi
A ciascun file e directory in un file system Unix viene assegnato un utente che ne è il
proprietario (solitamente il suo creatore). Per tale utente si applica la classe di permessi detta
utente.
Per tutti gli altri utenti che non ricadono nei due casi sopra elencati si applica invece la classe di
permessi detta altri. Gli ulteriori permessi sono applicati indipendentemente dalla classe.
• drwxrwxrwx - Segnala che il file è una directory (il tipo di file viene indicato prima delle
classi);
• -rwxrwxrwx - Gli attributi marcati in nero si riferiscono all'utente proprietario del file;
• -rwxrwxrwx - Gli attributi marcati in nero si riferiscono al gruppo di cui l'utente fa parte
(se non è il proprietario del file, ma fa parte del gruppo di utenti assegnato al file);
• -rwxrwxrwx - Gli attributi marcati in nero si riferiscono a tutti gli altri utenti o gruppi che
non sono quelli assegnati al file.
Permessi di base
I permessi di base, che si applicano nell'ambito delle tre classi sopra elencate, sono:
• lettura (r) – applicato ai file permette di leggerne il contenuto; applicato alle directory
consente di elencare i nomi dei file e delle sottodirectory che contengono;
• esecuzione (x) – applicato ai file permette di eseguirli; applicato alle directory permette di
attraversarle per accedere ai file ed alle sottodirectory in esse contenute (ma non di
elencarne il contenuto, per il quale serve anche il permesso di lettura).
Rappresentazione dei permessi
Esistono due rappresentazioni dei permessi sopra descritti: una simbolica ed una ottale.
Rappresentazione simbolica
Si tratta della rappresentazione usata dal comando ls -l, e consiste in una serie di 10 caratteri.
Il primo carattere indica il tipo di file o directory elencata, e non rappresenta propriamente un
permesso:
Esempi
• drwxr-xr-x indica una directory leggibile, scrivibile e attraversabile dal proprietario,
leggibile e attraversabile per il gruppo e per gli altri.
• drwx------ indica una directory leggibile, scrivibile e attraversabile dal proprietario, ma
inaccessibile per tutti gli altri.
• drwxrwxrwt indica una directory leggibile, scrivibile e attraversabile da tutti e con il
permesso sticky.
• -rw------- indica un file leggibile e scrivibile solo dal proprietario
• -rw-r--r-- indica un file leggibile da tutti, ma scrivibile solo dal proprietario
• -------r-- indica un file leggibile da tutti eccetto il proprietario e gli utenti appartenenti al
gruppo di utenti assegnato al file.
Rappresentazione ottale
La rappresentazione ottale dei permessi consiste in un numero di quattro cifre in base otto (da 0 a
7). Tutte le cifre eccetto l'ultima possono essere omesse, e si considerano pari a zero. Ad esempio
"750" equivale a "0750", mentre "5" equivale a "0005".
L'ultima cifra rappresenta la classe di permessi per gli altri, la penultima cifra la classe di
permessi per il gruppo, la terzultima cifra rappresenta la classe di permessi per il proprietario, e la
quartultima cifra rappresenta gli altri permessi. Solitamente si specificano numeri di tre o quattro
cifre.
Segui un elenco dei principali comandi di Linux. Un comando può avere una serie di
opzioni che solitamente sono indicate con il segno "-"
vncviewer
Impostazioni pc host
Per prima cosa bisogna impostare il pc a cui ci si vuole connettere (host). Andare su
Sistema > preferenze > Desktop remoto
Impostazioni pc server
-viewonly : con questa opzione non è possibile interagire sul computer remoto
$ vncviewer -viewonly -fullscreen Visualizza a pieno schermo ciò che avviene sul pc
192.168.100.1:0 con indirizzo 192.168.100.1
Per l’elenco dei comandi base della shell GNU/Linhx vedere anche:
wiki.ubuntu-it.org/AmministrazioneSistema/ComandiBase?action=show&redirect=ComandiBase
Gli esempi contenuti in questa guida sono volutamente banali, la maggior parte delle
seguenti operazioni possono essere svolte facilmente con pochi clic di mouse, ciò non
toglie che la conoscenza di alcuni concetti base può permettere anche agli utenti
tecnicamente meno preparati di riuscire a svolgere le procedure più comuni.
Per capire come funziona la riga di comando si prenda come modello un utente che
durante l'installazione, fra le varie cose, abbia impostato come nome utente mario e
come nome del computer mario-desktop.
A disposizione di tale utente, all'interno della cartella /home, ci sarà una cartella con il
suo stesso nome, cioè mario. Il suo percorso completo sarà /home/mario, che nel
terminale può essere sinteticamente rappresentato dal simbolo «~» chiamato tilde. Per
ottenerlo occorre premere i tasti AltGr+ì.
Tale cartella, alla quale è possibile accedervi dal Launcher o dalla Dash di Unity, è nota
anche come home utente. Essa riveste una grande importanza all'interno del sistema,
dato che al suo interno sotto forma di file nascosti, sono memorizzati tutti i file di
configurazione dei programmi.
Per visualizzare file nascosti, fare clic su Visualizza → Mostra file nascosti.
Per esempio, nella sottocartella ~/.mozilla vengono memorizzati i dati riguardanti il
browser Firefox: segnalibri, estensioni, impostazioni menu, etc.
Per nascondere un file è sufficiente preporre un punto prima del suo nome. Ad
esempio, per nascondere il file script.sh è sufficiente rinominarlo in .script.sh.
La directory /home/
È la directory che contiene tutte le Home degli utenti presenti nel sistema. Nel sistema
in figura è presente solo la Home dell'utente mario, ma aggiungendo utenti al sistema
verranno create le relative cartelle Home.
Nella directory /home/mario sono presenti alcuni file, alcuni memorizzati dall'utente
stesso e altri già presenti dalla prima installazione come, ad esempio, la directory
Scrivania che ovviamente andrà a contenere tutti i file, cartelle e icone di avvio presenti
sulla scrivania.
Digitare i comandi nel terminale
Aprendo un terminale l'utente mario otterrà un risultato simile al seguente:
Se nella cartella /home/ sono presenti degli utenti mario e michele, alla pressione del
tasto «Tab» non accadrà niente poichè ci si trova di fronte ad un'ambiguità. Premendo
una seconda volta il tasto «Tab» verrà stampato l'elenco dei file e delle directory che
iniziano per «m»; se successivamente si digita anche la lettera «a» l'ambiguità sarà
risolta, dunque premendo nuovamente «Tab» la stringa «mario» verrà completata. Se
oltre a mario e michele è presente anche maria, l'autocompletamento si bloccherà
correttamente a «/home/mari», e l'utente dovrà aggiungere l'ultima lettera.
Per velocizzare lo spostamento del cursore si possono usare alcune combinazioni con i
tasti sopracitati e i tasti «Fine» e «Home» (tasto con la freccia diretta in alto a sinistra).
Quelli che seguono sono degli esempi:
Combinazione Descrizione
Ctrl+Freccia destra sposta il cursore di una parola a destra
Ctrl+Freccia sinistra sposta il cursore di una parola a sinistra
Home (freccia obliqua) sposta il cursore all'inizio della stringa
Fine sposta il cursore alla fine della stringa
Comandi in memoria
I comandi impartiti rimangono in memoria. Per poterli richiamare è sufficiente usare i
tasti «Freccia su» (per lo scorrimento a ritroso) e «Freccia giù» (per lo scorrimento in
avanti).
In molte circostanze questa funzione può essere comoda per non dover riscrivere un
intero comando da capo o per modificarne solo una parte.
Percorsi
Per agire sui file occorre indicare sempre i percorsi completi oppure spostarsi all'interno
della cartella in cui si trova il file interessato. Supponiamo di voler rimuovere, attraverso
il comando rm, il file canzone.ogg, memorizzato in /home/mario/Scrivania. A tale scopo
è possibile digitare il seguente comando, nel quale viene specificato il percorso completo
del file:
rm /home/mario/Scrivania/canzone.ogg
In alternativa è possibile spostarsi nella cartella Scrivania per poi procedere alla
rimozione del file con i seguenti comandi:
cd /home/mario/Scrivania
rm canzone.ogg
Alcuni comandi non necessitano della digitazione di alcun percorso. Ad esempio, per
installare un pacchetto con apt-get è sufficiente specificarne solo il nome; la sintassi del
comando sarà dunque simile alla seguente:
sudo apt-get install nome_pacchetto
Spazi
Affinchè i comandi vengano correttamente eseguiti è necessario rispettare gli spazi
durante la digitazione. Nel'esempio precedente relativo alla cancellazione di un file è
stata rispettata la seguente forma:
comando [spazio] percorso_file
Più parole verranno incluse nel comando e maggiore sarà l'attenzione necessaria. Ad
esempio, supponendo di voler creare una copia del file
/home/mario/Scrivania/canzone.ogg in /home/mario/Scrivania/archivio_musica/
assegnando a tale copia il nome song.ogg, sarà utile digitare il seguente comando:
cp /home/mario/Scrivania/canzone.ogg
/home/mario/Scrivania/archivio_musica/song.ogg
Dall'esempio precedente si può notare come sia stata rispettata la seguente forma:
comando [spazio] percorso_file [spazio] percorso_file_copiato_con_nuovo_nome
Assegnare nomi a file e cartelle
La riga di comando può avere problemi a riconoscere nomi di cartelle contenenti simboli
di spaziatura. Ad esempio, il seguente comando non viene riconosciuto dal terminale:
cd /home/mario/cartella miei documenti
U N I X / L I N U X / U B U N T U - Prof.Claudio Maccherani - Perugia - 1995 / 2015- Pag.18
Il precedente comando verrebbe riconosciuto se digitato con questa formattazione,
facilmente ottenibile con l'uso del tasto «Tab»:
cd /home/mario/cartella\ miei\ documenti/
In alternativa è possibile inserire l'apostrofo all'inizio e alla fine del percorso, come nel
seguente comando:
cd '/home/mario/cartella miei documenti'
È consigliabile non inserire spazi all'interno dei nomi di file e cartelle. È preferibile
sostituire il carattere di spaziatura con quello di underscore «_».
Il carattere punto «.» viene usato per contraddistinguere un tipo di file, limitandone l'uso
si riduce il rischio di incorrere in ambiguità. Inoltre, come visto in precedenza, può essere
utilizzato anteponendolo al nome di un file che si desidera nascondere.
Immissione della parola d'ordine
La parola d'ordine viene richiesta quando si desidera eseguire un'azione con i privilegi di
amministrazione (vedi paragrafo SUDO). In questo modo si ha la possibilità di accedere a
cartelle non accessibili all'utente normale e modificare eventuali file di sistema.
Ad esempio, se si desidera modificare con l'editor di testo nano il file /etc/fstab è utile
digitare il seguente comando:
sudo nano /etc/fstab
Dopo la pressione del tasto «Invio» verrà richiesta la parola d'ordine:
Password:
Per motivi legati alla sicurezza, durante la digitazione della parola d'ordine non apparirà
alcun carattere nel relativo campo.
Stampa degli errori
Se i comandi digitati non contengono errori non verrà stampato alcun messaggio.
Il terminale non stampa le conferma dell'esecuzione dei comandi digitati, bensì solo
messaggi di errori nel caso che in tali comandi fossero presenti degli errori.
Per utilizzare nano digitare il seguente comando in una finestra di terminale: nano
I principali comandi di nano sono elencati in basso nella finestra appena viene avviato il
programma:
Per aprire un file di testo utilizzando l'editor nano è sufficiente digitare il seguente
comando in una finestra di terminale: nano nomefile
esempio: sudo nano /etc/apt/sources.list
in cui si desidera modificare un file che richiede i privilegi di amministrazione (vedi
SUDO).
A capo automatico
Per quanto detto sopra, è consigliabile modificare i file di configurazione con il parametro
-w che disabilita la suddetta funzione. Un esempio è il seguente:
sudo nano –w /etc/fstab
Privilegi amministrativi
È possibile utilizzare l'editor di testo in modo predefinito con i privilegi amministrativi, per
fare ciò digitare il seguente comando in una finestra di terminale:
sudoedit /etc/apt/sources.list
Nei sistemi operativi Unix e GNU/Linux c'è un utente particolare, detto super utente e contraddistinto
dall'avere un UID (User ID) uguale a 0 e nome utente root, che ha totale accesso al sistema senza
nessuna restrizione, cioè ne è l' amministratore.
Nella maggior parte dei sistemi GNU/Linux, l'amministratore del computer non usa l'utente
amministratore (per motivi di sicurezza) ma usa un utente normale per svolgere il lavoro quotidiano.
Quando ha la necessità di svolgere mansioni di amministrazione apre un terminale e avvia una sessione
come utente root, oppure se si trova già in un terminale come utente normale usa il comando su per
diventare utente root.
Ubuntu usa un sistema diverso per compiere operazioni amministrative, basato sull'utilizzo del
comando sudo. Con sudo l'utente non ha la necessità di ricordare per sempre la password, anche se
normalmente userà l'account root molto raramente. Inoltre, costringendo all'esecuzione controllata dei
singoli comandi, si evitano eventuali disattenzioni nell'utilizzo degli stessi, chiedendo la password nel
caso si stiano per lanciare comandi amministrativi e mantenendo un log completo dei comandi
eseguiti, permettendo l'analisi di ciò che è avvenuto nel sistema.
Di contro, se qualcuno scopre la password di un utente abilitato all'utilizzo di sudo come root in effetti
può facilmente ottenere accesso totale al sistema. Normalmente, le password utente sono più semplici
rispetto a quelle scelte per l'utente root e ciò può rivelarsi fonte di problemi; per tale ragione bisogna
prestare molta attenzione nella scelta delle password utente.
Se si ha abilitato l'account root e si utilizza su, per ottenere i privilegi di amministrazione è necessario
inserire due password, quella utente e quella dell'account root.
Quando in un sistema alcuni compiti amministrativi sono condivisi fra diversi account, l'utilizzo di
sudo evita di dover dare la password di root a vari utenti. L'amministratore può assegnare
temporaneamente a qualsiasi utente privilegi particolari, eliminandoli o limitandoli quando non vi è
più necessità.
Il comando SUDO
sudo (superuser do) consente di eseguire un comando come se si fosse un altro utente. Effettua una
specie di sostituzione, previa autorizzazione, tra l'utente attuale (colui che esegue il comando sudo) e
l'utente target (colui che esegue l'effettivo comando). Mentre con il comando su si cambia utente fino
al termine della sessione del terminale, sudo assegna i privilegi dell'utente target al solo processo che
viene con esso avviato.
Per eseguire dei comandi con privilegi d'amministrazione è sufficiente digitare sudo e successivamente
il comando che si desidera eseguire come utente root, come nel seguente esempio:
sudo nano /etc/modules
L'utente target non deve essere necessariamente l'amministratore, ma può essere un qualsiasi utente
del sistema. Per scegliere l'utente target, usare l'opzione -u:
sudo -u target comando
Una volta digitato il comando, il sistema chiederà la password dell'utente attuale e non la password
dell'utente target (a meno che non si configuri sudo in modo diverso). La password viene chiesta la
prima volta e memorizzata per un certo lasso di tempo, quindi è possibile usare il comando sudo più
volte consecutive senza dover inserire ogni volta la password.
Per motivi di sicurezza il terminale non mostra nessun carattere di inserimento della password.
A differenza delle richieste grafiche, nel terminale non vengono mostrati nemmeno gli asterischi
di mascheramento. Digitare correttamente la password e premere «Invio».
Opzione Risultato
imposta la variabile di sistema «$HOME» con la cartella Home dell'utente target, cioè
-H quello che eseguirà il comando, normalmente root; in maniera predefinita sudo lascia
inalterata la «$HOME»
serve a eliminare il salvataggio della password per l'utente; al successivo utilizzo di sudo
-k
verrà nuovamente richiesta la password
consente di entrare nella riga di comando come utente target simulando l'accesso per il
-i nuovo utente e impostando le variabili d'ambiente; in pratica consente all'utente di diventare
root e quindi non dover utilizzare sudo ad ogni successivo comando
consente di entrare nella riga di comando come utente target; questa opzione è quasi
-s
identica a -i, ma non imposta le variabili d'ambiente dell'utente target
Abilitare l'accesso come utente root
In Ubuntu, in modo predefinito, l'accesso come utente root è disabilitato, impedendo così l'utilizzo di
su, ma permettendo comunque l'utilizzo di sudo. Questa scelta è dovuta a motivi di sicurezza.
Se strettamente necessario, è possibile abilitare l'accesso come utente root assegnandogli una password
con il seguente comando: sudo passwd root
La prima password richiesta è quella per sudo, successivamente verrà richiesta la password per l'utente
root e la successiva conferma.
• «elenco_host»: i nomi delle macchine da cui è consentito utilizzare sudo. Si può usare anche un
alias definito per gli host. Possono essere inserite varie voci, separando ciascuna con una
virgola «,». Con «ALL» si consente l'uso di sudo da qualsiasi host;
• «(user_target)»: è un parametro opzionale con cui si dice a sudo di eseguire i comandi come
utente user_target invece che root;
• «elenco_comandi»: l'elenco dei comandi a cui si da autorizzazione; si può usare anche un alias definito per i
comandi. Possono essere inserite varie voci, separando ciascuna con una virgola «,». Con «ALL» si consente
l'esecuzione di qualsiasi comando. Inoltre, si può anche inserire il nome di una directory, terminando il percorso
con uno slash «/» per indicare tutti i comandi contenuti in quella directory;
Con la parola chiave «NOPASSWD» è possibile può indicare a sudo che per i comandi definiti
successivamente non è richiesto l'inserimento della password. Inoltre, si può negare l'esecuzione di un
comando, o un gruppo di comandi, inserendo prima di «elenco_comandi» un punto esclamativo «!».
Questa modalità è comunque sconsigliata in quanto è sempre possibile aggirare la negazione
rinominando il comando.