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

53

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

    
posta hellodear 27.05.2014 - 10:41

6 risposte

129

Proverò ad affrontare il motivo sottostante perché è 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 binari. 1 è vero, 0 è falso.

Se vuoi dare pieno accesso a tutti, assegnerai 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 111 da binario a decimale, ottieni 7 .

Pertanto, puoi rappresentare pieno accesso come 777 .

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

Funziona anche per tutte le altre modalità di accesso.

Ad esempio, possiamo facilmente capire cosa significa 555 convertendo ogni 5 in binario e scrivendolo nel formato sopra. 5 in 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 consentire solo 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 111 in binario è 7 in decimale e 100 in binario è 4 in decimale. Pertanto, le autorizzazioni saranno 744 .

Modifica:

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 & lt; 8 sono uguali, quindi per i numeri binari con 3 cifre o meno, entrambe le rappresentazioni decimale e ottale sono le stesse.

Quando vengono rappresentati come numeri ottali, invece di dividere in gruppi di tre e di eseguire la conversione da binario a decimale su ciascun gruppo, puoi effettivamente prendere tutti e tre i gruppi insieme come un singolo numero binario e convertire in ottale.

Ad esempio, qui ci sono alcune conversioni da binario a ottale:

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

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

Se vuoi giocare con questo, apri un terminale, esegui python e poi gioca con i seguenti comandi:

oct(0b111111111)
bin(0o555)

Ricorda di anteporre "0b" o "0o" ai numeri per consentire al computer di sapere a quale base sei interessato. (Se non lo fai, assumerà la base 10).

    
risposta data daviewales 27.05.2014 - 16:17
16

Lettura permesso file significa 4 , scrittura permesso file significa 2 ed esecuzione permesso file significa 1 .

Quindi il totale di questo è 7 .

Ora ciò che è 777: il primo 7 è per il proprietario del file che significa che il proprietario del file ha i permessi di lettura, di destra e di esecuzione.

2nd 7 è per il gruppo a cui appartiene il file, significa che il gruppo ha anche tutti i permessi di lettura, scrittura ed esecuzione.

E il 3% di co_de% è riservato ad altri

Se dai il permesso del file 7 allora il file 555 ha solo owner, group and others e read permesso execute permesso perché permesso di lettura significa 4 ed esegue mezzi 1 quindi totale ottiene not write

    
risposta data Prakash V Holkar 27.05.2014 - 10:58
7

In non tante parole come la risposta migliore:

Ogni file ha 3 opzioni di permessi: lettura, scrittura ed esecuzione. 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. Conteggio da 0, l'ultimo numero è 7 (da 0 a 7). Quindi, rappresentati da 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)

Ci sono tre numeri perché l'ordine va [permessi utente] [permessi di gruppo] [altri permessi]

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

Inoltre (indirettamente correlati quindi non devi necessariamente leggere questa parte), perché penso che la sua rilevanza sia importante: Perché read numero 4 invece di 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à è quello di passare per le potenze di 2 per le opzioni di base. 2 0 = 1 (esegui), 2 1 = 2 (scrivi), 2 2 = 4 (leggi), e se ci fosse un 4a opzione di base sarebbe numerata 2 3 = 8. Nota che write non è elencato finché tutte le combinazioni delle opzioni precedenti non sono state elencate (che è solo un'opzione, poiché è solo execute ). read non è elencato finché tutte le combinazioni delle opzioni precedenti non sono state elencate (di nuovo una, poiché esiste una sola combinazione con due opzioni - execute + write ). execute + write + read non è elencato fino a quando non sono state elencate tutte le combinazioni precedenti, che è 3, poiché ora ci sono due scelte 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)
    
risposta data Daniel Ward 27.05.2014 - 20:50
4

Sono sorpreso così tante risposte simili che mi mancano del tutto.

Dopo aver determinato le 3 classi che erano necessarie leggi, scrivi ed esegui. Sono andati con ottale (3 bit) a minimizzare lo spazio necessario per la gestione del file system .

    
risposta data Ununique 31.05.2014 - 00:12
3

Per qualche motivo, i progettisti UNIX hanno deciso di utilizzare i numeri OCTAL per i permessi dei file. Come sapete, un valore massimo per il numero ottale di una cifra è 7. Si è scoperto che una cifra ottale per l'accesso dell'utente, una per l'accesso al gruppo e una per l'accesso al mondo è sufficiente per quasi tutto. Il numero massimo ottale di 3digit è 777, e ha senso solo che denota "accesso a tutti / tutto".

    
risposta data DejanLekic 30.05.2014 - 13:53
2

Al giorno d'oggi, sappiamo tutti che un byte è 8 bit : questo è stato concordato universalmente 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 ai sistemi che usavano Byte a 6 bit o byte a 8 bit. Alcune delle persone che lo hanno scritto erano su un lato del dibattito, e altri erano dall'altra parte.

Su una nota correlata, Base-2 (binario) non è una notazione molto comoda per scrivere i valori. Al giorno d'oggi, la maggior parte dei programmatori scrive una notazione più compatta che utilizza Base-16 (esadecimale) . 16 è appena abbastanza grande di una base da poter contenere esattamente 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 combinazione possibile di quattro bit usando una singola cifra esadecimale, semplicemente contando in binario, e per il modo in cui funziona l'aritmetica posizionale, puoi impilarlo: due cifre esadecimali possono codificare qualsiasi combinazione possibile di otto bit, solo contando e così via. Quindi la gente a 8 bit l'ha adorato.

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 immagazzinare qualsiasi posizione di tre bit in una cifra ottale, e puoi impilare le cifre in un modo simile. Quindi, proprio come la gente a 8 bit usava due cifre esadecimali per un byte, le persone a 6 bit usavano due cifre ottali per un byte. Non si vede più molto l'ottale, ma in genere veniva rilevato con uno zero iniziale: ad esempio, "111" è 07 in ottale.

Ora, cosa ha a che fare tutto ciò con le autorizzazioni Unix? Per quanto riguarda Unix, ci sono tre cose che potresti fare con un file: puoi leggerlo, puoi scriverci o puoi farlo come un programma. Se hai intenzione di limitarlo con i permessi, allora hai bisogno di un po 'per ognuno di essi: attivalo per cose che qualcuno è autorizzato a fare e lasciatelo fuori per cose che qualcuno non è autorizzato a fare. Dato che ci sono tre cose da tenere traccia, hai bisogno di tre bit, e dal momento che Unix lo segue lungo 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 risultò essere una notazione molto comoda: tre cifre ottali sono appena sufficienti per codificare ogni possibile combinazione dei campi di bit. Una volta deciso di farlo, il destino (e quello di 777) è stato sigillato, perché quei numeri sarebbero stati gli stessi indipendentemente dal modo in cui erano disposti i bit, ma l'ordine contava per tutti gli altri numeri, quindi hanno deciso di farlo.

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

Poiché sono campi a 3 bit, puoi dire che ciascuna 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 altri permessi. Pertanto, 777 (111 111 111) è tutte le autorizzazioni per tutti, mentre 700 (111 000 000) sono tutte le autorizzazioni solo per il proprietario. Altre combinazioni sono comuni: 666 (110 110 110) è lettura / scrittura per tutti ma non eseguita), mentre 555 (101 101 101) vengono letti / eseguiti per tutti ma non scritti, e 400 (100.000.000) vengono letti- solo per il proprietario e nessun accesso per nessun altro.

Ed ecco perché 777 significa tutte le autorizzazioni. Oggigiorno è probabilmente la ragione più diffusa per cui la gente usa l'ottale, sebbene Unix e i suoi discendenti ne abbiano ancora qualche altra traccia. Ad esempio, od o 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 gli zeri iniziali in alcuni linguaggi di programmazione, perché potrebbero pensare che hai intenzione di scrivere numeri in ottale quando non è proprio ciò che intendi.

    
risposta data The Spooniest 30.05.2014 - 17:30

Leggi altre domande sui tag