Skip to main content
  1. Comandi/

chmod - change mode

·5 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

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 intatto

Il 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 sbaglio

Con 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 = execute

Notazione 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
#

ComandoNotazioneSignificatoCosa fa
chmod 600 fileottalerw-------Solo owner legge e scrive — chiavi SSH
chmod 644 fileottalerw-r--r--Owner scrive, tutti leggono
chmod 755 script.shottalerwxr-xr-xOwner tutto, altri leggono ed eseguono
chmod 777 dir/ottalerwxrwxrwxTutti tutto — solo in lab, mai in produzione
chmod 733 dir/ottalerwx-wx-wxOwner tutto, altri scrivono ed eseguono ma non leggono
chmod +x script.shsimbolicaAggiungi x a tutti i soggetti
chmod u+x script.shsimbolicaAggiungi x solo all'owner
chmod o-w filesimbolicaTogli w agli others
chmod -R 644 dir/ottale + -RrecursiveApplica ricorsivamente a tutta la directory
chmod a=r filesimbolicar--r--r--Imposta solo r per tutti, azzera w e x
chmod a+r filesimbolicaAggiunge lettura a tutti (owner, group, others)
Note

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 → drwxrwxrwt

Per 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' dentro

Scenario 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 leggere
Warning

chmod 777 in produzione e' quasi sempre sbagliato. Lascia che chiunque sul sistema scriva e modifichi il file. Usalo solo in lab isolati come Bandit.

Tip

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
#

Related