Linux / Commande umask : définir les permissions des nouveaux fichiers

umask règle les bits de permissions à retirer lors de la création de nouveaux fichiers et répertoires par le shell et ses processus enfants. Il ne change pas les permissions des fichiers existants. Avec les modes de création usuels et sans ACL par défaut, le masque 022 donne généralement des fichiers en 644 et des répertoires en 755.

Afficher le masque du shell

umask [-p] [-S] [masque]

Dans Bash, umask est une commande interne. Les formes suivantes consultent le même réglage sous des présentations différentes :

umask
umask -S
umask -p

La première affiche un nombre octal, par exemple 0027. La deuxième exprime les permissions non masquées, par exemple u=rwx,g=rx,o= pour 027. La troisième affiche une commande réutilisable, comme umask 0027. L'affichage symbolique est une limite autorisée : il ne signifie pas que chaque nouveau fichier sera exécutable.

Calculer les permissions par masquage de bits

Le programme qui crée le fichier demande un mode ; le masque en retire les bits correspondants. La règle usuelle est mode demandé & ~umask, et non une soustraction arithmétique ordinaire. Un fichier créé par touch demande habituellement 666, et un répertoire créé par mkdir 777.

Masque Fichier demandé en 666 Répertoire demandé en 777
022 644 755
027 640 750
077 600 700

Le masque 027 retire l'écriture au groupe et tous les droits aux autres utilisateurs. Si une application demande déjà 600, un masque 022 ne lui ajoute aucun droit. De même, un masque qui laisse passer l'exécution ne peut pas ajouter un bit x absent du mode demandé.

Comparer 022 et 027 dans un exercice isolé

Exécutez cet exemple avec Bash, GNU stat, touch, mkdir et mktemp. Il crée un nouveau répertoire temporaire dans votre dossier personnel, puis utilise deux sous-shells entre parenthèses. Chaque sous-shell règle son propre masque, sans changer celui du shell qui l'a lancé :

umask_lab=$(mktemp -d "$HOME/umask-demo.XXXXXX") || exit 1
cd "$umask_lab" || exit 1
(
  umask 022
  touch file-022.txt
  mkdir dir-022
)
(
  umask 027
  touch file-027.txt
  mkdir dir-027
)
stat -c '%a %n' file-022.txt dir-022 file-027.txt dir-027
umask

Sur un système Linux appliquant les permissions ordinaires, sans ACL par défaut sur le répertoire parent, le contrôle des quatre créations doit afficher :

644 file-022.txt
755 dir-022
640 file-027.txt
750 dir-027

La dernière commande affiche le masque initial du shell, dont la valeur dépend de votre session. Les fichiers d'exercice restent dans le répertoire temporaire. Ne réutilisez pas des fichiers préexistants pour comparer les résultats : touch peut mettre à jour leur date sans recalculer leurs permissions.

Si le résultat diffère, vérifiez les ACL par défaut et les capacités du système de fichiers. Une couche de compatibilité peut également présenter des modes différents de ceux d'un système Linux natif.

Changer le masque courant puis le rétablir

Pour une modification temporaire dans le shell courant, conservez d'abord la valeur existante :

initial_mask=$(umask)
umask 027
umask
umask "$initial_mask"
umask

Le premier contrôle affiche normalement 0027 dans Bash ; le second retrouve votre valeur précédente. Exécuter simplement un script ou un autre shell qui définit umask ne change pas le masque du shell parent. En revanche, charger un fichier avec source l'exécute dans le contexte courant et peut donc modifier ce réglage.

Le masque n'est pas une configuration globale permanente. Un shell de connexion, un service ou un conteneur peut recevoir un autre réglage à son démarrage. Vérifiez la valeur dans le processus qui crée réellement les fichiers avant de modifier un fichier de configuration supposé commun.

Distinguer umask, chmod et ACL par défaut

Pour modifier un fichier déjà présent, utilisez chmod et la vérification des permissions existantes. Changer umask ne modifie ni son mode, ni son propriétaire, ni son groupe.

Sous Linux, une liste de contrôle d'accès (ACL) par défaut sur le répertoire parent change la règle de création : elle est héritée et le masque umask est alors ignoré, tandis que les permissions absentes du mode demandé restent retirées. Vérifier seulement umask ne suffit donc pas à prédire les droits d'un fichier dans un répertoire doté d'une telle ACL.

Le manuel des commandes internes de Bash décrit les options de umask ; la page Linux umask(2) précise le masquage, l'héritage par les processus enfants et le cas des ACL par défaut. Utilisez aussi help umask pour votre Bash installé.