Pourquoi 777 est-il assigné à chmod pour permettre tout sur un fichier?

52

On m'a demandé dans une interview pourquoi le 777 est affecté à toutes les autorisations pour un fichier. Pourquoi pas 555? Il a dit qu'il y avait 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 numéro?

    
posée hellodear 27.05.2014 - 10:41
la source

6 réponses

129

Je vais essayer de comprendre la raison sous-jacente pourquoi il est 777, plutôt que aaa, ou 999.

Rappelez-vous 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ésentez chacun de ces groupes en tant que binaire. 1 est vrai, 0 est faux.

Si vous souhaitez 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 111 de binaire en décimal, vous obtenez 7 .

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

Remarque: Nous convertissons vraiment du binaire en octal. Voir la modification ci-dessous.

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

Par exemple, nous pouvons facilement déterminer ce que 555 signifie en convertissant chaque 5 en binaire et en l'écrivant dans le format ci-dessus. 5 en binaire est 101 , nous avons donc les autorisations suivantes:

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

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

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

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

Modifier:

Techniquement, comme le soulignent @ LưuVĩnhPhúc et @Braiam, nous passons de binaire à octal, comme décrit ci-dessous. Cependant, les représentations décimales et octales des nombres & lt; 8 sont les mêmes, donc pour les nombres binaires avec 3 chiffres ou moins, les représentations décimales et octales sont les mêmes.

Lorsqu'ils sont représentés par des nombres octaux, plutôt que par division en groupes de trois, et effectuant une conversion binaire en décimal sur chaque groupe, vous pouvez regrouper les trois groupes en un seul nombre binaire et les convertir en octal.

Par exemple, voici quelques conversions binaires à octales:

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

Notez que je préfixe "0b" et "0o" pour faire la distinction entre les nombres binaires et octaux.

Si vous voulez jouer avec cela, ouvrez un terminal, exécutez python , puis jouez avec les commandes suivantes:

oct(0b111111111)
bin(0o555)

N'oubliez pas d'ajouter "0b" ou "0o" aux nombres pour informer l'ordinateur de la base qui vous intéresse. (Si vous ne le faites pas, la base sera 10.)

    
réponse donnée daviewales 27.05.2014 - 16:17
la source
16

La permission de lecture de fichier signifie que 4 , l'écriture de l'autorisation de fichier signifie que 2 et l'exécution de l'autorisation de fichier signifie 1 .

Le total de ceci est donc 7 .

Maintenant, qu'est-ce que 777: first 7 est pour le propriétaire du fichier, ce qui signifie que le propriétaire du fichier a la permission de lire, d'exécuter et d'exécuter.

2nd 7 est pour le groupe auquel appartient le fichier, cela signifie que le groupe a également toutes les autorisations en lecture, écriture et exécution.

Et 3% 7 est pour la permission des autres

Si vous autorisez le fichier 555 , le fichier owner, group and others ne dispose que de read et execute permission >     

réponse donnée Prakash V Holkar 27.05.2014 - 10:58
la source
7

En moins de mots que la première réponse:

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

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

1 + 3 + 3 + 1 = 8

Au total, il y a 8 combinaisons; 8 options pour les autorisations. En comptant à partir de 0, le dernier numéro est 7 (de 0 à 7). Donc, représenté 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 numéros, car l'ordre passe [autorisations utilisateur] [autorisations groupe] [autres autorisations]

Donc, 777 signifie que les trois groupes ont des autorisations de lecture, d’écriture et d’exécution.

Également (indirectement lié, vous n’avez donc pas à lire cette partie), car j'estime que sa pertinence est importante: Pourquoi read number 4 au lieu du 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 de passer par puissances de 2 pour les options de base. 2 0 = 1 (exécution), 2 1 = 2 (écriture), 2 2 = 4 (lecture) et s’il y avait un 4ème option de base, il serait numéroté 2 3 = 8. Notez que write n'est pas répertorié jusqu'à ce que toutes les combinaisons des options précédentes aient été listées (ce qui n'est qu'une option, car il n'y a que execute ). read n'est pas répertorié jusqu'à ce que toutes les combinaisons des options précédentes aient été répertoriées (encore une fois, car il n'y a qu'une combinaison avec deux options - execute + write ). execute + write + read n'est pas répertorié jusqu'à ce que toutes les combinaisons précédentes aient été répertoriées, ce qui correspond à 3, car il existe maintenant deux choix parmi trois autorisations. La liste continuerait de cette manière, peu importe le nombre d'options de base. A titre d'exemple, avec 4 options de base (notez que nous savons également 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)
    
réponse donnée Daniel Ward 27.05.2014 - 20:50
la source
4

Je suis surpris par 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 .

    
réponse donnée Ununique 31.05.2014 - 00:12
la source
3

Pour une raison quelconque, les concepteurs UNIX ont décidé d’utiliser les numéros OCTAL pour obtenir des autorisations de fichiers. Comme vous le savez, une valeur maximale pour un nombre octal à un chiffre est 7. Il s’est avéré qu’un chiffre octal pour l’accès utilisateur, un pour l’accès au groupe et un pour l’accès mondial suffisent pour presque tout. Le nombre maximal d'octets à 3igits est 777, et cela n'a de sens que si cela signifie "l'accès à tout le monde / tout".

    
réponse donnée DejanLekic 30.05.2014 - 13:53
la source
2

De nos jours, nous savons tous qu’un octet est de 8 bits : cela a été universellement accepté pendant 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ù il était encore débattu. En particulier, il devait être portable aux systèmes utilisant Octets de 6 bits ou octets de 8 bits. Certaines des personnes qui l’ont écrit étaient d’un côté du débat et d’autres étaient de l’autre côté.

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 Base-16 (hexadécimal) à la place. 16 est juste une base suffisamment grande pour que vous puissiez placer quatre bits en un seul chiffre hexadécimal: par exemple, "0000" en binaire est 0x0 en hexadécimal (que "0x" est une manière courante de noter que vous êtes sur le point de écrire un nombre hexadécimal), alors 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 de la manière dont fonctionne l'arithmétique positionnelle, vous pouvez empiler deux chiffres hexadécimaux. en comptant, et ainsi de suite. Donc, les gens de 8 bits ont adoré ça.

Les utilisateurs de 6 bits avaient leur propre méthode, mais au lieu d'utiliser Base-16, ils utilisaient Base-8 (octal). Avantages hexadécimaux: vous pouvez stocker n'importe quelle position de trois bits dans un octal, et vous pouvez empiler les chiffres de la même manière. Donc, tout comme les utilisateurs de 8 bits utilisaient deux chiffres hexadécimaux pour un octet, les utilisateurs de 6 bits utilisaient deux octets pour un octet. Vous ne voyez plus beaucoup d'octal, mais il était généralement noté avec un zéro non significatif: 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, l'écrire ou l'exécuter en tant que programme. Si vous voulez limiter cela avec les autorisations, alors vous avez besoin d'un peu pour chacun: activez-le pour des choses que quelqu'un est autorisé à faire et laissez-le pour des choses que quelqu'un n'est pas autorisé à faire. Comme trois choses sont suivies, vous avez besoin de trois bits, et comme Unix les suit sur trois lignes (propriétaire, groupe et tout le monde), vous avez besoin de neuf bits au total.

À un moment donné sur la ligne, quelqu'un - probablement dans le camp de 6 bits - a dit "Hé, nous pouvons utiliser des chiffres octaux pour cela" . Et cela s'est avéré être une notation très pratique: trois chiffres octaux sont juste assez pour encoder toutes les combinaisons possibles des champs de bits. Une fois qu'ils ont décidé de le faire, le sort des 777 (et des milliers) était scellé, car ces nombres seraient les mêmes, peu importe la manière dont ils arrangeaient les bits, mais l'ordre était important pour tous les autres. p>

Ils ont arrangé les permissions dans des champs de trois bits: lecture au début, écriture au milieu et exécution à la fin. Ensuite, ils ont arrangé les champs eux-mêmes: propriétaire au début, groupe au milieu et autres à la fin. Une fois cela fait, il ne restait plus qu’à compter pour attribuer le reste des numéros.

Puisqu'ils sont des champs de 3 bits, vous pouvez dire que chaque caractère octal contrôle l'un des champs : le premier chiffre contrôle les autorisations du propriétaire, le deuxième contrôle les autorisations du groupe et le troisième digit contrôle d'autres autorisations. Ainsi, 777 (111 111 111) sont toutes des autorisations pour tout le monde, tandis que 700 (111 000 000) sont toutes des autorisations uniquement pour le propriétaire. Les autres combinaisons sont également communes: 666 (110 110 110) est en lecture / écriture pour tout le monde mais pas exécuté), tandis que 555 (101 101 101) est lu / exécuté pour tout le monde mais pas écrit et 400 (100 000 000) est en lecture. seulement pour le propriétaire et aucun accès pour quelqu'un d'autre.

Et c'est pourquoi 777 signifie toutes les autorisations. Ces jours-ci, c'est probablement la raison la plus populaire pour que les gens utilisent du octal, bien qu'Unix et ses descendants en aient encore quelques autres. Par exemple, od , ou Octal Dump, est un moyen d'obtenir des sauvegardes binaires d'un fichier sous forme octale (il a un cousin hexadécimal, appelé xxd , mais qui n'est pas aussi connu et n'est pas disponible partout) . C'est aussi la raison pour laquelle vous devez faire attention aux zéros de tête dans certains langages de programmation, car ils peuvent penser que vous avez l'intention d'écrire des nombres en octal lorsque ce n'est pas vraiment votre intention.

    
réponse donnée The Spooniest 30.05.2014 - 17:30
la source

Lire d'autres questions sur les étiquettes