Cosa fa#
Modifica i bit di permesso (rwx) di file e directory. Supporta due notazioni: ottale per impostare lo stato completo, simbolica per modificare un singolo bit senza toccare gli altri.
Sintassi#
chmod [opzioni] modo file
Notazione ottale vs simbolica — quando usare quale#
Sono due notazioni per la stessa cosa. La scelta dipende da cosa vuoi fare:
# OTTALE — usi quando sai esattamente lo stato finale completo
chmod 755 script.sh # imposta rwxr-xr-x su tutti e tre i soggetti
# SIMBOLICA — usi quando vuoi modificare solo un bit
chmod u+x script.sh # aggiungi x solo all'owner, lascia il resto intatto
chmod o-w file.txt # togli w agli others, lascia il resto intattoIl rischio dell'ottale se non conosci lo stato attuale:
# file ha permessi 640 (rw-r-----)
# vuoi aggiungere x all'owner
chmod u+x file # simbolica → risultato: 750 (rwxr-x---) — corretto
chmod 740 file # ottale → risultato: 740 (rwxr-----) — hai tolto r a group per sbaglioCon la notazione simbolica non puoi fare danni collaterali — tocchi solo il bit che dichiari.
Notazione simbolica — struttura#
# chmod CHI AZIONE COSA file
chmod u + x script.sh
# CHI:
# u = user (owner)
# g = group
# o = others
# a = all (u+g+o insieme)
# AZIONE:
# + = aggiungi il bit
# - = togli il bit
# = = imposta esattamente (sovrascrive)
# COSA:
# r = read
# w = write
# x = executeNotazione ottale — calcolo#
Ogni cifra = somma dei bit per un soggetto:
# r=4, w=2, x=1
# rwx = 4+2+1 = 7
# r-x = 4+0+1 = 5
# rw- = 4+2+0 = 6
# r-- = 4+0+0 = 4
# -wx = 0+2+1 = 3 ← puoi scrivere ed eseguire ma non leggere
# --- = 0+0+0 = 0
# Logica binaria:
# 7 = 111 (tutti accesi)
# 5 = 101 (r si, w no, x si)
# 3 = 011 (r no, w si, x si)
# 0 = 000 (tutti spenti)Comandi essenziali#
| Comando | Notazione | Significato | Cosa fa |
|---|---|---|---|
chmod 600 file | ottale | rw------- | Solo owner legge e scrive — chiavi SSH |
chmod 644 file | ottale | rw-r--r-- | Owner scrive, tutti leggono |
chmod 755 script.sh | ottale | rwxr-xr-x | Owner tutto, altri leggono ed eseguono |
chmod 777 dir/ | ottale | rwxrwxrwx | Tutti tutto — solo in lab, mai in produzione |
chmod 733 dir/ | ottale | rwx-wx-wx | Owner tutto, altri scrivono ed eseguono ma non leggono |
chmod +x script.sh | simbolica | — | Aggiungi x a tutti i soggetti |
chmod u+x script.sh | simbolica | — | Aggiungi x solo all'owner |
chmod o-w file | simbolica | — | Togli w agli others |
chmod -R 644 dir/ | ottale + -R | recursive | Applica ricorsivamente a tutta la directory |
chmod a=r file | simbolica | r--r--r-- | Imposta solo r per tutti, azzera w e x |
chmod a+r file | simbolica | — | Aggiunge lettura a tutti (owner, group, others) |
Il comando chmod a+r /etc/apt/keyrings/docker.asc è comune per assicurarsi che qualsiasi processo utente o servizio nel sistema possa leggere la chiave pubblica (keyring), garantendo che l'installazione dei pacchetti non fallisca per permessi insufficienti. Equivale a chmod u+r,g+r,o+r.
Permessi speciali — quarta cifra ottale#
# Davanti alle 3 cifre standard puoi aggiungere una quarta:
# 4 = SUID → processo gira con UID del proprietario
# 2 = SGID → processo gira con GID del gruppo
# 1 = Sticky → solo il proprietario puo' cancellare i file
chmod 4755 file # SUID + 755 → -rwsr-xr-x
chmod 2770 dir/ # SGID + 770 → drwxrws---
chmod 1777 /tmp # Sticky + 777 → drwxrwxrwtPer il dettaglio completo → vedi suid-sgid-sticky.
Scenario Reale — Bandit 23#
# Il problema: cron esegue il tuo script come bandit24
# bandit24 deve scrivere in una directory che hai creato tu
# Crei la directory in /tmp
mkdir /tmp/miadir
# mktemp -d crea automaticamente in /tmp con nome casuale
# Permessi di default dopo mkdir: 755 (rwxr-xr-x)
# bandit24 e' in "others" → r-x → puo' leggere e attraversare
# ma NON puo' scrivere (manca w) → Permission Denied
# Fix minimo necessario:
chmod 733 /tmp/miadir # others ottiene wx → puo' scrivere
# oppure piu' permissivo (solo in lab):
chmod 777 /tmp/miadir
# Perche' 733 e' meglio di 777:
# 777 → chiunque puo' leggere i file creati dentro
# 733 → bandit24 puo' scrivere ma non leggere cosa c'e' dentroScenario Reale — SSH keys#
# SSH rifiuta chiavi con permessi troppo aperti
chmod 600 ~/.ssh/id_rsa # solo owner legge/scrive — obbligatorio
chmod 700 ~/.ssh/ # solo owner entra nella directory
chmod 644 ~/.ssh/id_rsa.pub # chiave pubblica — tutti possono leggerechmod 777 in produzione e' quasi sempre sbagliato.
Lascia che chiunque sul sistema scriva e modifichi il file.
Usalo solo in lab isolati come Bandit.
Se non ricordi i numeri ottale: parti da 0 e somma. Devi leggere? +4. Scrivere? +2. Eseguire? +1. r+w = 6, r+x = 5, r+w+x = 7, w+x = 3.
Dove l'ho usato#
- bandit-23 — chmod +x sullo script in /var/spool/bandit24/foo
- bandit-23 — chmod 777 sulla directory /tmp per permettere scrittura a bandit24
Collegato a#
- iam — categoria
- linux-permissions-ugo — la logica dei bit
- suid-sgid-sticky — bit speciali (4000, 2000, 1000)
- chown — cambia proprietario, spesso usato insieme


