Corso Linux / Utenti, gruppi e proprietà dei file: leggere UID e GID

Linux associa un identificatore utente (UID, user ID) a un account e un identificatore di gruppo (GID, group ID) a un gruppo. Ogni file registra un utente e un gruppo proprietari; un account può avere un gruppo primario e gruppi supplementari. Per leggere questi rapporti usa id, groups, getent e ls -l: in questa lezione esaminerai le informazioni senza modificare account o proprietari.

Controllare account e gruppi prepara alla lettura di proprietà e permessi di accesso (lezione in inglese). Prima di diagnosticare un problema di accesso, considera perché una modifica ai gruppi può richiedere una nuova sessione di login.

Che cosa significano UID e GID

Un nome leggibile, come learner, corrisponde a un UID numerico. Anche un gruppo ha un nome e un GID. Il gruppo primario è quello indicato nei dati dell’account; i gruppi supplementari rappresentano ulteriori appartenenze. Le decisioni di accesso combinano proprietario, gruppo, bit dei permessi e altre regole del sistema: appartenere a un gruppo non consente automaticamente di leggere o modificare tutti i suoi file.

root è il nome normalmente associato all’account amministratore con UID 0. Non presumere che UID e GID degli utenti ordinari inizino sempre da 1000: i valori dipendono dal sistema e dalle regole di creazione degli account.

Controllare utente e gruppi della sessione corrente

Questi comandi si possono eseguire come utente ordinario e non modificano l’account. Senza un nome utente come argomento, id descrive l’identità del processo corrente. id -un mostra il nome dell’utente effettivo, id -gn quello del gruppo effettivo e id -nG i nomi dei gruppi del contesto corrente. In una normale sessione di login, il gruppo effettivo coincide abitualmente con il gruppo primario dell’account; processi eseguiti con credenziali particolari possono differire.

id
id -un
id -gn
id -nG
groups

Un risultato puramente illustrativo di id è uid=1000(learner) gid=1000(learner) groups=1000(learner),10(wheel). Nomi, numeri e gruppi reali variano. Qui gid=... indica il gruppo del processo e groups=... i gruppi applicati al contesto corrente: non copiare questi valori come se descrivessero il tuo sistema.

groups fornisce una lista più breve dei nomi dei gruppi. Se un amministratore ha appena cambiato le appartenenze, una sessione di login già aperta può mantenere la lista precedente. Distingui i dati configurati per l’account dai gruppi attivi nel processo; dopo una modifica autorizzata, una nuova sessione di login permette normalmente di acquisire le nuove appartenenze. Prima di chiudere una sessione remota, conserva un modo di accesso funzionante.

Se il sistema non riesce a risolvere il nome di un ID, potresti vedere un numero o una diagnosi di lookup fallito. Questo non autorizza a ricreare il gruppo o a cambiare il proprietario: controlla prima i numeri e la disponibilità del servizio di nomi. id -u, id -g e id -G permettono di leggere rispettivamente UID effettivo, GID effettivo e lista dei GID senza richiedere i nomi.

Interrogare i dati degli account con getent

getent interroga database come quelli di utenti e gruppi attraverso il Name Service Switch (NSS), il meccanismo di scelta delle fonti usato dalla libreria GNU C e da altre applicazioni. A seconda della configurazione, i risultati possono provenire da file locali o servizi di directory esterni. Per questo la lettura del solo /etc/passwd può non rappresentare tutti gli account risolti dal sistema.

Verifica prima che id -un e id -gn restituiscano nomi validi senza errori, poi interroga l’account e il gruppo così identificati:

getent passwd "$(id -un)"
getent group "$(id -gn)"

La forma $(...) sostituisce l’output del comando interno; le virgolette mantengono il risultato come un solo argomento. Se la risoluzione interna fallisce, fermati e analizza la diagnosi prima di interpretare il risultato di getent. Il gruppo interrogato è quello riportato da id -gn, che nelle normali sessioni corrisponde al primario, ma non è una lettura indipendente del campo GID dell’account.

Una riga di getent passwd contiene normalmente campi separati da due punti: nome, campo password o segnaposto, UID, GID primario, descrizione, home e shell di login. Non significa che una password in chiaro debba comparire nella riga. getent group mostra nome del gruppo, relativo campo password, GID e lista dei membri. Quest’ultima non elenca necessariamente tutti gli utenti che usano quel gruppo come primario: non considerarla una lista completa delle appartenenze.

Per conoscere i gruppi del processo corrente usa id senza argomenti; interrogare un utente per nome consulta invece le informazioni dell’account e può riflettere aggiornamenti non ancora presenti nella sessione. Un risultato vuoto di getent non prova da solo l’assenza dell’account: controlla subito lo stato di uscita e i servizi di nomi. Nel comando GNU descritto dal manuale, lo stato 2 indica che almeno una chiave richiesta non è stata trovata.

Un’installazione minima può non includere getent, oppure usare strumenti diversi secondo libc e distribuzione. Consulta quelli disponibili nell’ambiente; non modificare direttamente /etc/passwd o /etc/group per tentare di risolvere un problema di lettura.

Leggere utente e gruppo proprietari di un file

Crea un file di esercitazione. Se ~/linux-course-16-practice esiste già, scegli un nome nuovo e usalo in entrambe le righe. Esegui una riga alla volta e fermati se mkdir o cd fallisce. Controlla che pwd mostri la directory appena creata prima di eseguire touch: il solo output di pwd non dimostra il successo del precedente cd. Su un file esistente touch può cambiare le date.

mkdir ~/linux-course-16-practice
cd ~/linux-course-16-practice
pwd
touch own.txt
ls -l own.txt

Nell’output lungo di ls, i due campi dopo permessi e numero di collegamenti identificano normalmente utente e gruppo proprietari. Il file appena creato è vuoto, ma nome del proprietario, gruppo e date dipendono dal tuo ambiente. Il gruppo di un file nuovo può dipendere dalle impostazioni della directory padre, per esempio il bit setgid, e dal comportamento del filesystem: non presumere che coincida sempre con il gruppo primario dell’account.

GNU stat può mostrare nomi e ID numerici su una riga. %U e %G indicano i nomi di utente e gruppo proprietari, %u e %g i rispettivi ID e %n il nome del file:

stat -c '%U | %G | %u | %g | %n' own.txt

Un risultato possibile è learner | learner | 1000 | 1000 | own.txt, ma leggi i tuoi valori reali. Se un nome non è risolto, conserva gli ID numerici per la diagnosi; puoi confrontarli anche con ls -ln own.txt. La proprietà registra chi possiede il file, mentre i permessi e le altre regole di accesso stabiliscono quali operazioni sono consentite. Questa prova non esegue chown né cambia gruppi o permessi.

Tre distinzioni da tenere separate

  • Nome utente e UID: il nome serve a visualizzazione e lookup; il sistema usa anche l’identificatore numerico.
  • Gruppo primario e gruppi supplementari: il dato primario dell’account e i gruppi presenti in un processo sono informazioni collegate, da verificare nel contesto.
  • Database e sessione corrente: cambiare i dati dell’account non aggiorna necessariamente i gruppi di una sessione già aperta.

Per indagare un problema di permessi, leggi prima utente e gruppi con id, poi proprietario e gruppo del file con ls -l o stat. Confronta le informazioni prima di esaminare i permessi. File, directory attraversate, liste di controllo degli accessi e altri vincoli del sistema possono richiedere ulteriori verifiche: l’appartenenza a un gruppo è solo una parte del quadro.

Documentazione ufficiale

I manuali GNU distribuiti da Debian di id, groups, ls e stat descrivono le opzioni di lettura. I manuali Linux getent(1) e nsswitch.conf(5) spiegano interrogazioni, risultati e scelta delle fonti per i nomi.