Permisos de fitxers a Linux

La comanda chmod a Linux: canviar els permisos de fitxers i directoris



La comanda chmod (change mode) canvia els permisos d’un fitxer o d’un directori: qui el pot llegir, qui hi pot escriure i qui el pot executar. És la comanda que fas servir per fer executable un script, per protegir un fitxer amb contrasenyes o per arreglar els permisos d’una web. Només el propietari del fitxer (o root) en pot canviar els permisos.

Sintaxi

chmod [opcions] permisos fitxer...

Els permisos es poden escriure de dues maneres:

  • Simbòlica: u+x, go-w, u=rw,g=r,o=… Serveix per afegir o treure permisos concrets sense tocar la resta.
  • Numèrica (octal): 644, 755, 600… Fixa tots els permisos de cop.

Recordatori: com es llegeixen els permisos

$ ls -l script.sh
-rwxr-x--- 1 oscar oscar 10 Oct  3 23:53 script.sh

Després del primer caràcter (el tipus: - fitxer, d directori) venen tres grups de tres lletres: propietari (rwx), grup (r-x) i altres (---). Cada grup diu si hi ha permís de lectura (r), escriptura (w) i execució (x); un guió vol dir que no.

PermísEn un fitxerEn un directori
rLlegir-ne el contingutVeure la llista de noms que conté
wModificar-loCrear, esborrar i canviar el nom dels fitxers que conté
xExecutar-lo com a programaEntrar-hi (cd) i accedir als fitxers que conté

Tens tots els detalls a la guia de permisos de fitxers.

Mode simbòlic

Es combina qui, què fem i quin permís:

QuiOperacióPermís
upropietari (user)+afegeixrlectura
ggrup-treuwescriptura
oaltres (others)=fixa exactamentxexecució
atots (u, g i o)Xexecució només a directoris (i a fitxers que ja en tinguin)

Exemples:

chmod u+x script.sh          # el propietari el pot executar
chmod g+w informe.txt        # el grup hi pot escriure
chmod o-r informe.txt        # els altres ja no el poden llegir
chmod go-rwx privat/         # ni el grup ni els altres hi tenen cap accés
chmod u=rw,g=r,o= notes.txt  # fixa: rw- r-- ---
chmod a+r llegeix-me.md      # tothom el pot llegir

Si no indiques qui (chmod +x script.sh), s’aplica a tots, però respectant la umask: amb la umask habitual és el mateix que a+x.

Mode numèric (octal)

Cada permís té un valor: r = 4, w = 2, x = 1. Se sumen per a cada grup i s’escriuen tres xifres: propietari, grup i altres.

XifraPermisosXifraPermisos
0---4r--
1--x5r-x
2-w-6rw-
3-wx7rwx

Els valors més habituals:

ValorPermisosÚs típic
644rw-r--r--Fitxers normals: tu hi escrius, els altres el llegeixen
600rw-------Fitxers privats: claus SSH, fitxers amb contrasenyes
640rw-r-----Configuracions que ha de llegir un grup (per exemple, el del servidor web)
755rwxr-xr-xDirectoris i programes o scripts que tothom pot executar
750rwxr-x---Directoris i scripts només per a tu i el teu grup
700rwx------Directoris privats (com ~/.ssh)

Hi pot haver una quarta xifra al davant per als permisos especials (SUID = 4, SGID = 2, sticky = 1): chmod 2775 compartit/. Ho trobaràs explicat a els permisos especials.

Opcions més útils

OpcióQuè fa
-RRecursiu: aplica el canvi al directori i a tot el que conté
-vMostra cada fitxer tractat
-cCom -v, però només mostra els fitxers que canvien de veritat
--reference=fitxerCopia els permisos d’un altre fitxer
-fNo mostra la majoria de missatges d’error
$ chmod -v 640 informe.txt
mode of 'informe.txt' changed from 0664 (rw-rw-r--) to 0640 (rw-r-----)

Per veure els permisos en número, fes servir stat:

$ stat -c '%a %A %n' informe.txt script.sh
640 -rw-r----- informe.txt
750 -rwxr-x--- script.sh

Canvis recursius: compte amb chmod -R 755

chmod -R 755 web/ fa executables tots els fitxers, cosa que no té sentit per a un .html o un .css i és una mala pràctica de seguretat. Per posar 755 als directoris i 644 als fitxers tens dues opcions:

Amb la X majúscula, que només dona execució als directoris (i als fitxers que ja eren executables):

chmod -R u=rwX,go=rX web/
$ ls -lR web
web:
drwxr-xr-x 2 oscar oscar 60 Oct  3 23:53 css
-rw-r--r-- 1 oscar oscar  0 Oct  3 23:53 index.html

web/css:
-rw-r--r-- 1 oscar oscar 0 Oct  3 23:53 estil.css

O amb find, separant directoris i fitxers:

find web/ -type d -exec chmod 755 {} +
find web/ -type f -exec chmod 644 {} +

Compte amb…

  • chmod 777 gairebé mai és la solució. Si un programa no pot escriure en un directori, el més probable és que en calgui canviar el propietari (amb chown) o el grup, no obrir-lo a tothom.
  • Treure’t permisos a tu mateix. Amb chmod 000 fitxer ni tu el podràs llegir (Permission denied), tot i que com a propietari sempre en pots tornar a canviar els permisos.
  • El permís per esborrar és del directori. Un fitxer amb permisos 444 (només lectura) es pot esborrar igualment si tens permís d’escriptura al directori que el conté.
  • Els enllaços simbòlics sempre es mostren com a rwxrwxrwx; chmod canvia els permisos del fitxer al qual apunten.
  • SSH és exigent: si ~/.ssh o la clau privada tenen permisos massa oberts, ssh es nega a fer-los servir. Fes chmod 700 ~/.ssh i chmod 600 ~/.ssh/id_ed25519.

Comandes relacionades