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) |
exécution (script) |
Dossier | affichage contenu (ls) | ajout fichiers/sous-dossiers (touch,mkdir) suppression/renommage fichiers/sous-dossiers (rm,mv) |
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.)
- 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.
w :
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 :
# 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 :
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 :
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 :
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.