Warum ist chmod 777 zugewiesen, um alles in einer Datei zuzulassen?

54

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?

Höllenlieb
quelle
5
Werfen Sie
Avinash Raj
2
Lesen Sie den Link-Kommentar von @ AvinashRaj und wenden Sie ihn auf die Instanz an. Die Frage "Warum?" hängt davon ab, um welche Instanz es sich handelt und welchen Zweck es
erfüllt
1
Fragt er nach der Bedeutung der Zahl 7 gegen 5 oder warum es sich um Zahlen handelt, anstatt beispielsweise um Buchstaben?
Braiam
4
Dies ist eine großartige Interviewfrage. Ich muss es vielleicht stehlen.
Digital Chris
5
Genau genommen ist es nicht 777, sondern 0777.
Ruslan

Antworten:

129

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 111von 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 555bedeutet, indem wir jedes 5in ein Binärformat umwandeln und es in das obige Format schreiben. 5in 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 111in binär 7in dezimal und 100in binär 4in dezimal ist. So werden die Berechtigungen sein 744.

Bearbeiten:

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 pythonund 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.)

daviewales
quelle
17
Der Vollständigkeit halber werden die Zahlen als Oktale bezeichnet, was wörtlich Basis von 8 bedeutet (da sie bei 0 beginnen, ist 7 + 1 = 8).
Braiam
3
davie: oktal ist einfach, weil es drei Bits gruppiert, genauso wie hexadezimale Gruppen vier. Dezimal ist keine Potenz von 2, daher werden Bits nicht so gut gruppiert.
Konerak
2
In beiden Fällen erhalten Sie die gleiche Nummer. Ich denke, es ist wahrscheinlicher, dass jemand eine Umwandlung von Binär in Dezimal als eine Umwandlung von Binär in Oktal versteht. Außerdem habe ich am Ende einen Abschnitt hinzugefügt, um zu verdeutlichen, dass die Zahlen wirklich oktal und nicht dezimal sind.
Daviewales
3
7ist das gleiche in dezimal und oktal - ist es aber 777nicht. Wenn es um das Spiegeln von Bits geht, macht es einen Unterschied.
Sam Dufel
2
Nur aus unbedeutenden Gründen wird 7 als Gottes Nummer bezeichnet, und der Root-Benutzer, dessen Standardberechtigungen angegeben sind, 777wird manchmal als Gott bezeichnet.
eyoung100
16

Dateiberechtigungsmittel lesen 4, Dateiberechtigungsmittel schreiben 2und Dateiberechtigungsmittel ausführen 1.

Die Summe davon ist also 7.

Was nun 777 7ist, ist zunächst für den Dateibesitzer, dh, der Dateibesitzer hat die Berechtigung zum Lesen, Rechten und Ausführen.

2. 7ist für die Gruppe, zu der die Datei gehört, bedeutet, dass die Gruppe auch alle Lese-, Schreib- und Ausführungsrechte besitzt.

Und 3. 7ist für andere Erlaubnis

Wenn Sie der Datei die Erlaubnis geben, 555dann hat die Datei owner, group and othersnur die Erlaubnis readund die executeErlaubnis not write, weil die Leseerlaubnis 4 bedeutet und die Ausführung 1 bedeutet, damit die Gesamtzahl erreicht wird5

Prakash V Holkar
quelle
Was ist eine Gruppe und was sind diese anderen Berechtigungen? Danke für die Antwort.
Hellodear
Über diesen Link erhalten Sie Informationen zu Gruppen- und anderen Berechtigungen. Diese werden für alle anderen Benutzer auf dem Server erzwungen, die entweder nicht zu Ihnen oder nicht zu Ihrer Gruppe gehören
Prakash V Holkar
7

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.


Auch (indirekt verwandt, so dass Sie diesen Teil nicht unbedingt lesen müssen), weil ich seine Relevanz für wichtig halte: Warum ist readNummer 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 writenicht 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). readwird erst aufgelistet, wenn alle Kombinationen vorheriger Optionen aufgelistet wurden (wieder eine, da es nur eine Kombination mit zwei Optionen gibt - execute+ write). execute+ write+readwird 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)
Daniel Ward
quelle
6
Diese Antwort ist äußerst schlecht, da sie das binäre und vor allem das Oktalzahlensystem nicht als Quelle für Unix-Dateiberechtigungsbits erkennt. (Komischerweise sind sie nicht 3 oder sogar 4 ... sie sind 6, obwohl die vollen 18-Bit derzeit nicht verwendet werden.)
Mirabilos
1
Die Basis ist unwichtig, da 111 7 ist; ob ich sage, dass die Berechtigungen 111 oder 7 sind, spielt keine Rolle, weil es der gleiche Wert ist. Ich habe der Einfachheit halber Dezimalstellen verwendet, um die Mathematik zu veranschaulichen. Ich hätte binär verwenden können, aber die Mathematik hätte nicht so einfach ausgesehen. Was macht es aus, wenn die Basen untereinander übersetzt werden können?
Daniel Ward
4

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 .

Einzigartig
quelle
3

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.

DejanLekic
quelle
Ich denke nicht, dass dies eine gute Erklärung ist. UNIX-Designer könnten Dezimalzahlen haben und hätten am Ende immer noch 7 für den maximalen Zugriff anstatt 9 (als maximale Dezimalstelle). Die 7 wird nicht "subtraktiv" gewählt, basierend darauf, welche Zahlen ab der höchstmöglichen einzelnen Ziffer möglich sind, sondern "additiv" basierend auf dem Zugriff, der von den einzelnen Binärziffern ab Null für überhaupt keine Rechte gewährt wird.
ODER Mapper
Beachten Sie, dass ich gleich am Anfang "aus irgendeinem Grund" schrieb ... - Ich wollte nicht näher darauf eingehen, warum sie Oktalzahlen auswählten, da dies nicht die OP-Frage war. Die Frage war, warum 777 alle Berechtigungen erteilt.
DejanLekic
Dabei ist es unerheblich, warum sie Oktalzahlen gewählt haben. Mein Punkt ist, dass der Grund, warum maximale Rechte durch die Zahl 7 dargestellt werden, nicht der ist, dass 7 zufällig die maximale Oktalzahl ist.
ODER Mapper
2

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, ododer 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.

Der Löffeligste
quelle
Zuallererst, als Linux erstellt wurde (ca. 1992), war die 8-Bit-6-Bit-Debatte WEG. 2. Das ist NICHT der Grund, warum dies getan wurde
Ahmed Masud
1
Ich habe das 8-Bit / 6-Bit-Material für den historischen Kontext bereitgestellt. Linux wurde lange nach dem Ende dieser Debatte entwickelt, aber da es so stark von Unix inspiriert war, war es in ähnlicher Weise von dieser Debatte betroffen. Aus diesem Grund hielt ich es für eine gute Idee, den historischen Kontext einzuführen.
The Spooniest