SSD Nodes Learn 🎉 VPS da $5.50/mese
Guide Matt ConnorDi Matt Connor · Aggiornato 2026-08-13

drwxr-xr-x: significato dei permessi Linux

Scopri cosa significa drwxr-xr-x, come si legge carattere per carattere e perché corrisponde a 755. Capisci anche x sulle directory e perché chmod 777 è sbagliato.

Che cosa significa drwxr-xr-x

drwxr-xr-x descrive una directory che il proprietario può modificare e che tutti gli altri utenti possono leggere e attraversare senza modificarla. In ottale, questa modalità è 755. Linux stampa questi dieci caratteri all’inizio di ogni riga dell’output di ls -l e hanno sempre lo stesso significato nello stesso ordine. Imparare una stringa consente quindi di interpretarle tutte.

Una regola viene prima delle altre, perché determina se i test eseguiti forniscono informazioni utili. L’utente root ignora i bit dei permessi. Il kernel assegna a root la capability CAP_DAC_OVERRIDE (override del controllo discrezionale degli accessi), quindi root apre anche i file la cui modalità lo vieta. Ogni esempio in questa pagina riesce per root, indipendentemente dai bit impostati. Accedi con un utente normale quando vuoi osservare il funzionamento effettivo delle regole.

I dieci caratteri, uno alla volta

Crea una directory e un file da esaminare. Nulla di quanto segue modifica elementi esterni alla nuova directory.

mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txt

Con il valore predefinito comune di umask, 022, le due righe relative alle directory iniziano con drwxr-xr-x, mentre la riga relativa al file inizia con -rw-r--r--.

Il carattere 1 indica il tipo di file, non un permesso. d indica una directory. - indica un file normale. l indica un collegamento simbolico. c e b indicano rispettivamente i nodi di dispositivo a caratteri e a blocchi. s indica un socket e p una named pipe. Questo carattere è esterno al valore ottale; per questo drwxr-xr-x diventa 755 e non inizia con d.

I nove caratteri successivi sono divisi in tre gruppi di tre e l'ordine non cambia mai.

  • I caratteri da 2 a 4 formano la terna del proprietario, cioè i bit applicati all'utente proprietario del file.
  • I caratteri da 5 a 7 formano la terna del gruppo, cioè i bit applicati al gruppo del file.
  • I caratteri da 8 a 10 formano la terna degli altri, cioè i bit applicati a tutti gli altri utenti.

All'interno di una terna, le posizioni sono sempre r, poi w e infine x. Un trattino indica che il bit è disattivato. Le lettere non cambiano mai posizione. r-x indica il permesso di lettura senza scrittura. -w- indica il permesso di scrittura senza lettura; è consentito, ma raro.

Quindi drwxr-xr-x si divide nel modo seguente: d per la directory, poi rwx per il proprietario, quindi r-x per il gruppo e infine r-x per gli altri.

Alcuni sistemi visualizzano un undicesimo carattere. Un punto finale, drwxr-xr-x., indica che il file contiene un contesto SELinux (security enhanced Linux); distribuzioni che includono SELinux, come Fedora e Rocky, lo visualizzano per impostazione predefinita. Un segno più finale, drwxr-xr-x+, indica che il file contiene una ACL POSIX (access control list), cioè un insieme aggiuntivo di regole oltre a questi nove bit. Per leggere queste regole aggiuntive, usa getfacl <path>.

r, w e x svolgono funzioni diverse su una directory

Questa è la prima regola che i principianti interpretano in modo errato. Le lettere sono le stesse per un file e per una directory. I permessi che concedono sono diversi.

  • r su un file legge il contenuto. r su una directory elenca i nomi al suo interno, che è ciò di cui ha bisogno un semplice ls.
  • w su un file modifica il contenuto. w su una directory aggiunge e rimuove le voci al suo interno. L'eliminazione di un file modifica la directory, quindi è il permesso di scrittura sulla directory a determinarla; la modalità del file non influisce.
  • x su un file lo esegue come programma. x su una directory la attraversa, consentendo al kernel di risolvere un nome al suo interno durante la ricerca di un percorso.

L'attraversamento è l'aspetto che sorprende più spesso. x su una directory non esegue nulla. Per aprire /srv/site/index.html servono x su /, poi x su /srv, quindi x su /srv/site e infine r sul file. Se una directory della catena non dispone di x per l'utente corrente, la ricerca si interrompe in quel punto e al chiamante viene restituito Permission denied per l'intero percorso, anche quando il file finale è leggibile da tutti. namei -l /srv/site/index.html stampa ogni passaggio della catena con relativa modalità e proprietario, così è possibile vedere quale elemento interrompe la ricerca.

Una directory con r e senza x è uno stato intermedio insolito, ma utile da riconoscere. Un utente normale può elencare i nomi, perché è questo che concede r, ma non può eseguire stat su alcuna voce. Di conseguenza, ls -l riempie le colonne relative a dimensione e modalità con punti interrogativi e stampa ls: cannot access ...: Permission denied per ciascuna voce.

Trasformare le lettere in 755

Ogni triade è un numero a 3 bit. r vale 4, w vale 2 e x vale 1. Somma i bit attivi.

  • rwx vale 4 + 2 + 1 = 7
  • rw- vale 4 + 2 = 6
  • r-x vale 4 + 1 = 5
  • r-- vale 4
  • --- vale 0

drwxr-xr-x vale quindi 7 per il proprietario, 5 per il gruppo e 5 per gli altri utenti: 755. -rw-r--r-- vale 6, 4, 4: 644. drwxrwxr-x vale 7, 7, 5: 775, cioè 755 con il permesso di scrittura aggiunto al gruppo. Non devi mai contare i caratteri manualmente, perché stat stampa entrambe le forme contemporaneamente.

stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt

%A è la forma alfabetica, %a è il valore ottale e %U e %G indicano rispettivamente l'utente proprietario e il gruppo proprietario.

Le stringhe dei permessi più cercate

Queste sono le modalità che si incontrano su un server reale, con il valore ottale e il contesto in cui ciascuna viene utilizzata.

  • -rw-r--r-- corrisponde a 644. File ordinari che un servizio deve soltanto leggere, ad esempio un file di configurazione o una pagina HTML.
  • -rw------- corrisponde a 600. Secret, ad esempio una chiave privata SSH o il file .env di un'applicazione.
  • -rw-rw-r-- corrisponde a 664. Un file in una directory condivisa con un gruppo, in cui i membri del gruppo devono poter scrivere.
  • -rwxr-xr-x corrisponde a 755. Script e binari, ad esempio /usr/local/bin/backup.sh e la maggior parte di /usr/bin.
  • -rwx------ corrisponde a 700. Uno script privato che soltanto il proprietario può eseguire.
  • drwxr-xr-x corrisponde a 755. Quasi tutte le directory di sistema e la document root di un sito web.
  • drwx------ corrisponde a 700. ~/.ssh e le directory home su un sistema con accesso limitato.
  • drwxrwxr-x corrisponde a 775. Una directory in cui il gruppo del proprietario può scrivere.
  • drwxrwsr-x corrisponde a 2775. Lo stesso caso, con in più il bit setgid, così i nuovi file al suo interno ereditano il gruppo della directory.
  • drwxrwxrwt corrisponde a 1777. /tmp. L'ultimo t è lo sticky bit, quindi un utente può eliminare soltanto i propri file.
  • -rwsr-xr-x corrisponde a 4755. Un binario setuid che viene eseguito con l'identità del proprietario, ad esempio /usr/bin/passwd e /usr/bin/sudo.
  • -rw-rw-rw- corrisponde a 666 e drwxrwxrwx corrisponde a 777. Scrivibili da chiunque; su un server, questo è quasi sempre un errore.
  • lrwxrwxrwx è ciò che mostra ogni symbolic link. Linux ignora i bit di modalità del link e controlla invece la destinazione, quindi questa stringa non ha alcun significato.

Quale triade si applica al tuo caso

Questa è la seconda regola che i principianti interpretano in modo errato. Il kernel seleziona esattamente una triade e si ferma.

Se il tuo ID utente corrisponde al proprietario del file, ottieni la triade del proprietario e i bit del gruppo e degli altri utenti non vengono mai consultati. In caso contrario, se il gruppo del file è uno dei tuoi gruppi, ottieni la triade del gruppo. Altrimenti ottieni la triade degli altri utenti.

Da questo derivano due conseguenze. La triade del proprietario si applica anche quando è quella più restrittiva. Un file con modalità 0466, visualizzato come -r--rw-rw-, concede al proprietario soltanto il permesso di lettura, mentre tutti gli altri possono scrivere, perché il controllo del proprietario ha avuto esito positivo per primo e il kernel non ha consultato i bit successivi. È un comportamento valido e confonde chi lo incontra per la prima volta.

La triade del gruppo viene quindi scelta in base al gruppo del file, non all'elenco dei gruppi a cui appartieni. ls -l stampa due nomi su ogni riga: prima il proprietario, poi il gruppo. Solo quel secondo gruppo ha effetto sui permessi del file. Appartenere a venti gruppi è utile soltanto se il file appartiene a uno di questi gruppi.

id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txt

id stampa il tuo utente e tutti i gruppi a cui appartieni. stat stampa il proprietario e il gruppo del file. Confrontando i due output, puoi sapere quale triade userà il kernel per te.

Per questo una directory condivisa viene solitamente associata a un gruppo e al bit setgid. sudo chmod 2775 /srv/shared viene visualizzato come drwxrwsr-x, e i file creati al suo interno ereditano quindi il gruppo della directory invece del gruppo personale dell'utente che li crea, permettendo all'utente successivo di modificarli. Assegnare a ogni servizio un account dedicato completa questo approccio ed è illustrato in un utente Linux per ogni servizio su un VPS.

umask determina i permessi di ogni nuovo file

Un nuovo file non eredita i permessi dall’utente. Li riceve dal programma che lo crea, meno i bit rimossi da umask. umask è una maschera di bit da rimuovere: un valore più alto produce file più riservati.

La maggior parte delle distribuzioni viene fornita con il valore 022. Un programma che crea un file normale richiede 0666. Un programma che crea una directory richiede 0777. umask rimuove 022 da entrambe le richieste, quindi i file ricevono 644 e le directory 755. È esattamente la coppia di valori che si trova comunemente in un VPS appena installato.

umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdir

umask -S stampa lo stesso valore usando lettere, un formato più leggibile di 0022. Impostare umask 027 in ~/.profile applica un valore predefinito più restrittivo: 640 per i file e 750 per le directory. In questo modo il gruppo può leggere il proprio lavoro, mentre gli altri utenti non possono accedervi.

Sono importanti due limiti. umask può soltanto rimuovere bit, non aggiungerli. Per questo un file appena creato non è mai eseguibile, indipendentemente dal valore impostato. Inoltre, un servizio systemd non legge il profilo della shell. Il valore deve quindi essere impostato nel file dell’unità.

[Service]
UMask=0027

Perché i file web sono 644 e le directory web sono 755

Un web server viene eseguito con un account dedicato: www-data su Debian e Ubuntu, nginx su Rocky e Alma. Il processo deve poter leggere i file che pubblica e attraversare le directory che li contengono. Non ha motivo di modificarli e un sito statico non dovrebbe mai consentirlo.

Su un file, 644 assegna la scrittura al proprietario e la lettura a tutti, quindi l'utente di deploy può pubblicare i file e l'utente del web server può servirli. Su una directory, 755 assegna la scrittura al proprietario e il permesso di attraversamento a tutti, quindi l'utente del web server può percorrere il percorso senza poter aggiungere o eliminare elementi. Un bug nell'applicazione non può quindi riscrivere le pagine che sta pubblicando.

La regola dell'attraversamento è determinante proprio in questo caso. Se il sito si trova in /home/deploy/site e /home/deploy ha permessi 750, l'utente del web server non può accedere alla directory home e la richiesta termina con HTTP 403, accompagnato da una riga come questa in /var/log/nginx/error.log:

open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5

Quel 13 è EACCES, il rifiuto dei permessi da parte del kernel. La rete funziona: la porta è in ascolto e la richiesta è arrivata. Questo rende il problema difficile da interpretare quando si sta ancora imparando come funzionano le porte in ascolto su Linux. Esegui namei -l /home/deploy/site/index.html e percorri la catena fino a trovare la prima directory priva di x per gli altri utenti.

Una directory in cui l'applicazione scrive, ad esempio un percorso per gli upload, è un'eccezione. Concedi l'accesso tramite la proprietà invece di usare una modalità più permissiva: sudo chown -R www-data:www-data /srv/site/uploads e mantieni la modalità a 755. Limita l'accesso in scrittura alla sola directory che ne ha bisogno.

chmod, senza appiattire l'intero albero

chmod accetta entrambe le forme. La sintassi ottale imposta tutti e nove i bit in una volta: chmod 644 notes.txt. La sintassi simbolica modifica soltanto ciò che si specifica e lascia invariato il resto: chmod u+x deploy.sh aggiunge il permesso di esecuzione per il proprietario, mentre chmod go-w notes.txt rimuove il permesso di scrittura per il gruppo e gli altri utenti.

La ricorsione è il punto in cui gli alberi possono danneggiarsi. chmod -R 755 . rende eseguibili tutte le immagini e tutti i file di configurazione, perché chmod non distingue uno script da un file JPEG. Usa invece la X maiuscola.

chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txt

X maiuscola applica il permesso di esecuzione alle directory e ai file che avevano già un bit di esecuzione impostato. Le directory risultano con permessi 755, i file ordinari con permessi 644 e gli script già eseguibili mantengono tale impostazione. Quando un file ha già una modalità di cui ti fidi, chmod --reference=good.sh other.sh la copia sugli altri file.

I messaggi visualizzati quando un bit è errato

bash: ./deploy.sh: Permission denied indica che lo script non dispone del bit x nella terna applicabile al proprio caso, oppure che una directory del relativo percorso non dispone del bit x. chmod u+x deploy.sh risolve il primo caso.

bash: ./deploy.sh: cannot execute: required file not found indica un errore diverso, con un nome fuorviante. Il bit x è corretto, ma manca l'interprete indicato nella prima riga. La causa più comune sono i caratteri di fine riga Windows; il kernel cerca quindi un interprete chiamato /bin/bash\r. Correggere il problema con sed -i 's/\r$//' deploy.sh.

Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open. proviene dal client SSH, che rifiuta di usare una chiave privata leggibile da altri account. La chiave deve avere i permessi 600 e ~/.ssh deve avere i permessi 700. La gestione completa delle chiavi è descritta in gestione delle chiavi SSH e dei relativi permessi sui file.

Authentication refused: bad ownership or modes for directory /home/deploy/.ssh compare nel journal del server quando una directory home o il relativo .ssh è scrivibile dal gruppo. L'impostazione StrictModes di sshd rifiuta la chiave; dal lato client questo si manifesta come una richiesta imprevista della password, senza spiegazioni.

sudo: /etc/sudoers is world writable, seguito da sudo: no valid sudoers sources found, quitting, indica che sudo ha controllato i permessi della propria configurazione e ha rifiutato di avviarsi. Il file deve avere i permessi 0440. Questa è la conseguenza tipica di un ampio chmod ricorsivo e può comparire insieme al messaggio di sshd precedente, lasciando la console del provider come unico modo per accedere nuovamente al server.

Perché 777 non è una soluzione

777 concede l'accesso in scrittura a ogni account della macchina e a ogni processo eseguito da uno di questi account. Su un server, i servizi vengono eseguiti con account dedicati. Pertanto, su un VPS il termine "tutti" comprende molti più soggetti rispetto a un laptop. Un servizio compromesso può scrivere in qualsiasi percorso per il quale 777 concede l'accesso.

All'interno di una web root, il rischio è diretto. Se una directory scrivibile da tutti viene anche pubblicata dal server web, una vulnerabilità nel caricamento dei file può consentire di installare uno script e richiamarlo in seguito.

777 è quasi sempre la risposta sbagliata a un problema di ownership. Il sintomo è: "l'applicazione non può scrivere in questa directory". La causa è che la directory appartiene all'utente sbagliato. sudo chown -R appuser:appuser /srv/app/storage con modalità 755 risolve il problema e impedisce l'accesso a tutti gli altri account. La creazione di questi account prima del deployment appartiene a i primi dieci minuti su un nuovo VPS.

La scrittura per tutti è legittima in un'unica posizione comune, /tmp, e si indica con drwxrwxrwt. L'ultimo t è lo sticky bit: la directory è scrivibile da tutti, ma ogni utente può eliminare soltanto i file di cui è proprietario. Senza questo bit, qualsiasi account potrebbe eliminare i file temporanei di un altro account.

Leggere una modalità prima di modificarla

Questi comandi leggono soltanto lo stato, quindi possono essere eseguiti ovunque senza rischi.

id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002

find <path> -perm -0002 elenca tutti gli elementi sotto un percorso per i quali è impostato il bit di scrittura per tutti gli utenti. È il modo più rapido per verificare un sistema dopo che qualcuno ha eseguito interventi con chmod 777.

Per verificare se uno specifico account di servizio può accedere a una directory, eseguite il controllo con quell'account. sudo -u www-data test -x /srv/site && echo yes || echo no stampa yes quando l'utente dispone del permesso di attraversamento sulla directory e no quando non lo dispone. Eseguire il controllo come root non dimostra nulla, perché root ignora il controllo e la risposta è sempre yes.

FAQ

Che cosa significa drwxr-xr-x in Linux?

Indica una directory, come mostra il primo carattere d, con modalità 755. La terna del proprietario è rwx, quindi il proprietario dispone di tutti i permessi. La terna del gruppo è r-x e quella degli altri utenti è r-x, quindi tutti gli altri possono elencare i nomi contenuti e attraversare la directory, mentre soltanto il proprietario può aggiungere o rimuovere elementi. Verificare qualsiasi percorso con stat -c '%A %a %U %G %n' <path>, che stampa affiancate la forma alfabetica e quella ottale.

Perché i file web hanno modalità 644 e le directory web 755?

Il server web viene eseguito con un account diverso, www-data su Ubuntu. Deve poter leggere i file che pubblica e attraversare ogni directory che li contiene, ma non ha motivo di scrivere in nessuno dei due. La modalità 644 assegna al proprietario il permesso di scrittura e a tutti gli altri quello di lettura. La modalità 755 assegna al proprietario il permesso di scrittura e a tutti gli altri quello di attraversamento. Una directory in cui l'applicazione deve effettivamente scrivere dovrebbe essere assegnata con chown all'utente dell'applicazione, invece di ampliare la modalità per tutti.

Il bit x indica che posso eseguire una directory?

No. Su una directory x indica l'attraversamento, cioè la possibilità di risolvere un nome al suo interno mentre il kernel percorre un percorso. cd ne ha bisogno, così come ogni apertura di un file contenuto nella directory. Ogni directory lungo il percorso richiede x, quindi un file con modalità 644 resta irraggiungibile se una directory superiore non dispone di x per l'utente. namei -l /path/to/file stampa la modalità di ogni directory nella catena e mostra dove si interrompe la ricerca.

chmod 777 è mai la soluzione corretta?

Quasi mai su un server. Assegna il permesso di scrittura a ogni account del sistema, inclusi gli account con cui vengono eseguiti i servizi, quindi un singolo servizio compromesso può riscrivere il file. Quando un'applicazione non può scrivere in una directory, il problema reale è spesso la proprietà: sudo chown -R appuser:appuser /srv/app/storage con modalità 755 assegna all'applicazione ciò di cui ha bisogno e impedisce l'accesso agli altri. L'eccezione nota è /tmp con modalità 1777, che funziona soltanto perché lo sticky bit impedisce agli utenti di eliminare i file degli altri.

Perché ls stampa un punto o un segno più dopo i permessi?

L'undicesimo carattere descrive regole aggiuntive rispetto ai nove bit dei permessi. Un punto, come in drwxr-xr-x., indica che è associato un contesto di sicurezza SELinux, una situazione normale su Fedora e Rocky. Un segno più, come in drwxr-xr-x+, indica che è configurata una ACL POSIX (access control list), quindi un utente o un gruppo dispone di permessi che le tre terne non mostrano. Eseguire getfacl <path> per elencare queste voci aggiuntive.

#permissions#ls#chmod#linux-basics#octal