Je vais répondre à vos questions en trois parties :types de fichiers, autorisations et cas d'utilisation pour les différentes formes de chmod
.
Types de fichiers
Le premier caractère de ls -l
la sortie représente le type de fichier ; d
signifie que c'est un répertoire. Il ne peut pas être activé ou désactivé, cela dépend de la façon dont le fichier a été créé. Vous pouvez trouver la liste complète des types de fichiers dans la documentation ls; ceux que vous êtes susceptible de rencontrer sont
-
:fichier "normal", créé avec n'importe quel programme capable d'écrire un fichierb
:un fichier spécial de bloc, généralement des périphériques de disque ou de partition, peut être créé avecmknod
c
:fichier spécial caractère, peut aussi être créé avecmknod
(voir/dev
pour des exemples)d
:répertoire, peut être créé avecmkdir
l
:lien symbolique, peut être créé avecln -s
p
:tube nommé, peut être créé avecmkfifo
s
:socket, peut être créé avecnc -U
D
:porte, créé par certains processus serveur sur Solaris/openindiana.
Autorisations
chmod 0777
est utilisé pour définir toutes les permissions en un seul chmod
exécution, plutôt que de combiner les modifications avec u+
etc. Chacun des quatre chiffres est une valeur octale représentant un ensemble d'autorisations :
suid
,sgid
et "collant" (voir ci-dessous)- autorisations utilisateur
- autorisations de groupe
- "Autres" autorisations
La valeur octale est calculée comme la somme des autorisations :
- "lire" vaut 4
- "écrire" vaut 2
- "exécuter" vaut 1
Pour le premier chiffre :
suid
est 4 ; les binaires avec ce jeu de bits s'exécutent en tant qu'utilisateur propriétaire (généralementroot
)sgid
est 2 ; les binaires avec ce jeu de bits s'exécutent en tant que groupe propriétaire (cela a été utilisé pour les jeux afin que les scores élevés puissent être partagés, mais c'est souvent un risque de sécurité lorsqu'il est combiné avec des vulnérabilités dans les jeux), et les fichiers créés dans des répertoires avec ce jeu de bits appartiennent au groupe propriétaire du répertoire par défaut (c'est pratique pour créer des dossiers partagés)- "collant" (ou "suppression restreinte") vaut 1 ; les fichiers dans les répertoires avec ce bit défini ne peuvent être supprimés que par leur propriétaire, le propriétaire du répertoire ou
root
(voir/tmp
pour un exemple courant).
Voir le chmod
page de manuel pour plus de détails. Notez que dans tout cela, j'ignore les autres fonctionnalités de sécurité qui peuvent modifier les autorisations des utilisateurs sur les fichiers (SELinux, fichiers ACL...).
Les bits spéciaux sont gérés différemment selon le type de fichier (fichier normal ou répertoire) et le système sous-jacent. (Ceci est mentionné dans le chmod
manpage.) Sur le système que j'ai utilisé pour tester ceci (avec coreutils
8.23 sur un ext4
filesystem, exécutant le noyau Linux 3.16.7-ckt2), le comportement est le suivant. Pour un fichier, les bits spéciaux sont toujours effacés sauf s'ils sont explicitement définis, donc chmod 0777
est équivalent à chmod 777
, et les deux commandes effacent les bits spéciaux et donnent à tout le monde des autorisations complètes sur le fichier. Pour un répertoire, les bits spéciaux ne sont jamais complètement effacés en utilisant la forme numérique à quatre chiffres, donc en fait chmod 0777
est également équivalent à chmod 777
mais c'est trompeur car certains des bits spéciaux resteront tels quels. (Une version précédente de cette réponse s'est trompée.) Pour effacer des bits spéciaux sur les répertoires, vous devez utiliser u-s
, g-s
et/ou o-t
explicitement ou spécifiez une valeur numérique négative, donc chmod -7000
effacera tous les bits spéciaux d'un répertoire.
En ls -l
sortie, suid
, sgid
et "collant" apparaissent à la place du x
entrée :suid
est s
ou S
au lieu du x
de l'utilisateur , sgid
est s
ou S
au lieu du x
du groupe , et "collant" est t
ou T
au lieu du x
des autres . Une lettre minuscule indique que le bit spécial et le bit exécutable sont activés ; une lettre majuscule indique que seul le bit spécial est activé.
Les différentes formes de chmod
En raison du comportement décrit ci-dessus, l'utilisation des quatre chiffres complets dans chmod
peut être déroutant (au moins il s'avère que j'étais confus). C'est utile lorsque vous souhaitez définir des bits spéciaux ainsi que des bits d'autorisation ; sinon les bits sont effacés si vous manipulez un fichier, conservés si vous manipulez un répertoire. Donc chmod 2750
garantit que vous obtiendrez au moins sgid
et exactement u=rwx,g=rx,o=
; mais chmod 0750
n'effacera pas nécessairement les bits spéciaux.
Utilisation des modes numériques au lieu des commandes textuelles ([ugo][=+-][rwxXst]
) est probablement plus un cas d'habitude et le but de la commande. Une fois que vous êtes habitué à utiliser les modes numériques, il est souvent plus facile de spécifier simplement le mode complet de cette façon ; et il est utile de pouvoir penser aux permissions en utilisant des modes numériques, car de nombreuses autres commandes peuvent les utiliser (install
, mknod
...).
Certaines variantes de texte peuvent être utiles :si vous voulez simplement vous assurer qu'un fichier peut être exécuté par n'importe qui, chmod a+x
le fera, quelles que soient les autres autorisations. De même, +X
ajoute l'autorisation d'exécution uniquement si l'une des autorisations d'exécution est déjà définie ou si le fichier est un répertoire ; cela peut être pratique pour restaurer les autorisations globalement sans avoir à cas particulier les fichiers par rapport aux répertoires. Ainsi, chmod -R ug=rX,u+w,o=
équivaut à appliquer chmod -R 750
à tous les répertoires et fichiers exécutables et chmod -R 640
à tous les autres fichiers.
Ainsi, les autorisations sous Linux sont très importantes. Je vais essayer de faire une petite explication.
Pour les morceaux d'un mode fichier
Chaque fichier Unix possède un ensemble d'autorisations qui déterminent si vous pouvez lire, écrire ou exécuter le fichier. Runningls -l affiche les autorisations. Voici un exemple d'un tel affichage :
-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile
Je joins une image de morceaux d'un fichier mode :
Le type peut être différent. Par exemple :
- d (répertoire)
- c (appareil de caractère)
- l (lien symbolique)
- p (tube nommé)
- s (prise)
- b (bloquer l'appareil)
- D (porte, pas courant sur les systèmes Linux, mais a été porté)
Si vous souhaitez définir des autorisations pour tous les répertoires, vous pouvez utiliser l'attribut R, par exemple :
chmod -R 777 /some/directory/
Pour chmod 777 contre 0777
Le chmod
attend généralement que l'entrée soit un nombre octal, le zéro non significatif fait référence à la valeur du triplet de bits sticky/sgid/suid. En C cependant, cela ferait une différence, puisque 777
serait traduit en 01411
(octal), définissant ainsi le sticky bit (voir le chmod(2)
page de manuel), lire les autorisations pour le propriétaire et le bit exécutable pour le groupe et les autres (ce qui est une combinaison plutôt étrange).
MODIFICATION 1
J'ai trouvé une autre image sur les autorisations Linux et je vais joindre pour comprendre plus facilement:
d
signifie que c'est un répertoire, si vous avez un fichier c'est -
et si c'est un lien vous trouverez un l
. Il ne peut pas être activé/désactivé.
Si vous utilisez 0777 comme autorisations, vous donnez un contrôle total (lecture + écriture + exécution) à chaque utilisateur/groupe du système. C'est une façon paresseuse de résoudre les problèmes lorsque vous avez des utilisateurs/groupes qui ne peuvent pas accéder aux répertoires/fichiers.
Par exemple, si vous listez le contenu d'un répertoire et obtenez ceci :
-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so
preloadable_libintl.so est un fichier appartenant à l'utilisateur root et au groupe root. Le propriétaire dispose d'un accès en lecture et en écriture, le groupe n'a qu'un accès en lecture et tout autre utilisateur dispose d'un accès en lecture. Cela peut être traduit par 644.
Si je le change en 777, il ressemblera à ceci :
-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so