In einem Interview wurde ich gefragt, warum 777 alle Berechtigungen für eine Datei übernehmen soll. Warum nicht 555? Er sagte, dass es Grund für alles gibt. Was ist der Grund für 777? Warum keine andere Nummer? Hat diese Zahl eine Bedeutung?
In einem Interview wurde ich gefragt, warum 777 alle Berechtigungen für eine Datei übernehmen soll. Warum nicht 555? Er sagte, dass es Grund für alles gibt. Was ist der Grund für 777? Warum keine andere Nummer? Hat diese Zahl eine Bedeutung?
Antworten:
Ich werde versuchen, den zugrundeliegenden Grund zu klären, warum es 777 ist, anstatt aaa oder 999.
Beachten Sie, dass die Berechtigungen im folgenden Format vorliegen:
u g o
rwx rwx rwx
Wobei u = Benutzer, g = Gruppe, o = andere.
Stellen Sie sich nun vor, Sie repräsentieren jede dieser Gruppen als binär. 1 ist wahr, 0 ist falsch.
Wenn Sie allen uneingeschränkten Zugriff gewähren möchten, weisen Sie die folgenden binären Berechtigungen zu:
u g o
rwx rwx rwx
111 111 111
Wenn Sie nun binär wissen, werden Sie feststellen, dass Sie beim Konvertieren 111
von binär in dezimal erhalten 7
.
Somit können Sie Vollzugriff als darstellen 777
.
Hinweis: Wir konvertieren wirklich von binär nach oktal. Siehe die Bearbeitung unten.
Dies funktioniert auch für alle anderen Zugriffsmodi.
Zum Beispiel können wir leicht herausfinden, was es 555
bedeutet, indem wir jedes 5
in ein Binärformat umwandeln und es in das obige Format schreiben. 5
in binär ist 101
, so haben wir die folgenden Berechtigungen:
u g o
r-x r-x r-x
101 101 101
5 5 5
Wenn wir dem Benutzer alle Berechtigungen erteilen möchten, aber nur anderen Benutzern das Lesen ermöglichen möchten, finden wir eine Zahlenrepräsentation.
u g o
rwx r-- r--
111 100 100
7 4 4
Nun wissen wir, dass 111
in binär 7
in dezimal und 100
in binär 4
in dezimal ist. So werden die Berechtigungen sein 744
.
Technisch konvertieren wir, wie von @ LưuVĩnhPhúc und @Braiam hervorgehoben, von binär nach oktal, wie unten beschrieben. Die dezimale und die oktale Darstellung von Zahlen <8 sind jedoch identisch. Bei Binärzahlen mit 3 oder weniger Stellen sind sowohl die dezimale als auch die oktale Darstellung identisch.
Bei der Darstellung als Oktalzahlen können Sie, anstatt sie in Dreiergruppen aufzuteilen und für jede Gruppe eine Binär-zu-Dezimal-Konvertierung durchzuführen, alle drei Gruppen als eine einzige Binärzahl zusammenfassen und in eine Oktalzahl konvertieren.
Hier sind zum Beispiel einige Konvertierungen von Binär in Oktal:
0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744
Beachten Sie, dass ich "0b" und "0o" voranstelle, um zwischen binären und oktalen Zahlen zu unterscheiden.
Wenn Sie damit herumspielen möchten, öffnen Sie ein Terminal, führen Sie es aus python
und spielen Sie dann mit den folgenden Befehlen herum:
oct(0b111111111)
bin(0o555)
Vergessen Sie nicht, den Zahlen "0b" oder "0o" voranzustellen, um dem Computer mitzuteilen, an welcher Basis Sie interessiert sind. (Andernfalls wird die Basis 10 angenommen.)
7
ist das gleiche in dezimal und oktal - ist es aber 777
nicht. Wenn es um das Spiegeln von Bits geht, macht es einen Unterschied.
777
wird manchmal als Gott bezeichnet.
Dateiberechtigungsmittel lesen 4
, Dateiberechtigungsmittel schreiben 2
und Dateiberechtigungsmittel ausführen 1
.
Die Summe davon ist also 7
.
Was nun 777 7
ist, ist zunächst für den Dateibesitzer, dh, der Dateibesitzer hat die Berechtigung zum Lesen, Rechten und Ausführen.
2. 7
ist für die Gruppe, zu der die Datei gehört, bedeutet, dass die Gruppe auch alle Lese-, Schreib- und Ausführungsrechte besitzt.
Und 3. 7
ist für andere Erlaubnis
Wenn Sie der Datei die Erlaubnis geben, 555
dann hat die Datei owner, group and others
nur die Erlaubnis read
und die execute
Erlaubnis not write
, weil die Leseerlaubnis 4 bedeutet und die Ausführung 1 bedeutet, damit die Gesamtzahl erreicht wird5
Mit weniger Worten als der obersten Antwort:
Jede Datei verfügt über drei Berechtigungsoptionen: Lesen, Schreiben und Ausführen. Sie können keine davon, eine davon, zwei davon oder alle auswählen:
C (3,0) + C (3,1) + C (3,2) + C (3,3) = 8
1 + 3 + 3 + 1 = 8
Insgesamt gibt es also 8 Kombinationen; 8 Optionen für Berechtigungen. Ab 0 zählt die letzte Zahl 7 (von 0 bis 7). Also, dargestellt durch Zahlen, hier sind alle Optionen:
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)
Es gibt drei Zahlen, da die Reihenfolge [Benutzerberechtigungen] [Gruppenberechtigungen] [andere Berechtigungen] lautet.
777 bedeutet also, dass alle drei Gruppen über Lese-, Schreib- und Ausführungsberechtigungen verfügen.
read
Nummer 4 anstelle von Nummer 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)
Die einzige Möglichkeit, eindeutige Kombinationen für alle Möglichkeiten zu erhalten, besteht darin, für die Basisoptionen Zweierpotenzen zu verwenden. 2 0 = 1 (execute), 2 1 = 2 (write), 2 2 = 4 (lesen), und wenn es eine vierte Grund Option es 2 nummerierte würde 3 = 8. Beachten Sie, dass write
nicht bis alle Kombinationen von aufgeführt wird Die vorherigen Optionen wurden aufgelistet (dies ist nur eine Option, da es sich nur um eine handelt execute
). read
wird erst aufgelistet, wenn alle Kombinationen vorheriger Optionen aufgelistet wurden (wieder eine, da es nur eine Kombination mit zwei Optionen gibt - execute
+ write
). execute
+ write
+read
wird erst aufgelistet, wenn alle vorherigen Kombinationen aufgelistet wurden (3), da jetzt zwei von drei Berechtigungen zur Auswahl stehen. Die Liste würde auf diese Weise fortgesetzt, egal wie viele grundlegende Optionen es gab. Zum Beispiel mit 4 grundlegenden Optionen (beachten Sie, dass wir auch wissen, dass es insgesamt 16 Kombinationen gibt, da es 4 Optionen und 2 4 = 16 gibt):
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)
Ich bin überrascht, dass so viele ähnliche Antworten die Marke völlig verfehlen.
Nachdem Sie die 3 benötigten Klassen ermittelt haben, können Sie diese lesen, schreiben und ausführen. Sie verwendeten Oktal (3 Bit), um den für die Verwaltung des Dateisystems erforderlichen Speicherplatz zu minimieren .
Aus irgendeinem Grund entschieden sich UNIX-Designer, OCTAL-Nummern für Dateiberechtigungen zu verwenden. Wie Sie wissen, ist ein Maximalwert für eine einstellige Oktalzahl 7. Es hat sich herausgestellt, dass eine Oktalzahl für den Benutzerzugriff, eine für den Gruppenzugriff und eine für den Weltzugriff für fast alles ausreicht. Die maximale 3-stellige Oktalzahl beträgt 777 und es ist nur sinnvoll, dass dies "Zugriff auf alle / alles" bedeutet.
Heutzutage wissen wir alle, dass ein Byte aus 8 Bit besteht . Dies ist seit Jahrzehnten allgemein anerkannt. Dies war jedoch nicht immer der Fall, und Unix (das Linux in vielerlei Hinsicht inspirierte) wurde in einer Zeit geschrieben, in der dies noch debattiert wurde. Insbesondere musste es auf Systeme portierbar sein, die 6-Bit-Bytes oder 8-Bit-Bytes verwendeten. Einige der Leute, die es geschrieben haben, befanden sich auf der einen Seite der Debatte, andere auf der anderen Seite.
In einem ähnlichen Zusammenhang ist Base-2 (binär) keine sehr praktische Notation zum Ausschreiben von Werten. Heutzutage schreiben die meisten Programmierer eine kompaktere Notation, die stattdessen Base-16 (hexadezimal) verwendet. 16 ist gerade groß genug, um genau vier Bits in eine hexadezimale Zahl zu packen: Beispiel: "0000" im Binärformat ist 0x0 im Hexadezimalformat ("0x" ist eine gebräuchliche Methode, um darauf hinzuweisen, dass Sie im Begriff sind, dies zu tun) schreiben Sie eine Hexadezimalzahl), während "1111" 0xF (oder 15 in Dezimalzahl) ist. Sie können tatsächlich jede mögliche Kombination von vier Bits unter Verwendung einer einzelnen Hex-Ziffer schreiben, indem Sie einfach in Binärform zählen, und aufgrund der Funktionsweise der Positionsarithmetik können Sie sie stapeln: Zwei Hex-Ziffern können jede mögliche Kombination von acht Bits codieren, einfach durch Zählen und so weiter. Also die 8-Bit-Leute haben das geliebt.
Die 6-Bit-Leute hatten ihre eigene Methode, aber anstatt Base-16 zu verwenden, verwendeten sie Base-8 (Oktal). Es hat ähnliche Vorteile wie hexadezimal: Sie können jede Position von drei Bits in einer Oktalziffer speichern und Ziffern auf ähnliche Weise stapeln. So wie die 8-Bit-Leute zwei Hex-Ziffern für ein Byte verwendeten, verwendeten die 6-Bit-Leute zwei Oktal-Ziffern für ein Byte. Sie sehen nicht mehr sehr viel Oktal, aber es wurde normalerweise mit einer führenden Null vermerkt: Zum Beispiel ist "111" 07 in Oktal.
Was hat das alles mit Unix-Berechtigungen zu tun? Für Unix gibt es drei Möglichkeiten, mit einer Datei umzugehen: Sie können sie lesen, darauf schreiben oder sie als Programm ausführen. Wenn Sie dies mit Berechtigungen einschränken möchten, benötigen Sie für jede Berechtigung ein bisschen: Aktivieren Sie es für Dinge, die jemand tun darf, und deaktivieren Sie es für Dinge, die jemand nicht tun darf. Da drei Dinge verfolgt werden, benötigen Sie drei Bits, und da Unix diese drei Zeilen verfolgt (Eigentümer, Gruppe und alle), benötigen Sie insgesamt neun Bits.
An einem gewissen Punkt entlang der Linie, jemand -wahrscheinlich in der 6-Bit - Camping- sagte : „Hey, wir Oktal-Ziffern für diese verwenden können“ . Und dies stellte sich als sehr praktische Notation heraus: Drei Oktalziffern reichen gerade aus, um jede mögliche Kombination der Bitfelder zu codieren. Sobald sie sich dazu entschlossen hatten, war das Schicksal von 777 (und das von 000) besiegelt, da diese Zahlen unabhängig von der Anordnung der Bits gleich waren, aber die Reihenfolge für alle anderen Zahlen von Bedeutung war. Also machten sie sich daran.
Sie ordneten die Berechtigungen in Drei-Bit-Felder ein: Lesen am Anfang, Schreiben in der Mitte und Ausführen am Ende. Dann ordneten sie die Felder selbst: Eigentümer am Anfang, Gruppe in der Mitte und andere am Ende. Sobald sie dies getan hatten, mussten sie nur noch zählen, um die restlichen Nummern zuzuweisen.
Da es sich um 3-Bit-Felder handelt, können Sie sagen, dass jede Oktalziffer eines der Felder steuert : Die erste Ziffer steuert die Eigentümerberechtigungen, die zweite Ziffer steuert die Gruppenberechtigungen und die dritte Ziffer steuert andere Berechtigungen. Somit sind 777 (111 111 111) alle Berechtigungen für alle, während 700 (111 000 000) alle Berechtigungen nur für den Eigentümer sind. Andere Kombinationen sind ebenfalls üblich: 666 (110 110 110) wird für alle gelesen / geschrieben, aber nicht ausgeführt), während 555 (101 101 101) für alle gelesen / ausgeführt wird, aber nicht geschrieben, und 400 (100 000 000) wird gelesen. Nur für den Besitzer und keinen Zugang für andere.
Und deshalb bedeutet 777 alle Berechtigungen. Heutzutage ist es wahrscheinlich der beliebteste Grund für die Verwendung von Oktal überhaupt, obwohl Unix und seine Nachkommen noch einige andere Überreste davon haben. Zum Beispiel, od
oder Octal Dump, ist ein Weg, um binäre Speicherauszüge einer Datei in oktaler Form zu erhalten (es hat einen hexadezimalen Cousin, genannt xxd
, aber das ist nicht so bekannt und nicht überall verfügbar). Es ist auch der Grund, warum Sie in einigen Programmiersprachen mit führenden Nullen vorsichtig sein müssen, da diese den Eindruck erwecken, dass Sie beabsichtigen, Zahlen in Oktalen zu schreiben, wenn dies nicht Ihre eigentliche Absicht ist.