web-dev-qa-db-fra.com

Pourquoi umask 555 définit le fichier mods sur "222" au lieu de "111"?

Je le sais:

  1. Un fichier par défaut est 666
  2. umask la valeur sera supprimée des mods par défaut.

Alors pourquoi, lorsque je règle "umask" sur 555, les autorisations du fichier nouvellement créé ne sont pas définies sur 111? au lieu de cela, il les met à 222

1
Ravexina

Réponse courte:

Parce qu'avec un 5 vous supprimez les bits read (4) et executable (1), vous obtenez donc uniquement write (2).


Explication:

Avec 555 vous n'activez pas le bit exécutable par défaut.

It's wrong          =>          (6 - 5 = 1)

Nous avons ces mods:

  • 4 = lu
  • 2 = écrire
  • 1 = exécutable

Le seul moyen de créer un 5 est de 4 + 1, donc 5 signifie en réalité:

   4 (Read) + 1  (Executable)   =    5

Cela signifie "supprimer" les mods exécutables et lus s’ils sont configurés.

En d'autres termes, avec umask 555, vous supprimez le bit read (4) et executable (1) du mode de fichier par défaut (6), ce qui nous amène au (2), car dans un 6, nous avons seulement un 4 et 2 à enlever (pas n'importe lequel 1):

6  =  4   +   2

Votre suppression n'affecte que le 4 et le fichier se termine par 222.

En binaire

Pensez-y en binaire:

1 -> 001
2 -> 010
3 -> 011
4 -> 100
5 -> 101
6 -> 110
7 -> 111

Le mode par défaut du fichier est 666 (110 110 110) et notre valeur umask est 555 (101 101 101):

  Decimal title  ->         421 421 421
  666 in binary  ->         110 110 110
- 555 in binary  ->       - 101 101 101
                           _____________
                            010 010 010
                             2   2   2
                            -w- -w- -w-

Voir? nous avons fini par -w-w-w- ou 222.

3
Ravexina

La valeur du résultat est umask mask & 0777 ( bit et )

Quand le masque est 0555
Plus que 0555 & 0777 résultat avec 0222

nixCraft comprehension-linux-unix-umask-value-usage

Tâche: Calculer l'autorisation 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

File base permissions : 666
umask value : 022
subtract to get permissions of new file (666-022) : 644 (rw-r–r–)

Tâche: Calculer l'autorisation 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

Directory base permissions : 777
umask value : 022
Subtract to get permissions of new directory (777-022) : 755 (rwxr-xr-x)

La source de la différence entre touch file et mkdir dir:

Note: comme spécifié dans ce nix Q & A

comment les bits d'autorisation sont codés en dur dans les utilitaires standard. Voici quelques lignes pertinentes de deux fichiers du package coreutils contenant le code source de touch(1) et de mkdir(1), entre autres:

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

En d'autres termes, si le mode n'est pas spécifié, définissez-le sur S_IRWXUGO (lire: 0777) modifié par le umask_value.

touch.c est encore plus clair:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

Autrement dit, accordez à tous les droits de lecture et d’écriture (lecture: 0666), qui seront modifiés par le processus umask lors de la création du fichier, bien sûr.

Vous ne pourrez peut-être contourner cela que par programme: lors de la création de fichiers à partir d’un programme C, vous ferez les appels système directement ou à partir d’un langage vous permettant de passer un appel système de bas niveau (voir par exemple Perl sysopen sous perldoc -f sysopen).

man umask

umask () définit le masque de création de mode de fichier du processus appelant (umask) sur mask & 0777 (c’est-à-dire que seuls les bits d’autorisation de fichier du masque sont utilisés), et retourne la valeur précédente du masque.

2
Yaron