Pourquoi 777 est-il attribué à chmod pour tout autoriser dans un fichier?


54

Lors d’une interview, on m’a demandé pourquoi 777 est affecté à l’utilisation de toutes les autorisations pour un fichier. Pourquoi pas 555? Il a dit qu'il y a une raison pour tout. Alors, quelle est la raison de 777? Pourquoi pas un autre numéro? Y a-t-il une signification dans ce nombre?



2
Reportez-vous au commentaire de lien de @ AvinashRaj et appliquez-le à l'instance. La question "Pourquoi?" dépend de quelle instance il est et quel but il sert ... :)
AzkerM

1
S'interroge-t-il sur la signification du chiffre 7 vs 5 ou pourquoi ce sont des chiffres au lieu de, disons, des lettres?
Braiam

4
C'est une excellente question d'entrevue. Je vais peut-être devoir le voler.
Numérique Chris

5
Strictement parlant, ce n'est pas le 777, mais le 0777.
Ruslan,

Réponses:


129

Je vais essayer de parler de la raison sous-jacente pour laquelle il s’agit du 777, plutôt que de l’aa ou du 999.

N'oubliez pas que les autorisations sont au format suivant:

 u   g   o
rwx rwx rwx

où u = utilisateur, g = groupe, o = autre.

Maintenant, imaginez que vous représentiez chacun de ces groupes sous forme binaire. 1 est vrai, 0 est faux.

Si vous voulez donner un accès complet à tout le monde, vous devez attribuer les autorisations suivantes en binaire:

 u   g   o
rwx rwx rwx
111 111 111

Maintenant, si vous connaissez le binaire, vous réaliserez que lorsque vous convertissez 111du binaire en décimal, vous obtenez 7.

Ainsi, vous pouvez représenter un accès complet en tant que 777.

Note: Nous convertissons vraiment du binaire en octal. Voir l'édition ci-dessous.

Cela fonctionne également pour tous les autres modes d'accès.

Par exemple, nous pouvons facilement déterminer les 555moyens en convertissant chacun 5en binaire et en l’écrivant au format ci-dessus. 5en binaire 101, nous avons donc les permissions suivantes:

 u   g   o
r-x r-x r-x
101 101 101
 5   5   5

De même, si nous voulons donner toutes les autorisations à l'utilisateur, mais permettre uniquement à d'autres personnes de lire, nous pouvons trouver une représentation numérique.

 u   g   o
rwx r-- r--
111 100 100
 7   4   4

Nous savons maintenant que 111binaire est 7en décimal et que 100binaire est 4en décimal. Ainsi, les autorisations seront 744.

Modifier:

Techniquement, comme le soulignent @ LưuVĩnhPhúc et @Braiam, nous effectuons la conversion de binaire en octal, comme décrit ci-dessous. Toutefois, les représentations décimales et octales des nombres <8 sont identiques. Ainsi, pour les nombres binaires de 3 chiffres ou moins, les représentations décimale et octale sont identiques.

Lorsqu'ils sont représentés sous forme de nombres octaux, plutôt que de se scinder en groupes de trois et d'effectuer une conversion binaire en décimale sur chaque groupe, vous pouvez en fait regrouper les trois groupes en un seul nombre binaire et les convertir en octal.

Par exemple, voici quelques conversions binaires en octales:

0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744

Notez que je fais précéder "0b" et "0o" pour distinguer les nombres binaires et octaux.

Si vous voulez jouer avec cela, ouvrez un terminal, lancez python-vous puis jouez avec les commandes suivantes:

oct(0b111111111)
bin(0o555)

N'oubliez pas de faire précéder les nombres de "0b" ou "0o" pour que l'ordinateur sache à quelle base vous êtes intéressé. (Si vous ne le faites pas, il prendra le chiffre de base 10.)


17
Juste pour être complet, le format des nombres est appelé octals, ce qui signifie littéralement base de 8 (étant donné qu'ils partent de 0, 7 + 1 = 8).
Braiam

3
davie: octal est facile car il regroupe en réalité trois bits, tout comme les groupes hexadécimaux quatre. La décimale n'est pas une puissance de 2, donc elle ne regroupe pas les bits aussi bien.
Konerak

2
Eh bien, vous obtenez le même numéro dans les deux cas. Je pense qu'il est plus probable que quelqu'un comprenne une conversion binaire en décimale qu'une conversion binaire en octale. De plus, j'ai ajouté une section à la fin pour préciser que les nombres sont vraiment octaux, pas décimaux.
daviewales

3
7est le même en décimal et octal - mais 777ne l’est pas. Lorsque vous parlez d'inverser des bits, cela fait une différence.
Sam Dufel

2
Juste pour des raisons triviales, 7 est appelé le nombre de Dieu et l'utilisateur root, dont les autorisations par défaut sont 777parfois désignées par Dieu.
eyoung100

16

Lecture des autorisations de fichier 4, écriture des autorisations de fichier 2et exécution des autorisations de fichier 1.

Donc, le total de ceci est 7.

Maintenant, ce qui est 777: le premier 7concerne le propriétaire du fichier, ce qui signifie que le propriétaire du fichier a les droits de lecture, de droit et d’exécution.

2nd 7est pour le groupe auquel le fichier appartient, cela signifie que le groupe possède également toutes les autorisations de lecture, d'écriture et d'exécution.

Et 3ème 7est pour la permission des autres

Si vous donnez l’autorisation au fichier, 555alors le fichier owner, group and othersn’a qu’une readet une executeautorisation not write, car permission en lecture signifie 4 et exécution signifie 1, ainsi le total est obtenu.5


Qu'est-ce qu'un groupe et quelles sont ces autres autorisations? Merci pour la réponse.
hellodear

Veuillez vous référer à ce lien pour le groupe et les autres autorisations. Celles-ci seront appliquées à quiconque sur le serveur qui ne fait pas partie de votre groupe ou pas dans votre groupe
Prakash V Holkar

7

En moins de mots que la réponse principale:

Chaque fichier dispose de 3 options d'autorisations: lecture, écriture et exécution. Vous ne pouvez choisir aucun de ceux-ci, un de ceux-ci, deux de ceux-ci ou tous ceux-ci:

C (3,0) + C (3,1) + C (3,2) + C (3,3) = 8

1 + 3 + 3 + 1 = 8

Donc, en tout, il y a 8 combinaisons; 8 options pour les autorisations. En comptant à partir de 0, le dernier nombre est 7 (de 0 à 7). Donc, représentés par des nombres, voici toutes les options:

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)

Il y a trois nombres parce que l'ordre va [autorisations utilisateur] [autorisations de groupe] [autres autorisations]

Ainsi, 777 signifie que les trois groupes disposent des autorisations de lecture, d'écriture et d'exécution.


Aussi (indirectement lié pour que vous n'ayez pas nécessairement à lire cette partie), car je pense que sa pertinence est importante: pourquoi le readnuméro 4 est-il remplacé par le numéro 3?

0 - nothing
1 - execute
2 - write
3 - read
4 - execute + read (1 + 3)
5 - write + read (2 + 3)
6 - execute + write + read (3 + 2 + 1)
7 - ????? no way to get this with the 3 basic options (and we are missing execute + write)

La seule façon d'obtenir des combinaisons uniques pour toutes les possibilités est d'utiliser des puissances de 2 pour les options de base. 2 0 = 1 (exécuter), 2 1 = 2 (écrire), 2 2 = 4 (lire), et s'il existait une 4ème option de base, elle serait numérotée 2 3 = 8. Notez que cette option writen'est répertoriée que lorsque toutes les combinaisons de les options précédentes ont été listées (ce qui n’est qu’une option, puisque c’est juste execute). readn'est répertorié que lorsque toutes les combinaisons des options précédentes ont été répertoriées (encore une, car il n'y a qu'une combinaison avec deux options - execute+ write). execute+ write+readn'est pas répertorié jusqu'à ce que toutes les combinaisons précédentes soient répertoriées, ce qui correspond à 3, car il existe désormais deux choix parmi trois autorisations. La liste continuerait ainsi, quel que soit le nombre d'options de base disponibles. Par exemple, avec 4 options de base (notons que nous savons aussi qu'il y aura 16 combinaisons au total puisqu'il y a 4 options et 2 4 = 16):

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)
8 - love
9 - execute + love (1 + 8)
10 - write + love (2 + 8)
11 - execute + write + love (1 + 2 + 8)
12 - read + love (4 + 8)
13 - execute + read + love (1 + 4 + 8)
14 - write + read + love (2 + 4 + 8)
15 - execute + write + read + love (1 + 2 + 4 + 8)

6
Cette réponse est tout à fait mauvaise car elle ne reconnaît pas le système binaire et, plus important encore, le système octal en tant que source des bits d'autorisation de fichier Unix. (Assez curieusement, ils ne sont pas 3 ni même 4… ils sont 6, bien que les 18 bits ne soient pas utilisés pour le moment.)
mirabilos

1
La base est sans importance, comme 111 est 7; Peu importe que je dise que les permissions sont 111 ou 7, c'est la même valeur. J'ai utilisé décimal pour la simplicité de l'exemple pour montrer les calculs impliqués. J'aurais pu utiliser le binaire, mais les calculs n'auraient pas semblé aussi simples. Qu'importe que les bases puissent être traduites entre elles?
Daniel Ward

4

Je suis surpris de tant de réponses similaires qui manquent complètement la cible.

Après avoir déterminé les 3 classes nécessaires, lisez, écrivez et exécutez. Ils sont allés avec octal (3 bits) pour minimiser l'espace nécessaire à la gestion du système de fichiers .


3

Pour une raison quelconque, les concepteurs UNIX ont décidé d'utiliser les numéros OCTAL pour les autorisations de fichiers. Comme vous le savez, la valeur maximale pour un nombre octal à un chiffre est de 7. Il s’est avéré qu’un chiffre octal pour l’accès des utilisateurs, un pour l’accès aux groupes et un pour l’accès mondial suffit pour presque tout. Le nombre octal de 3 chiffres maximum est 777 et il est logique que cela dénote "accès à tout le monde / tout".


Je ne pense pas que ce soit une bonne explication. Les concepteurs UNIX pouvaient avoir des nombres décimaux et auraient quand même fini avec 7 indiquant un accès maximal, au lieu de 9 (chiffre décimal maximum). Le 7 n'est pas choisi "de manière soustractive" en fonction des nombres possibles à partir du chiffre le plus élevé possible, mais "de manière additive" en fonction de l'accès autorisé par les chiffres binaires à partir de zéro sans aucun droit.
OU Mapper

Remarquez que j'ai écrit au tout début "pour une raison quelconque" ... - Je ne voulais pas approfondir l'explication de POURQUOI ils ont choisi des nombres octaux, car ce n'était pas la question de l'OP. La question était de savoir pourquoi 777 donnait toutes les autorisations.
DejanLekic

Peu importe la raison pour laquelle ils ont choisi des nombres octaux. Mon argument est que la raison pour laquelle les droits maximaux sont représentés par le nombre 7 n’est pas que 7 se trouve être le nombre octal maximal.
OU Mapper

2

De nos jours, nous savons tous qu'un octet est composé de 8 bits : cela fait l'objet d'un accord universel depuis des décennies. Mais ce n’était pas toujours le cas, et Unix (qui a inspiré Linux à bien des égards) a été écrit à une époque où cela faisait encore l’objet d’un débat. En particulier, il devait être portable pour les systèmes utilisant des octets de 6 bits ou des octets de 8 bits. Certains de ceux qui l'ont écrit étaient d'un côté du débat, d'autres de l'autre.

Sur une note connexe, Base-2 (binaire) n’est pas une notation très pratique pour écrire des valeurs. De nos jours, la plupart des programmeurs écrivent une notation plus compacte qui utilise à la place Base-16 (hexadécimal) . 16 est juste assez grand pour que vous puissiez compresser exactement quatre bits dans un chiffre hexadécimal: par exemple, "0000" en binaire est 0x0 en hexadécimal (que "0x" est un moyen courant de noter que vous êtes sur le point de écrire un nombre hexadécimal), tandis que "1111" est 0xF (ou 15 en décimal). Vous pouvez réellement écrire n'importe quelle combinaison possible de quatre bits en utilisant un seul chiffre hexadécimal, simplement en comptant en binaire, et en raison du fonctionnement de l'arithmétique positionnelle, vous pouvez l'empiler: deux chiffres hexadécimaux peuvent coder toute combinaison possible de huit bits, juste en comptant, et ainsi de suite. Alors les gens de 8 bits ont adoré ça.

Les gens de 6 bits avaient leur propre façon de faire cela, mais au lieu d'utiliser Base-16, ils utilisaient Base-8 (octal). Il présente des avantages similaires à ceux de l'hexadécimal: vous pouvez stocker n'importe quelle position de trois bits dans un chiffre octal et vous pouvez empiler des chiffres de la même manière. Donc, tout comme les personnes de 8 bits utilisaient deux chiffres hexadécimaux pour un octet, les personnes de 6 bits utilisaient deux chiffres octaux pour un octet. Vous ne voyez plus très souvent l'octal, mais il est généralement signalé par un zéro: par exemple, "111" est 07 en octal.

Maintenant, qu'est-ce que tout cela a à voir avec les autorisations Unix? En ce qui concerne Unix, il y a trois choses que vous pouvez faire avec un fichier: vous pouvez le lire, vous pouvez l'écrire, ou vous pouvez l'exécuter en tant que programme. Si vous souhaitez restreindre cela avec des autorisations, vous avez besoin d'un peu pour chacune d'elles: activez-la pour les tâches que quelqu'un est autorisé à faire et laissez-la pour celles qu'elle n'est pas autorisée à faire. Étant donné que trois éléments sont suivis, vous avez besoin de trois bits et, comme Unix le suit selon trois lignes (propriétaire, groupe et tout le monde), vous avez besoin d’un total de neuf bits.

À un moment donné de la ligne, quelqu'un - probablement dans le camp 6 bits - a déclaré: "Hé, nous pouvons utiliser des chiffres octaux pour cela" . Et cela s’est avéré être une notation très pratique: trois chiffres en octal suffisent pour encoder toutes les combinaisons possibles de champs de bits. Une fois qu'ils ont décidé de le faire, le destin de 777 (et des milliers) a été scellé, car ces chiffres seraient les mêmes quelle que soit leur organisation, mais l'ordre importait pour tous les autres numéros. Ils ont donc décidé de le faire.

Ils ont organisé les autorisations en champs de trois bits: lecture au début, écriture au milieu et exécution à la fin. Ensuite, ils ont organisé les champs eux-mêmes: le propriétaire au début, le groupe au milieu et les autres à la fin. Une fois cela fait, il ne leur restait plus qu'à compter.

Étant donné que ce sont des champs de 3 bits, vous pouvez dire que chaque chiffre octal contrôle l'un des champs : le premier chiffre contrôle les autorisations du propriétaire, le second chiffre les autorisations du groupe et le troisième chiffre contrôle les autres autorisations. Ainsi, 777 (111 111 111) sont toutes les autorisations pour tout le monde, alors que 700 (111 000 000) sont toutes les autorisations uniquement pour le propriétaire. D'autres combinaisons sont également courantes: 666 (110 110 110) est en lecture / écriture pour tout le monde mais pas exécuter), tandis que 555 (101 101 101) est en lecture / exécution pour tout le monde mais pas en écriture, et 400 (100 000 000) en lecture seulement pour le propriétaire et pas d'accès pour quelqu'un d'autre.

Et c'est pourquoi 777 signifie toutes les autorisations. De nos jours, c'est probablement la raison la plus populaire pour laquelle les gens utilisent octal, bien qu'Unix et ses descendants en aient encore quelques vestiges. Par exemple, odou Octal Dump, est un moyen d'obtenir des vidages binaires d'un fichier sous forme octale (il a un cousin hexadécimal, appelé xxd, mais ce n'est pas aussi connu et n'est pas disponible partout). C'est aussi pourquoi vous devez faire attention aux zéros non significatifs dans certains langages de programmation, car ils pourraient penser que vous avez l'intention d'écrire des nombres en octal, alors que ce n'est pas vraiment votre intention.


Tout d'abord, lors de la création de Linux (vers 1992), le débat sur 6 bits en 8 bits était terminé. 2ème ce n'est pas la raison pour laquelle cela a été fait
Ahmed Masud

1
J'ai fourni les éléments 8 bits / 6 bits pour le contexte historique. Linux a été créé longtemps après la fin du débat, c’est vrai, mais parce qu’il tirait une grande partie de son inspiration de Unix, il a été affecté de la même manière par ce débat. C'est pourquoi j'ai pensé que ce serait une bonne idée d'introduire le contexte historique.
Le Spooniest
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.