Je le sais:
666
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
Parce qu'avec un 5
vous supprimez les bits read (4)
et executable (1)
, vous obtenez donc uniquement write (2)
.
Avec 555
vous n'activez pas le bit exécutable par défaut.
It's wrong => (6 - 5 = 1)
Nous avons ces mods:
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
.
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
.
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 detouch(1)
et demkdir(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 leumask_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
sousperldoc -f sysopen
).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.