Em uma entrevista, perguntaram-me por que o 777 está atribuído a todas as permissões de um arquivo. Por que não 555? Ele disse que há razões para tudo. Então, qual é o motivo do 777? Por que não outro número? Existe algum significado nesse número?
Em uma entrevista, perguntaram-me por que o 777 está atribuído a todas as permissões de um arquivo. Por que não 555? Ele disse que há razões para tudo. Então, qual é o motivo do 777? Por que não outro número? Existe algum significado nesse número?
Respostas:
Vou tentar abordar a razão subjacente porque é 777, em vez de AAA, ou 999.
Lembre-se de que as permissões vêm no seguinte formato:
u g o
rwx rwx rwx
onde u = usuário, g = grupo, o = outro.
Agora, imagine que você esteja representando cada um desses grupos como binários. 1 é verdadeiro, 0 é falso.
Se você deseja conceder acesso total a todos, atribua as seguintes permissões em binário:
u g o
rwx rwx rwx
111 111 111
Agora, se você souber binário, perceberá que, ao converter 111
de binário para decimal, você obtém 7
.
Assim, você pode representar o acesso completo como 777
.
Nota: Estamos realmente convertendo de binário para octal. Veja a edição abaixo.
Isso funciona para todos os outros modos de acesso também.
Por exemplo, podemos facilmente descobrir o que 555
significa convertendo cada um 5
para o binário e escrevendo-o no formato acima. 5
em binário é 101
, então temos as seguintes permissões:
u g o
r-x r-x r-x
101 101 101
5 5 5
Da mesma forma, se queremos conceder todas as permissões ao usuário, mas permitir apenas que outras pessoas leiam, podemos encontrar uma representação numérica.
u g o
rwx r-- r--
111 100 100
7 4 4
Agora, sabemos que 111
em binário está 7
em decimal, e 100
em binário está 4
em decimal. Assim, as permissões serão 744
.
Tecnicamente, conforme destacado por @ LưuVĩnhPhúc e @Braiam, estamos convertendo de binário para octal, conforme descrito abaixo. No entanto, as representações decimais e octais dos números <8 são iguais; portanto, para números binários com 3 dígitos ou menos, as representações decimais e octais são as mesmas.
Quando representados como números octais, em vez de se dividir em grupos de três, e fazendo a conversão de binário para decimal em cada grupo, é possível reunir todos os três grupos como um único número binário e converter em octal.
Por exemplo, aqui estão algumas conversões de binárias para octais:
0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744
Observe que estou acrescentando "0b" e "0o" para distinguir entre números binários e octais.
Se você quiser brincar com isso, abra um terminal, execute python
e brinque com os seguintes comandos:
oct(0b111111111)
bin(0o555)
Lembre-se de acrescentar "0b" ou "0o" aos números para informar ao computador em que base você está interessado. (Caso contrário, ele assumirá a base 10.)
7
é o mesmo em decimal e octal - no entanto, 777
não é. Quando você está falando sobre virar bits, isso faz a diferença.
777
às vezes referido como Deus.
Ler permissão de arquivo significa 4
, escrever permissão de arquivo 2
e executar significa permissão de arquivo 1
.
Então, o total disso é 7
.
Agora, o que é o 777: primeiro 7
é para o proprietário do arquivo, o que significa que o proprietário do arquivo leu, corrigiu e executou a permissão.
O segundo 7
é para o grupo ao qual o arquivo pertence, significa que o grupo também possui todas as permissões de leitura, gravação e execução.
E a terceira 7
é para permissão de outros
Se você der permissão 555
ao arquivo, o arquivo owner, group and others
terá apenas permissão read
e permissão, porque a permissão de leitura significa 4 e a execução significa 1, para que o total sejaexecute
not write
5
Em poucas palavras, como a resposta principal:
Cada arquivo possui 3 opções de permissão: ler, gravar e executar. Você pode escolher nenhum destes, um destes, dois destes ou todos estes:
C (3,0) + C (3,1) + C (3,2) + C (3,3) = 8
1 + 3 + 3 + 1 = 8
Então, no total, existem 8 combinações; 8 opções para permissões. Contando de 0, o último número é 7 (de 0 a 7). Então, representado por números, aqui estão todas as opções:
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)
Existem três números porque a ordem vai [permissões de usuário] [permissões de grupo] [outras permissões]
Portanto, 777 significa que todos os três grupos têm permissões de leitura, gravação e execução.
read
número 4 é o número 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)
A única maneira de obter combinações únicas para todas as possibilidades é usar potências de 2 para as opções básicas. 2 0 = 1 (execução), 2 1 = 2 (gravação), 2 2 = 4 (leitura) e, se houvesse uma quarta opção básica, ela seria numerada 2 3 = 8. Observe que write
não está listado até todas as combinações de as opções anteriores foram listadas (que é apenas uma opção, pois é apenas execute
). read
não será listado até que todas as combinações de opções anteriores tenham sido listadas (novamente uma, pois existe apenas uma combinação com duas opções - execute
+ write
). execute
+ write
+read
não será listado até que todas as combinações anteriores tenham sido listadas, que é 3, pois agora existem duas opções entre três permissões. A lista continuaria dessa maneira, não importa quantas opções básicas existissem. Por uma questão de exemplo, com 4 opções básicas (note que também sabemos que haverá 16 combinações no total, pois existem 4 opções 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)
Por alguma razão, os designers do UNIX decidiram usar números OCTAL para permissões de arquivo. Como você sabe, um valor máximo para o número octal de um dígito é 7. Acabou que um dígito octal para acesso do usuário, um para o acesso ao grupo e outro para o acesso mundial é suficiente para quase tudo. O número octal 3digit máximo é 777 e faz sentido que denote "acesso a todos / tudo".
Hoje em dia, todos sabemos que um byte é de 8 bits : isso foi universalmente aceito por décadas. Mas nem sempre foi esse o caso, e o Unix (que inspirou o Linux de várias maneiras) foi escrito durante um período em que isso ainda estava sendo debatido. Em particular, precisava ser portátil para sistemas que usavam bytes de 6 ou 8 bits. Algumas das pessoas que escreveram estavam de um lado do debate e outras do outro lado.
Em uma nota relacionada, a Base-2 (binária) não é uma notação muito conveniente para escrever valores. Atualmente, a maioria dos programadores escreve uma notação mais compacta que usa a Base-16 (hexadecimal) . 16 é uma base suficientemente grande para que você possa exatamente compilar quatro bits em um dígito hexadecimal: por exemplo, "0000" em binário é 0x0 em hexadecimal (que "0x" é uma maneira comum de observar que você está prestes a escreva um número hexadecimal), enquanto "1111" é 0xF (ou 15 em decimal). Você pode escrever qualquer combinação possível de quatro bits usando um único dígito hexadecimal, apenas contando em binário, e devido à maneira como a aritmética posicional funciona, você pode empilhá-lo: dois dígitos hexadecimais podem codificar qualquer combinação possível de oito bits, apenas contando, e assim por diante. Então o pessoal de 8 bits adorou isso.
O pessoal de 6 bits tinha sua própria maneira de fazer isso, mas em vez de usar a Base-16, eles usavam a Base-8 (octal). Possui vantagens semelhantes ao hexadecimal: você pode armazenar qualquer posição de três bits em um dígito octal e pode empilhar dígitos de maneira semelhante. Assim como as pessoas de 8 bits usavam dois dígitos hexadecimais para um byte, as pessoas de 6 bits usavam dois dígitos octais para um byte. Você não vê mais octal muito, mas normalmente era marcado com um zero à esquerda: por exemplo, "111" é 07 em octal.
Agora, o que tudo isso tem a ver com permissões do Unix? No que diz respeito ao Unix, há três coisas que você pode fazer com um arquivo: você pode lê-lo, escrevê-lo ou executá-lo como um programa. Se você quiser restringir isso com permissões, precisará de um pouco para cada um deles: ative-o para as coisas que alguém tem permissão para fazer e deixe-o para as coisas que alguém não tem permissão para fazer. Como há três coisas sendo rastreadas, você precisa de três bits, e como o Unix o acompanha em três linhas (proprietário, grupo e todos), você precisa de nove bits no total.
Em algum momento, alguém - provavelmente no campo de 6 bits - disse "Ei, podemos usar dígitos octais para isso" . E isso acabou sendo uma notação muito conveniente: três dígitos octais são suficientes para codificar todas as combinações possíveis dos campos de bits. Depois que eles decidiram fazer isso, o destino do 777 (e o 000) foram selados, porque esses números seriam os mesmos, não importando como eles organizassem os bits, mas a ordem importava para todos os outros números, então eles começaram a fazer isso.
Eles organizaram as permissões em campos de três bits: leia no início, escreva no meio e execute no final. Depois, eles mesmos organizaram os campos: proprietário no início, grupo no meio e outros no final. Depois que eles fizeram isso, tudo o que eles tinham que fazer para atribuir o resto dos números era contar.
Como são campos de 3 bits, você pode dizer que cada dígito octal controla um dos campos : o primeiro dígito controla as permissões de proprietário, o segundo dígito controla as permissões de grupo e o terceiro dígito controla outras permissões. Assim, 777 (111 111 111) são todas permissões para todos, enquanto 700 (111 000 000) são todas permissões apenas para o proprietário. Outras combinações também são comuns: 666 (110 110 110) é de leitura / gravação para todos, mas não é executado), enquanto 555 (101 101 101) é de leitura / execução para todos, mas não é gravado, e 400 (100 000 000) são somente para o proprietário e sem acesso para mais ninguém.
E é por isso que 777 significa todas as permissões. Hoje em dia, é provavelmente a razão mais popular para as pessoas usarem octal, embora o Unix e seus descendentes ainda tenham alguns outros vestígios. Por exemplo, od
ou Octal Dump, é uma maneira de obter dumps binários de um arquivo na forma octal (ele tem um primo hexadecimal, chamado xxd
, mas isso não é tão conhecido e não está disponível em todos os lugares). É também por isso que você precisa ter cuidado com os zeros à esquerda em algumas linguagens de programação, porque elas podem pensar que você pretende escrever números em octal quando essa não é realmente sua intenção.