Commandes Linux : chmod

CHMOD

Installé avec le paquet coreutils
Voir aussi : stat, umask, getfacl et setfacl

 

Remarques

Un fichier peut être passé en argument, tout comme un dossier ou une liste de fichiers/dossiers.

 

Afficher la version de la commande chmod

chmod --version

ou

apt-cache policy coreutils

 

Mode verbeux

chmod -v [...]

Les changements seront signalés.
Si rien n’est modifié, cela sera également signalé.

chmod -c [...]

Les changements seront signalés.
Si rien n’est modifié, rien ne sera signalé ou retourné.

 

Signification des droits affectés

r w x
Fichier affichage contenu (cat) modification contenu (nano)
renommage
suppression
exécution (script)
Dossier affichage contenu (ls) ajout fichiers/sous-dossiers (touch,mkdir)
suppression/renommage fichiers/sous-dossiers (rm,mv)
renommage
suppression
parcours (cd)
    r :

    • fichier : droit de lire le fichier, afficher son contenu (avec cat par ex.)
    • dossier : droit d’afficher son contenu (avec ls par ex.)

     
    w :

    • fichier : droit de modifier son contenu (avec nano par ex.) mais pas son nom.
    • dossier : droit de modifier son contenu (ajout de fichiers/dossiers dans le contenu, avec touch ou mkdir par ex., ou suppression du contenu via rm ou mv par ex.) mais pas son nom.
    • Attention :
      Un dossier/fichier peut être supprimé ou renommé sans pour autant posséder le droit d’écriture dessus.
      En effet, ce sont les droits affectés au répertoire courant qui le détermine (w : droit de modification du contenu).
      Par ex., il est possible de modifier le contenu d’un fichier ou dossier sans pour autant pouvoir le renommer ou supprimer. Renommer ou supprimer revient à modifier le contenu du répertoire courant, et ce sont donc les droits définis sur ce dernier qui le déterminent.
      Si le droit d’écriture est affecté à un répertoire alors tout son contenu sera renommable/supprimable (mais pas forcément modifiable). Pour empêcher un élément particulier de ce dossier d’être supprimé ou renommé, il faut se tourner vers la commande chattr pour la modification des attributs de cet élément.
      Dans l’exemple ci-dessous, on ne peut pas modifier le contenu du répertoire test (droits affectés à test : w absent) mais on peut le supprimer (droits affectés au répertoire courant, donc contenant le répertoire test : w présent).

      $ touch test/file.txt
      touch: impossible de faire un touch « test/file.txt »: Permission non accordée
      $ rm -rfv test/
      répertoire supprimé : « test/ »
      

    x :

    • fichier : droit d’exécuter le fichier (par ex. un script shell)
    • dossier : droit de se rendre dans le dossier (avec cd par ex.)

 

Modifier les permissions pour le propriétaire, le groupe et les autres ou tous simultanément

chmod u[+|-](rwx),g[+|-](rwx),o[+|-](rwx),a[+|-](rwx) filename
  • u (user) : le propriétaire du fichier
  • g (group) : le groupe propriétaire du fichier
  • o (other) : les autres
  • a (all) : tous (propriétaire, groupe, les autres)

ex :

# chmod a+r,u+x,go-rw test.sh
  • Tous (propriétaire/groupe/autres) se voient attribuer le droit de lecture sur test.sh
  • Le propriétaire se voit ajouter le droit d’exécution sur celui-ci.
  • Le groupe et les autres se voient retirer le droit d’écriture.

 

Définir les droits finaux pour le propriétaire, le groupe, et les autres ou tous simultanément

chmod u=(rwx-),g=(rwx-),o=(rwx-),a=(rwx-) filename
  • u (user) : le propriétaire du fichier
  • g (group) : le groupe propriétaire du fichier
  • o (other) : les autres
  • a (all) : tous (propriétaire, groupe, les autres)

ex :

# chmod u=rwx test.sh

Les droits précédemment définis pour g et o seront maintenus, seuls les droits de u sont ici modifiés.

# chmod u=rwx,g=r,o=- test.sh

Equivaut à :
chmod 740 test.sh

 

Définir au format numérique les droits finaux pour le propriétaire, le groupe, et les autres

chmod (0,1,2,4)[0-7][0-7][0-7] filename

La valeur numérique est constituée de 3 chiffres en base octale (valeurs comprises entre 0 et 7), préfixés éventuellement d’un quatrième correspondant au sticky bit (1), au SGID (2) ou au SUID (4). Par défaut, ce chiffre préfixe vaut 0 et peut dans ce cas être omis (755 équivaut à 0755).

  • 7 = 111 = rwx
  • 6 = 110 = rw-
  • 5 = 101 = r-x
  • 4 = 100 = r--
  • 3 = 011 = -wx
  • 2 = 010 = -w-
  • 1 = 001 = --x
  • 0 = 000 = ---

ex :

# chmod 740 test.sh

Equivaut à :
chmod u=rwx,g=r,o=- test.sh

 

Changer les permissions récursivement sur un dossier

chmod -R droits directory

ex :

# chmod -R 755 reptest/

Le dossier reptest et tout son contenu (dossiers comme fichiers) posséderont les droits 755.
Les fichiers inclus seront donc concernés et rendus exécutables, alors que pour un dossier le x signifie qu’on peut le parcourir.
Pour une affectation plus cohérente des droits sur les fichiers et dossiers, voir la commande find.

 

Le flag sticky bit t/T affecté aux autres (others)

chmod [+-]t directory/filename

ou

chmod (0,1)### directory/filename

Le sticky bit t/T affecté un à dossier retire le droit pour les autres (others) de renommer/supprimer un dossier/fichier contenu dans le dossier concerné dont ils ne sont pas propriétaires. Ils peuvent toujours ajouter un fichier/dossier à l’intérieur s’ils possèdent le droit d’écriture sur le dossier concerné (ils en seront alors les propriétaires).
Le sticky bit ne protège pas le dossier lui-même, en effet les autres peuvent renommer/supprimer ce dossier (présentant le flag sticky bit) s’ils possèdent le droit d’écriture en amont (en effet, seul le contenu est protégé).
Un exemple typique de dossier possédant de base un sticky bit est /tmp.
Le sticky bit t/T affecté à un fichier retire le droit pour les autres (others) de renommer/supprimer ce fichier même s’ils possèdent le droit d’écriture dessus. Ils peuvent toujours en modifier le contenu.
Le sticky bit vient se placer sur le triplet des droits relatifs aux autres, à l’emplacement du x :

  • t : le sticky bit masque la présence de x
  • T : le sticky bit masque l’absence de x (-)
  • # ls -la test
    drwxrwxrwt  2 root     root     4096 nov.  19 17:41 .
    drwxr-xrwx 23 adminsys adminsys 4096 nov.  19 18:23 ..
    -rw-r--r--  1 root     root        0 nov.  19 17:41 file1.txt
    -rw-r--r--  1 adminsys adminsys    0 nov.  19 17:41 file2.txt
    -rw-r--r--  1 adminsys adminsys    0 nov.  19 17:41 file3.txt
    # sudo -u adminsys rm -rf test/
    rm: impossible de supprimer « test/file1.txt »: Opération non permise
    # ls -la test
    drwxrwxrwt  2 root     root     4096 nov.  19 17:43 .
    drwxr-xrwx 23 adminsys adminsys 4096 nov.  19 18:23 ..
    -rw-r--r--  1 root     root        0 nov.  19 17:41 file1.txt
    

    Ci-dessus, file1.txt n’a pas pu être supprimé car n’appartenant pas à adminsys, ce qui a protégé la suppression du dossier test lui-même. Sans ce fichier, le dossier test aurait pu être supprimé (malgré la présence du sticky bit) car les autres ont le droit d’écriture sur le répertoire parent.

    # rm test/file1.txt
    # sudo -u adminsys rm -rf test/
    
    Avant ajout du sticky bit :
    # ls -ld test1 test2
    d------rwx 2 root root 4096 nov.  19 14:17 test1
    d------rw- 2 root root 4096 nov.  19 14:17 test2
    
    Ajout du sticky bit :
    # chmod +t test1/ test2/
    
    Après ajout du sticky bit :
    # ls -ld test1 test2
    d------rwt 2 root root 4096 nov.  19 14:17 test1
    d------rwT 2 root root 4096 nov.  19 14:17 test2
    

     

    Le flag SUID affecté à un exécutable

    chmod u[+-]s filename

    ou

    chmod (0,4)### filename

    Permet de lancer un exécutable avec les droits du propriétaire de celui-ci même s’il est exécuté par un autre utilisateur.
    Le SUID ne fonctionnera pas sur un script Shell pour des raisons de sécurité implémentées par le noyau.
    Le SUID vient se placer sur le triplet des droits relatifs à l’utilisateur propriétaire, à l’emplacement du x :

  • s : le SUID masque la présence de x
  • S : le SUID bit masque l’absence de x (-)


  • ex :

    # ls -l /usr/bin/passwd
    -rwsr-xr-x 1 root root 53112 nov.  19  2015 /usr/bin/passwd
    

    La commande passwd, quel que soit l’utilisateur qui l’exécute, est lancée avec les droits de root.

     

    Le flag SGID affecté à un exécutable

    chmod g[+-]s filename

    ou

    chmod (0,2)### filename

    Permet de lancer un exécutable avec les droits du groupe propriétaire de celui-ci même s’il est exécuté par un autre groupe.
    Le SGID ne fonctionnera pas sur un script Shell pour des raisons de sécurité implémentées par le noyau.
    Le SGID vient se placer sur le triplet des droits relatifs au groupe propriétaire, à l’emplacement du x :

  • s : le SGID masque la présence de x
  • S : le SGID bit masque l’absence de x (-)


  • ex :

    # ls -l /usr/bin/bsd-write
    -rwxr-sr-x 1 root tty 9680 oct.  17  2014 /usr/bin/bsd-write
    

    La commande write (write pointe vers bsd-write), quel que soit l’utilisateur qui l’exécute, est lancée avec les droits du groupe tty.

     

    Le flag SGID affecté à un dossier

    chmod g[+-]s directory

    ou

    chmod (0,2)### directory

    Tout fichier/dossier généré dans un dossier possédant le flag SGID sera créé comme la propriété du groupe propriétaire de ce dossier.
    Le SGID vient se placer sur le triplet des droits relatifs au groupe propriétaire, à l’emplacement du x :

  • s : le SGID masque la présence de x
  • S : le SGID bit masque l’absence de x (-)
  • ex :

    # ls -ld parent/
    drwxrwxrwx 2 root root 4096 nov.  19 16:48 parent/
    # sudo -u adminsys touch parent/file1.txt
    # ls -l parent/
    -rw-r--r-- 1 adminsys adminsys 0 nov.  19 16:49 file1.txt
    # chmod g+s parent/
    # ls -ld parent/
    drwxrwsrwx 2 root root 4096 nov.  19 16:49 parent/
    # sudo -u adminsys touch parent/file2.txt
    # ls -l parent/
    -rw-r--r-- 1 adminsys adminsys 0 nov.  19 16:49 file1.txt
    -rw-r--r-- 1 adminsys root     0 nov.  19 16:50 file2.txt
    

     

    Modifier les droits récursivement uniquement sur les fichiers

    find . -type f -print0 | xargs -0 chmod -c 644

    ou

    find . -type f -exec chmod -c 644 {} +

    ou

    find . -type f -exec chmod 644 {} \;

    Les droits sont à adapter aux besoins évidemment, tout comme le répertoire passé en argument de la commande find.

     

    Modifier les droits récursivement uniquement sur les dossiers

    find . -type d -print0 | xargs -0 chmod -c 755

    ou

    find . -type d -exec chmod -c 755 {} +

    ou

    find . -type d -exec chmod -c 755 {} \;

    Les droits sont à adapter aux besoins évidemment, tout comme le répertoire passé en argument de la commande find.

    Fermer le menu
    %d blogueurs aiment cette page :