web-dev-qa-db-fra.com

Qu'est-ce que "umask" et comment ça marche?

Je crois que umask est quelque chose qui contrôle autorisations de fichiers , mais je ne le comprends pas bien.

Après avoir exécuté umask 0644 dans un terminal , je ne peux pas lire les fichiers que je crée avec l'éditeur de texte en ligne de commande nano. J'ai remarqué que les autorisations de ce fichier sont définies sur 0022 au lieu du 0755 par défaut.

Comment fonctionne umask? Je pensais que je pouvais simplement supprimer chaque chiffre de umask de 0777, 7 - 6 = 1 et 7 - 4 = 3. Je m'attends donc à ce que les autorisations soient 0133, mais apparemment, ce n'est pas le cas.

  1. Qu'est-ce que umask exactement? Expliquez-moi comme si j'étais un "noob Linux"
  2. Comment calculer avec umask?
  3. Quels sont les cas d'utilisation d'umask?
183
Lekensteyn

Umask agit comme un ensemble d'autorisations que les applications ne peuvent pas définir sur les fichiers. C'est un masque de création de mode fichier pour les processus et ne peut pas être défini pour les répertoires eux-mêmes. La plupart des applications ne créeraient pas de fichiers avec des autorisations d'exécution définies; leur code par défaut serait donc 666, qui est ensuite modifié par umask.

Lorsque vous avez défini le paramètre umask pour qu'il supprime les bits de lecture/écriture du propriétaire et les bits de lecture des autres, une valeur par défaut telle que 777 dans les applications donnerait les autorisations de fichier à 133. Cela signifierait que vous (et d'autres) pourriez exécuter le fichier et que d'autres pourraient l'écrire.

Si vous souhaitez que les fichiers ne soient pas lus/écrits/exécutés par une personne autre que le propriétaire, vous devez utiliser un umask tel que 077 pour désactiver ces autorisations pour le groupe et les autres.

En revanche, un umask de 000 rendra les répertoires nouvellement créés lisibles, inscriptibles et descendables pour tous (les autorisations seront 777). Un tel umask est hautement dangereux et vous ne devez jamais le définir à 000.

Le umask par défaut sur Ubuntu était 022, ce qui signifie que les fichiers nouvellement créés sont lisibles par tout le monde, mais que le propriétaire ne peut les écrire:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw-r--r-- 1 user user 0 Apr  1 19:15 new-file-name

À partir de Ubuntu Oneiric (11.10), l’umask par défaut a été assoupli à 002, ce qui étend l’accès en écriture au groupe du propriétaire:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw-rw-r-- 1 user user 0 Apr  1 19:15 new-file-name

Visualiser et modifier umask

Pour afficher votre paramètre umask actuel, ouvrez un terminal et exécutez la commande:

umask

Pour changer le paramètre umask du shell actuel, changez-le, par exemple 077, exécutez:

umask 077

Pour vérifier si ce paramètre fonctionne ou non, vous pouvez créer un nouveau fichier (les autorisations de fichier d'un fichier existant ne seront pas affectées) et afficher des informations sur le fichier, lancez:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw------- 1 user user 0 Apr  1 19:14 new-file-name

Le paramètre umask est hérité par les processus démarrés à partir du même shell. Par exemple, démarrez l'éditeur de texte GEdit en exécutant gedit dans le terminal et enregistrez un fichier à l'aide de gedit. Vous remarquerez que le fichier nouvellement créé est affecté par le même paramètre umask que dans le terminal.

Cas d'utilisation: système multi-utilisateur

Si vous êtes sur un système partagé par plusieurs utilisateurs, il est souhaitable que les autres utilisateurs ne puissent pas lire les fichiers de votre répertoire de base. Pour cela, un umask est très utile. Éditez ~/.profile et ajoutez une nouvelle ligne avec:

umask 007

Vous devez vous reconnecter pour que cette modification umask dans ~/.profile prenne effet. Ensuite, vous devez modifier les autorisations de fichier existantes des fichiers de votre répertoire personnel en supprimant le bit de lecture, d’écriture et d’exécution du monde. Ouvrir un terminal et exécuter:

chmod -R o-rwx ~

Si vous souhaitez que ce paramètre umask soit appliqué à tous les utilisateurs du système, vous pouvez modifier le fichier de profil du système à /etc/profile.

138
ajmitch

En plus de la bonne discussion dans la réponse acceptée, il vaut la peine d'ajouter quelques points supplémentaires sur umask, en faisant référence à la façon dont elle est gérée à partir de 12.04.

Umask et pam_umask

Le umask par défaut est maintenant dans /etc/login.defs et non dans /etc/profile, comme le note officielle dans /etc/profile se lit comme suit:

# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.

Pam_umask est brièvement expliqué ci-dessous, et il convient de noter que le fichier par défaut permettant à l'utilisateur de placer son paramètre umask personnalisé est toujours ~/.profile.

Pam_umask est l’un des nombreux modules importants de PAM qui jouent un rôle crucial dans le fonctionnement d’Ubuntu (exécutez apropos '^pam_' pour rechercher les pages de manuel des autres). Dans la page de manuel pour pam_umask, il est noté que

pam_umask est un module PAM permettant de définir le masque de création de mode de fichier de l'environnement actuel. Umask affecte les autorisations par défaut attribuées aux fichiers nouvellement créés.

Une note sur l'umask par défaut

De nouveaux dossiers dans $HOME peuvent être créés par mkdir avec des autorisations 775 par défaut et les fichiers créés avec touch avec des autorisations par défaut 664 même lorsque umask par défaut est 022. Cela semble, au début, contradictoire et mérite d'être expliqué.

Si umask par défaut est 022 sur Ubuntu, il ne s'agit pas là d'une histoire complète, car il existe un paramètre dans /etc/login.defs qui permet à umask d'être 002 pour les utilisateurs non root si une condition est remplie (voir extrait ci-dessous). Sur une installation normale, /etc/login.defs contient le paramètre USERGROUPS_ENAB yes. C'est quoi

Permet de définir les bits du groupe umask de la même manière que les bits du propriétaire (exemples: 022 -> 002, 077 -> 007) pour les utilisateurs non root, si l'ID est identique à gid et si le nom d'utilisateur est identique au principal. nom de groupe.

C’est pourquoi vous voyez les éléments suivants avec stat quand un nouveau dossier est créé avec mkdir sur un système utilisateur unique tel que le mien (uid et gid sont identiques):

Access: (0775/drwxrwxr-x)  Uid: ( 1000/username)   Gid: ( 1000/username)

Pour plus d'informations, voir man pam_umask et les pages de manuel Ubuntu en ligne .

36
user76204

C'est assez vieux, mais cela vaut la peine d'être mentionné. Calculer pour umask, contrairement aux autorisations du système de fichiers. Les masques octaux sont calculés via le bit AND ET du complément unaire de l'argument à l'aide de bit NOT. Les notations octales sont les suivantes:

Octal value : Permission
0 : read, write and execute
1 : read and write
2 : read and execute
3 : read only
4 : write and execute
5 : write only
6 : execute only
7 : no permissions

Ensuite, vous pouvez calculer pour définir les prémisses appropriées pour umask, telles que:

$ umask 077
$ mkdir dir1
$ touch file
$ ls -ld dir1 file

drwx------ 2 amrx amrx 4096 2011-03-04 02:05 dir1
-rw------- 1 amrx amrx    0 2011-03-04 02:05 file

Calcul de la permission finale pour les fichiers

Vous pouvez simplement soustraire le umask des autorisations de base pour déterminer l'autorisation finale pour le fichier comme suit:

666 – 022 = 644
  • Permissions de base du fichier: 666
  • valeur umask: 022
  • soustrayez pour obtenir les autorisations du nouveau fichier (666-022): 644 (rw-r–r–)

Calcul de la permission finale pour les répertoires

Vous pouvez simplement soustraire le umask des autorisations de base pour déterminer l'autorisation finale pour le répertoire comme suit:

777 – 022 = 755
  • Autorisations de base de l'annuaire: 777
  • valeur umask: 022
  • Soustrayez pour obtenir les autorisations du nouveau répertoire (777-022): 755 (rwxr-xr-x)
32
amrx

D'autres ont très bien expliqué le concept de masquage et pourquoi cela est nécessaire. Laissez-moi ajouter mes deux centimes et vous donner un exemple mathématique sur la manière dont les autorisations sont réellement calculées.

Premièrement, "masque" ne signifie pas "soustraire", au sens arithmétique du terme - il n’ya pas d’emprunt ni de report en cause, deuxièmement, le umask est un masque; ce n'est pas un nombre à soustraire.

Troisièmement, le masque désactive les bits d'autorisation. Si elles sont déjà désactivées, umask ne modifie pas l’autorisation,

Par exemple, supposons que vous deviez démasquer 077 des valeurs par défaut du système pour les fichiers qui sont 666 et les répertoires qui sont 777.

La commande que vous utiliserez est,

umask 077

(démasquez la valeur en binaire, 000 111 111)

Ce démasquage fera en sorte qu'il désactivera l'un des six premiers LSB (bits les moins significatifs) s'il s'agit de 1 et ne fera aucun changement si l'un d'entre eux est déjà désactivé.

Voici comment l’autorisation finale est calculée:

file permisison 666 = 110 110 110 
unmask value    077 = 000 111 111
will result in, 600 = 110 000 000

Observez comment les deux valeurs 110 ont été remplacées par 000.

De même,

directory permission 777 = 111 111 111 
unmask value         077 = 000 111 111
will result in,      700 = 111 000 000
29
Sufiyan Ghori

Concept de base:

Si vous êtes comme la plupart des humains et ne comprenez pas ce que diable "les masques octaux sont calculés via le bit AND et du complément unaire de l'argument en utilisant bitwise PAS" signifie, voici ma simple explication:

Tout d’abord, réfléchissez à ce qu’est un "masque". Un masque bloque quelque chose. Pensez au ruban adhésif. Dans ce cas, umask revient à masquer une bande pour bloquer/désactiver les autorisations lors de la création d'un nouveau fichier ou répertoire.

Les autorisations par défaut lors de la création d'un nouveau répertoire sont octal 777 (111 111 111) et un nouveau fichier est octal 666 (110 110 110). Nous avons défini umask pour bloquer/désactiver certaines autorisations.

  • Un bit de masque de 1 signifie bloquer/désactiver cette autorisation (placez une bande de masquage sur ce bit).
  • Un bit de masque de 0 permettra la permission de passer (pas de bande de masquage sur ce bit).

Un masque octal 022 (000 010 010) signifie donc de désactiver group write et others write, et de laisser passer toutes les autres autorisations.

Calcul:

Voici un exemple de calcul pour un nouveau fichier (autorisation 666 par défaut) avec un umask 022:

  perm mask result
----------------------------
u 1    0    1 (pass through)
  1    0    1 (pass through)
  0    0    0 (pass through)
----------------------------
g 1    0    1 (pass through)
  1    1    0 (disable)
  0    0    0 (pass through)
----------------------------
o 1    0    1 (pass through)
  1    1    0 (disable)
  0    0    0 (pass through)

C'est ainsi que vous obtenez le résultat de 644 lorsque vous créez un nouveau fichier.

Manière plus simple:

Mais si les calculs inverses de masque vous déroutent, il existe un moyen plus simple d’utiliser la notation symbolique umask. Lorsque vous utilisez cette méthode, vous spécifiez simplement les bits d'intercommunication au lieu des bits de masque.

  • umask u=rwx,g=rx,o=rx signifie permettre le passage pour user rwx, group rx, other rx. Ce qui implique de désactiver group w, others w. Si vous exécutez cette commande, cochez umaskname__, vous obtiendrez 022.
  • umask u=rwx,g=,o= signifie permettre le passage pour user rwx. Ce qui implique de désactiver tous les accès pour groupet othersname__. Si vous exécutez cette commande, cochez umaskname__, vous obtiendrez 077.

Calcul du bonus:

Si vous voulez réellement comprendre ce que "les masques octaux sont calculés via le bit AND et du complément unaire de l'argument à l'aide de bit NOT" signifie, voici un peu de logique tableaux qui peuvent aider à démontrer. N'oubliez pas qu'un bit de masque 1 signifie que désactiver, 0 signifie que passer.

perm mask result
----------------
0    1    0     (mask 1 always disables)
1    1    0     (mask 1 always disables)
0    0    0     (mask 0 passes through)
1    0    1     (mask 0 passes through)

Si vous créez la table avec NOT(mask), il ne s'agit plus que d'une simple table logique ANDname__!

perm NOT(mask) result
---------------------
0    0         0     (mask 1 always disables)
1    0         0     (mask 1 always disables)
0    1         0     (mask 0 passes through)
1    1         1     (mask 0 passes through)

Donc, la formule est la suivante: result = perm AND (NOT mask)

10
wisbucky