Perché 777 è assegnato a chmod per consentire tutto su un file?


54

Mi è stato chiesto in un'intervista perché 777 è assegnato a prendere tutte le autorizzazioni per un file. Perché non 555? Ha detto che c'è una ragione per tutto. Quindi, qual è il motivo per 777? Perché non qualsiasi altro numero? C'è qualche significato in questo numero?



2
Fai riferimento al commento del link @ AvinashRaj e applicalo all'istanza. La domanda "Perché?" dipende da quale istanza è e quale scopo serve ... :)
AzkerM

1
Sta chiedendo il significato del numero 7 vs 5 o perché sono numeri anziché, diciamo, lettere?
Braiam,

4
Questa è un'ottima domanda per l'intervista; Potrei doverlo rubare.
Digital Chris,

5
A rigor di termini, non è 777, ma 0777.
Ruslan,

Risposte:


129

Cercherò di affrontare la ragione di fondo per cui è 777, piuttosto che aaa, o 999.

Ricorda che le autorizzazioni sono disponibili nel seguente formato:

 u   g   o
rwx rwx rwx

dove u = utente, g = gruppo, o = altro.

Ora, immagina di rappresentare ognuno di questi gruppi come binario. 1 è vero, 0 è falso.

Se vuoi dare pieno accesso a tutti, assegneresti le seguenti autorizzazioni in binario:

 u   g   o
rwx rwx rwx
111 111 111

Ora, se conosci il binario, ti renderai conto che quando converti 111da binario a decimale, ottieni 7.

Pertanto, è possibile rappresentare l'accesso completo come 777.

Nota: stiamo davvero convertendo da binario a ottale. Vedi la modifica qui sotto.

Funziona anche con tutte le altre modalità di accesso.

Ad esempio, possiamo facilmente capire cosa 555significa convertendoli 5in binari e scrivendoli nel formato sopra. 5in binario è 101, quindi abbiamo le seguenti autorizzazioni:

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

Allo stesso modo, se vogliamo dare tutte le autorizzazioni all'utente, ma solo consentire ad altre persone di leggere, possiamo trovare una rappresentazione numerica.

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

Ora sappiamo che 111in binario è 7in decimale e 100in binario è 4in decimale. Pertanto, le autorizzazioni saranno 744.

Modificare:

Tecnicamente, come evidenziato da @ LưuVĩnhPhúc e @Braiam, stiamo convertendo da binario a ottale, come descritto di seguito. Tuttavia, le rappresentazioni decimali e ottali dei numeri <8 sono uguali, quindi per i numeri binari con 3 cifre o meno, le rappresentazioni sia decimali che ottali sono uguali.

Se rappresentato come numeri ottali, anziché dividere in gruppi di tre, e fare una conversione binaria in decimale su ciascun gruppo, è possibile effettivamente prendere tutti e tre i gruppi insieme come un singolo numero binario e convertirli in ottali.

Ad esempio, ecco alcune conversioni binarie in ottali:

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

Nota che sto anteponendo "0b" e "0o" per distinguere tra numeri binari e ottali.

Se vuoi giocare con questo, apri un terminale, corri pythone poi gioca con i seguenti comandi:

oct(0b111111111)
bin(0o555)

Ricorda di anteporre "0b" o "0o" ai numeri per far sapere al computer a quale base sei interessato. (In caso contrario, assumerà la base 10.)


17
Solo per completezza, il formato dei numeri è chiamato ottali, che letteralmente significa base di 8 (poiché iniziano da 0 è 7 + 1 = 8).
Braiam,

3
davie: octal è facile perché in realtà raggruppa tre bit, proprio come i gruppi esadecimali quattro. Il decimale non è una potenza di 2, quindi non raggruppa i bit così bene.
Konerak,

2
Bene, ottieni lo stesso numero in entrambi i casi. Penso che sia più probabile che qualcuno capisca una conversione binaria in decimale rispetto a una conversione binaria in ottale. Inoltre, ho aggiunto una sezione alla fine per chiarire che i numeri sono davvero ottali, non decimali.
daviewales,

3
7è lo stesso in decimale e ottale, tuttavia 777non lo è. Quando parli di lanciare bit, fa la differenza.
Sam Dufel,

2
Solo per amor di poco, 7 viene indicato come Numero di Dio e l'utente root, i cui permessi predefiniti sono a 777volte indicati come Dio.
eyoung100,

16

Lettura dei mezzi di autorizzazione dei file 4, scrittura dei mezzi di autorizzazione dei file 2ed esecuzione dei mezzi di autorizzazione dei file 1.

Quindi il totale è questo 7.

Ora, ciò che è 777: il primo 7è per il proprietario del file che significa che il proprietario del file ha letto, corretto ed eseguito i permessi.

Il secondo 7è per il gruppo a cui appartiene il file, significa che il gruppo ha anche tutte le autorizzazioni di lettura, scrittura ed esecuzione.

E il terzo 7è per il permesso degli altri

Se dai l'autorizzazione 555al file, il file owner, group and othersha solo l' autorizzazione reade l' autorizzazione perché l'autorizzazione di lettura significa 4 ed esegui significa 1, quindi il totale ottieneexecutenot write5


Che cos'è il gruppo e quali sono quelle altre autorizzazioni? Grazie per la risposta
hellodear

Si prega di fare riferimento a questo collegamento per il gruppo e le altre autorizzazioni, che verranno applicate a chiunque altro sul server che non sia o non sia nel proprio gruppo
Prakash V Holkar,

7

In non tante parole come la risposta principale:

Ogni file ha 3 opzioni di autorizzazioni: lettura, scrittura ed esecuzione. Non puoi scegliere nessuno di questi, uno di questi, due di questi o tutti questi:

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

1 + 3 + 3 + 1 = 8

Quindi, complessivamente, ci sono 8 combinazioni; 8 opzioni per le autorizzazioni. Contando da 0, l'ultimo numero è 7 (da 0 a 7). Quindi, rappresentato dai numeri, ecco tutte le opzioni:

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)

Esistono tre numeri perché l'ordine passa [autorizzazioni utente] [autorizzazioni gruppo] [altre autorizzazioni]

Quindi, 777 significa che tutti e tre i gruppi hanno autorizzazioni di lettura, scrittura ed esecuzione.


Inoltre (indirettamente correlato, quindi non devi necessariamente leggere questa parte), perché penso che la sua rilevanza sia importante: perché è il readnumero 4 anziché il numero 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)

L'unico modo per ottenere combinazioni uniche per tutte le possibilità è usare poteri di 2 per le opzioni di base. 2 0 = 1 (esegui), 2 1 = 2 (scrivi), 2 2 = 4 (leggi), e se ci fosse una quarta opzione di base sarebbe numerata 2 3 = 8. Nota che writenon è elencato fino a quando tutte le combinazioni di sono state elencate le opzioni precedenti (che è solo un'opzione, poiché è solo execute). readnon è elencato fino a quando non sono state elencate tutte le combinazioni di opzioni precedenti (di nuovo una, poiché esiste solo una combinazione con due opzioni - execute+ write). execute+ write+readnon è elencato fino a quando non sono state elencate tutte le combinazioni precedenti, ovvero 3, poiché ora sono disponibili due opzioni tra tre autorizzazioni. L'elenco continuerebbe in questo modo, indipendentemente da quante opzioni di base esistessero. Per esempio, con 4 opzioni di base (nota che sappiamo anche che ci saranno 16 combinazioni in totale poiché ci sono 4 opzioni e 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
Questa risposta è assolutamente negativa in quanto non riesce a riconoscere il sistema numerico binario e, soprattutto, ottale come fonte per i bit di autorizzazione dei file Unix. (Stranamente, non sono 3 o addirittura 4 ... sono 6, anche se al momento non sono usati i 18 bit completi.)
mirabilos,

1
La base non è importante, in quanto 111 è 7; se dico che le autorizzazioni sono 111 o 7 non importa, perché ha lo stesso valore. Ho usato il decimale per semplicità di esempio per mostrare la matematica in questione. Avrei potuto usare il binario, ma la matematica non sarebbe sembrata così semplice. Cosa importa quando le basi possono essere tradotte tra loro?
Daniel Ward,

4

Sono sorpreso da così tante risposte simili che mancano completamente il segno.

Dopo aver determinato le 3 classi necessarie leggere, scrivere ed eseguire. Sono andati con ottale (3 bit) per ridurre al minimo lo spazio necessario per la gestione del file system .


3

Per qualche motivo, i progettisti UNIX hanno deciso di utilizzare i numeri OCTAL per le autorizzazioni dei file. Come sapete, un valore massimo per un numero ottale di una cifra è 7. È risultato che una cifra ottale per l'accesso degli utenti, una per l'accesso al gruppo e una per l'accesso al mondo è sufficiente per quasi tutto. Il numero ottale massimo di 3digit è 777 e ha senso solo che indica "accesso a tutti / a tutto".


Non credo sia una buona spiegazione. I progettisti UNIX potrebbero avere numeri decimali e avrebbero comunque finito con 7 che indica l'accesso massimo, anziché 9 (come cifra decimale massima). Il 7 non viene scelto "in modo sottrattivo" in base a quali numeri sono possibili a partire dalla cifra singola più alta possibile, ma "in modo additivo" in base all'accesso consentito dalle singole cifre binarie che iniziano da zero per nessun diritto.
OR Mapper

Notate che ho scritto all'inizio "per qualche motivo" ... - Non volevo andare a una spiegazione più approfondita del PERCHÉ hanno scelto i numeri ottali, poiché quella non era la domanda del PO. La domanda era perché 777 concedesse tutte le autorizzazioni.
DejanLekic,

È irrilevante qui perché hanno scelto i numeri ottali. Il mio punto è che la ragione per cui i diritti massimi sono rappresentati dal numero 7 non è che 7 sia il numero ottale massimo.
OR Mapper

2

Oggi sappiamo tutti che un byte è 8 bit : questo è stato universalmente concordato per decenni. Ma non è sempre stato così, e Unix (che ha ispirato Linux in molti modi) è stato scritto in un periodo in cui questo era ancora in discussione. In particolare, doveva essere portabile su sistemi che utilizzavano byte a 6 bit o byte a 8 bit. Alcune delle persone che l'hanno scritto erano da una parte del dibattito e altre dall'altra parte.

In una nota correlata, Base-2 (binario) non è una notazione molto conveniente per scrivere valori. Oggi la maggior parte dei programmatori scrive una notazione più compatta che utilizza invece Base-16 (esadecimale) . 16 è abbastanza grande di una base che potresti esattamente impacchettare quattro bit in una cifra esadecimale: ad esempio, "0000" in binario è 0x0 in esadecimale (che "0x" è un modo comune per notare che stai per scrivere un numero esadecimale), mentre "1111" è 0xF (o 15 in decimale). Puoi effettivamente scrivere qualsiasi possibile combinazione di quattro bit usando una singola cifra esadecimale, semplicemente contando in binario, e grazie al modo in cui funziona l'aritmetica posizionale, puoi impilarla: due cifre esadecimali possono codificare qualsiasi possibile combinazione di otto bit, solo contando e così via. Quindi la gente a 8 bit ha adorato questo.

Le persone a 6 bit avevano il loro modo di farlo, ma invece di usare Base-16, usavano Base-8 (ottale). Ha vantaggi simili a quelli esadecimali: puoi memorizzare qualsiasi posizione di tre bit in una cifra ottale e puoi impilare le cifre in modo simile. Quindi, proprio come la gente a 8 bit ha usato due cifre esadecimali per un byte, la gente a 6 bit ha usato due cifre ottali per un byte. Non vedi più molto l'ottale, ma in genere è stato notato con uno zero iniziale: ad esempio, "111" è 07 in ottale.

Ora, cosa c'entra tutto ciò con le autorizzazioni Unix? Per quanto riguarda Unix, ci sono tre cose che potresti fare con un file: puoi leggerlo, puoi scrivergli o eseguirlo come programma. Se hai intenzione di limitarlo con le autorizzazioni, allora hai bisogno di un po 'per ciascuno di essi: attivalo per le cose che qualcuno è autorizzato a fare e lascialo spento per le cose che qualcuno non è autorizzato a fare. Dato che ci sono tre cose da tracciare, hai bisogno di tre bit, e poiché Unix lo segue su tre linee (proprietario, gruppo e tutti) hai bisogno di nove bit in totale.

Ad un certo punto lungo la linea, qualcuno - probabilmente nel campo a 6 bit - ha detto "Ehi, possiamo usare cifre ottali per questo" . E questa si è rivelata una notazione molto conveniente: tre cifre ottali sono appena sufficienti per codificare ogni possibile combinazione dei campi di bit. Una volta che decisero di farlo, il destino (e quelli di 000) del 777 furono suggellati, perché quei numeri sarebbero stati gli stessi indipendentemente da come disponessero i bit, ma l'ordine contava per tutti gli altri numeri, quindi si misero a farlo.

Hanno organizzato le autorizzazioni in campi a tre bit: leggere all'inizio, scrivere nel mezzo ed eseguire alla fine. Quindi hanno organizzato i campi stessi: proprietario all'inizio, gruppo nel mezzo e altri alla fine. Una volta fatto questo, tutto ciò che dovevano fare per assegnare il resto dei numeri era contare.

Poiché sono campi a 3 bit, puoi dire che ogni cifra ottale controlla uno dei campi : la prima cifra controlla le autorizzazioni del proprietario, la seconda cifra controlla le autorizzazioni del gruppo e la terza cifra controlla le altre autorizzazioni. Pertanto, 777 (111 111 111) sono tutte le autorizzazioni per tutti, mentre 700 (111 000 000) sono tutte le autorizzazioni solo per il proprietario. Altre combinazioni sono anche comuni: 666 (110 110 110) viene letto / scritto per tutti ma non eseguito), mentre 555 (101 101 101) viene letto / eseguito per tutti ma non si scrive e 400 (100.000.000) viene letto- solo per il proprietario e nessun accesso per nessun altro.

Ed è per questo che 777 significa tutte le autorizzazioni. In questi giorni, è probabilmente il motivo più popolare per cui le persone usano affatto l'ottale, sebbene Unix e i suoi discendenti ne abbiano ancora qualche altra traccia. Ad esempio, odo Octal Dump, è un modo per ottenere i dump binari di un file in forma ottale (ha un cugino esadecimale, chiamato xxd, ma non è così noto e non è disponibile ovunque). È anche il motivo per cui devi stare attento con lo zero iniziale in alcuni linguaggi di programmazione, perché potrebbero pensare che intendi scrivere numeri in ottale quando non è proprio il tuo intento.


prima di tutto quando è stato creato Linux (circa 1992) il dibattito a 8 bit a 6 bit era FINITO. 2 ° NON è questo il motivo per cui è stato fatto
Ahmed Masud,

1
Ho fornito il materiale a 8 bit / 6 bit per il contesto storico. Linux è stato creato molto tempo dopo la fine del dibattito, è vero, ma poiché ha tratto gran parte della sua ispirazione da Unix, è stato influenzato da quel dibattito in modi simili. Questo è il motivo per cui ho pensato che sarebbe stata una buona idea introdurre il contesto storico.
The Spooniest
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.