title: Chmod
text: # Chmod
  
  chmod (abbreviazione dalla lingua inglese di change mode, cambio modalità) è un comando dei sistemi operativi Unix e Unix-like, e più in generale dei sistemi POSIX, che è utilizzato per modificare i permessi di accesso di file e directory. È anche usato per cambiare alcuni flag che identificano modalità speciali come setuid, setgid e lo sticky bit. L'invocazione di chmod per soddisfare la richiesta effettuata di cambiare i permessi risente del filtro applicato da umask.
  
  chmod è anche il nome di una chiamata di sistema, definita dallo standard POSIX, che modifica i permessi di un file o directory. Di fatto il comando chmod opera invocando l'omonima chiamata di sistema. Il comando è apparso per la prima volta nella prima versione Unix di AT&T ed è presente nei sistemi operativi Unix e Unix-like.
  
  ## Sintassi
  
  La sintassi generale di chmod è la seguente:
  
  chmod [opzioni] [--] modalità file1 [file2 ...]
  
  Il parametro modalità indica le modifiche da applicare ai permessi.
  
  Il doppio trattino -- (facoltativo) indica che i parametri successivi non sono da considerarsi opzioni.
  
  Alcune opzioni di solito implementate sono:
  
  * -R Ricorsivo, cioè include gli oggetti delle sottodirectory.
  * -v verboso, mostra i cambiamenti effettuati agli oggetti (gli oggetti non modificati non vengono mostrati).
  
  ## Collegamenti simbolici
  
  I collegamenti simbolici non hanno mai permessi propri, essendo solo riferimenti per nome ad un altro file, e a tutti gli effetti si può considerare che abbiano i permessi del file o della directory a cui si riferiscono.
  
  È al limite possibile, in alcuni sistemi, dare opzioni per il cambiamento ricorsivo dei permessi seguendo anche i collegamenti simbolici (ad es. nel caso dei sistemi di derivazione BSD come FreeBSD, OpenBSD e NetBSD, e anche macOS).
  
  ### Esempi
  
  **Rappresentazione simbolica**
  
  * chmod "u=rwx","g=rx","o=x" nomeFile
  * chmod "o=+rx" nomefile
  * chmod "u=+rwx","go=-" nomefile
  * chmod "u=+rwS","go=-" nomefile
  
  Per il significato di S vedi anche gli altri permessi Unix.
  
  **Rappresentazione ottale**
  
  Nella rappresentazione ottale ogni cifra indica i permessi per i differenti utenti.
  
  * chmod UGO nomefile
  
  La cifra U rappresenta il livello di permessi per l'utente, G il livello di permessi del gruppo e O il livello di permessi generale
  
  La tabella seguente indica il significato dei singoli valori
  
  | Valore binario (rwx) | Valore decimale | Permessi |
  | - | - | - |
  | 111 | 7 | lettura, scrittura ed esecuzione |
  | 110 | 6 | lettura e scrittura |
  | 101 | 5 | lettura ed esecuzione |
  | 100 | 4 | solo lettura |
  | 011 | 3 | scrittura ed esecuzione |
  | 010 | 2 | solo scrittura |
  | 001 | 1 | solo esecuzione |
  | 000 | 0 | nessuno |
  
  Esempi:
  
  * chmod 734 nomefile
  
  assegna tutti i permessi all'utente, scrittura ed esecuzione per il gruppo e solo lettura per tutti gli altri.
  
  * chmod 777 nomefile
  
  assegna tutti i permessi all'utente corrente, al suo gruppo ed anche a tutti gli altri.
  
  * chmod -R 777 nomedirectory
  
  come il precedente ma riguarda una directory e tutti i file esistenti all'interno della stessa.
  
  ### Modalità
  
  La modalità è una stringa che indica come impostare o modificare i permessi dei file e delle directory specificate. Può essere espressa come numero ottale, o in forma simbolica.
  
  **Modalità numerica ottale**
  
  È un numero composto da una a quattro cifre ottali (ad es 640 o 4755), secondo la rappresentazione ottale dei permessi, che indica direttamente i permessi da attribuire al file senza tener conto di quelli già presenti.
  
  Ad esempio un permesso 755 imposta lettura, scrittura ed esecuzione (7) per il proprietario (prima cifra), e lettura ed esecuzione (i due 5) per gruppo (seconda cifra) ed altri (terza cifra).
  
  **Modalità simbolica**
  
  È una serie di uno o più valori testuali separati da virgola.
  
  Ogni valore è a sua volta composto di tre parti:
  
  * una prima parte composta da zero o più lettere che selezionano le classi (proprietario, gruppo, altri) per cui si vuole modificare il permesso:
     * u – seleziona la classe relativa al proprietario
     * g – seleziona la classe relativa al gruppo
     * o – seleziona la classe relativa agli altri utenti
     * nessuna lettera o a – seleziona tutte le classi
  * una seconda parte composta da un singolo carattere che indica se i permessi dovranno essere aggiunti, rimossi o impostati per le classi selezionate:
     * + – aggiunge permessi specificati alle classi selezionate; non rimuove permessi già concessi ma non specificati
     * = – imposta i permessi specificati nelle classi selezionate; rimuove eventuali permessi già concessi ma non specificati
     * - – rimuove i permessi specificati dalle classi selezionate
  * una terza parte composta da zero o più lettere (es. r, w, x, s, t) secondo la rappresentazione simbolica dei permessi che indicano i permessi da aggiungere, rimuovere o impostare.
  
  Esempi di modalità espresse in maniera simbolica sono "ugo=rwx", "u=rwx,go=r", "+x".
  
  **Esempi di modalità**
  
  * 0755 – imposta lettura, scrittura ed esecuzione per il proprietario, e lettura ed esecuzione per gruppo ed altri (comune per le directory e per i file eseguibili);
  * 0700 – imposta lettura, scrittura ed esecuzione per il proprietario, nessun permesso per il gruppo e per gli altri (comune per le directory private);
  * 0600 – imposta lettura e scrittura per il proprietario, e nessun permesso per il gruppo e per gli altri (comune per file di dati personali);
  * 0640 – imposta lettura e scrittura per il proprietario, solo lettura per il gruppo e nessun permesso per gli altri (comune per file di dati da condividere);
  * +r – aggiunge il permesso di lettura per il proprietario, per il gruppo e per gli altri. Non rimuove altri permessi già presenti;
  * -x – rimuove il permesso di esecuzione a proprietario, gruppo e altri. Non rimuove altri permessi già presenti;
  * u=rx – imposta il permesso di lettura ed esecuzione al proprietario, rimuovendo eventuali permessi di scrittura già presenti; non altera i permessi per gli altri;
  * u=rx,go= – imposta il permesso di lettura ed esecuzione al proprietario, rimuovendo un eventuale permesso di scrittura già presente; rimuove tutti i permessi esistenti per il gruppo e per gli altri.
  
  ## La chiamata di sistema chmod
  
  La chiamata di sistema chmod è dichiarata nello header file sys/stat.h:
  
  Il tipo mode_t è un tipo opaco (solitamente un tipo numerico intero) che rappresenta dei permessi d'accesso.
  
  Il parametro path indica il nome del file o directory di cui cambiare i permessi.
  
  Il parametro mode indica i permessi da assegnare al file o directory.
  
  ### Valore di ritorno
  
  Il valore di ritorno è 0 in caso di successo. In caso di errore è -1, e la variabile errno indica l'errore specifico.
  
  