Por que o 777 é atribuído ao chmod para permitir tudo em um arquivo?

54

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?

Olá querido
fonte
5
dar uma olhada em help.ubuntu.com/community/FilePermissions
Avinash Raj
2
Consulte o comentário do link de @ AvinashRaj e aplique-o à instância. A pergunta "Por quê?" depende do que exemplo é e qual o propósito que serve ... :)
AzkerM
11
Ele está perguntando sobre o significado do número 7 vs 5 ou por que eles são números em vez de, digamos, letras?
Braiam 27/05
4
Esta é uma ótima pergunta para entrevista; Eu posso ter que roubá-lo.
Digital Chris
5
Estritamente falando, não é 777, mas 0777.
Ruslan

Respostas:

129

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 111de 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 555significa convertendo cada um 5para o binário e escrevendo-o no formato acima. 5em 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 111em binário está 7em decimal, e 100em binário está 4em decimal. Assim, as permissões serão 744.

Editar:

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

daviewales
fonte
17
Por uma questão de completude, o formato dos números é chamado de octais, o que significa literalmente base de 8 (já que eles começam de 0 é 7 + 1 = 8).
Braiam 27/05
3
davie: octal é fácil porque na verdade agrupa três bits, assim como o hexadecimal agrupa quatro. Decimal não é uma potência de 2, por isso não agrupa os bits tão bem.
Konerak 28/05
2
Bem, você obtém o mesmo número em ambos os casos. Eu acho que é mais provável que alguém entenda uma conversão binária em decimal do que uma conversão binária em octal. Além disso, adicionei uma seção no final para esclarecer que os números são realmente octais, não decimais.
Davisales 28/05
3
7é o mesmo em decimal e octal - no entanto, 777não é. Quando você está falando sobre virar bits, isso faz a diferença.
Sam Dufel
2
Apenas por uma questão trivial 7 é referido como Número de Deus e o usuário root, cujas permissões padrão são 777às vezes referido como Deus.
eyoung100
16

Ler permissão de arquivo significa 4, escrever permissão de arquivo 2e 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 555ao arquivo, o arquivo owner, group and othersterá apenas permissão reade permissão, porque a permissão de leitura significa 4 e a execução significa 1, para que o total sejaexecutenot write5

Prakash V Holkar
fonte
O que é grupo e quais são essas outras permissões? Obrigado pela resposta.
hellodear 27/05
Por favor, consulte esta ligação para o grupo e as outras permissões, estas serão aplicadas em qualquer outra pessoa no servidor que é ou não você ou não no seu grupo
Prakash V Holkar
7

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.


Também (indiretamente relacionado, para que você não precise necessariamente ler esta parte), porque acho que sua relevância é importante: Por que o readnú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 writenão está listado até todas as combinações de as opções anteriores foram listadas (que é apenas uma opção, pois é apenas execute). readnã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+readnã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)
Daniel Ward
fonte
6
Essa resposta é totalmente ruim , pois falha em reconhecer o sistema de números binários e, mais importante, octal como fonte dos bits de permissão de arquivo do Unix. (Curiosamente, eles não são 3 ou mesmo 4 ... eles são 6, embora o total de 18 bits não são usados atualmente.)
mirabilos
11
A base não é importante, pois 111 é 7; se digo que as permissões são 111 ou 7 não importa, porque é o mesmo valor. Usei decimal para simplificar o exemplo para mostrar a matemática envolvida. Eu poderia ter usado o binário, mas a matemática não pareceria tão direta. O que importa quando as bases podem ser traduzidas entre si?
Daniel Ward
4

Estou surpreso com tantas respostas semelhantes que perdem completamente o alvo.

Após determinar as três classes necessárias, leia, escreva e execute. Eles foram com octal (3 bits) para minimizar o espaço necessário para gerenciar o sistema de arquivos .

Ununique
fonte
3

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".

DejanLekic
fonte
Não acho que seja uma boa explicação. Os designers do UNIX poderiam ter números decimais e ainda assim terminariam com 7, indicando o acesso máximo, em vez de 9 (como o dígito decimal máximo). O 7 não é escolhido "subtrativamente" com base em quais números são possíveis, iniciando no dígito único mais alto possível, mas "em aditivo", com base no acesso permitido pelos dígitos binários únicos começando em zero, sem direitos.
OU Mapper
Note que eu escrevi no começo "por algum motivo" ... - eu não queria entrar em uma explicação mais profunda sobre por que eles escolheram números octais, pois essa não era a questão do OP. A questão era por que o 777 dá todas as permissões.
precisa saber é o seguinte
É irrelevante aqui por que eles escolheram números octais. O que quero dizer é que a razão pela qual os direitos máximos são representados pelo número 7 não é que 7 seja o número octal máximo.
OR Mapper
2

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

The Spooniest
fonte
Antes de tudo, quando o Linux foi criado (por volta de 1992), o debate de 8 bits e 6 bits terminou. 2º essa não é a razão pela qual isso foi feito
Ahmed Masud
11
Forneci o material de 8 bits / 6 bits para o contexto histórico. O Linux foi criado muito tempo após o término do debate, é verdade, mas, como extraiu grande parte de sua inspiração do Unix, foi afetado por esse debate de maneiras semelhantes. Por isso, pensei que seria uma boa ideia introduzir o contexto histórico.
O Spooniest