As permissões em sistemas Linux podem ser um pouco complexas para iniciantes. No entanto, compreendê-las é fundamental, pois elas representam uma camada essencial de segurança. Conceder mais permissões do que o necessário pode abrir brechas de segurança, enquanto permissões insuficientes podem impedir o funcionamento adequado de arquivos ou programas.

Para começarmos, vamos visualizar as informações detalhadas dos arquivos usando o comando ls com a opção -l. Abaixo, temos um exemplo da saída do comando ls -l, que mostra informações detalhadas sobre arquivos e diretórios:

-rw-r--r-- 1 rodrigo rodrigo     56 Jun 23 10:14 arquivo.txt
-rw-rw-rw- 1 rodrigo rodrigo 110722 Jun 23 10:16 foto.jpg
-r-xr-xr-x 1 rodrigo rodrigo     19 Jun 23 11:24 init.sh
lrwxrwxrwx 1 rodrigo rodrigo     11 Jun 23 10:18 link-arquivo.lnk -> arquivo.txt
drwxr-xr-x 2 rodrigo rodrigo   4096 Jun 23 10:15 meu-diretorio

Cada linha exibida pelo comando ls -l traz diversas informações sobre um arquivo ou diretório. Vamos analisar a primeira linha da saída, interpretando cada elemento na ordem em que aparece:

  • -rw-r--r-- : Permissões do arquivo. Este será o nosso foco principal neste artigo.
  • 1 : Número de hard links associados ao arquivo.
  • rodrigo : Nome do usuário proprietário (owner) do arquivo.
  • rodrigo : Nome do grupo ao qual o arquivo pertence.
  • 56 : Tamanho do arquivo em bytes. É possível usar a opção -h junto com o comando (ls -lh) para exibir o tamanho de forma mais legível, utilizando unidades como KB ou MB.
  • Jun 23 10:14 : Data e hora da última modificação do arquivo.
  • arquivo.txt : Nome do arquivo.

Vamos focar apenas na primeira parte da linha: as permissões. Essa informação é representada por uma sequência de 10 caracteres, que indicam o tipo do item (arquivo, diretório, link etc.) e as permissões de acesso.

O primeiro caractere dessa sequência indica o tipo do item. Ele informa se estamos lidando com um arquivo comum, um diretório, um link simbólico, entre outros. Abaixo está a lista de caracteres possíveis e seus significados:

  • d => diretório
  • b => arquivo de bloco
  • c => arquivo especial de caractere
  • p => canal
  • s => socket
  • l => link
  • => arquivo “normal”

Portanto, ao observar apenas o primeiro caractere da string de permissões, já podemos identificar o tipo do item. Com isso, conseguimos distinguir rapidamente se estamos lidando com um arquivo comum, um diretório, um link simbólico, entre outros.

PermissãoArquivoPrimeiro CaractereTipo do arquivo
-rw-r--r--arquivo.txt-Arquivo normal
lrwxrwxrwxlink-arquivo.lnklLink simbólico
drwxr-xr-xmeu-diretoriodDiretório

Agora vamos analisar os nove caracteres restantes da string de permissões. Eles são divididos em três blocos de três caracteres cada, representando as permissões atribuídas ao dono do arquivo, ao grupo e aos outros usuários, respectivamente.

rw-r--r--
  • rw- => Permissões do usuário proprietário (owner) do arquivo.
  • r-- => Permissões do grupo (group).
  • r-- => Permissões dos outros usuários (others), ou seja, todos que não são o dono nem pertencem ao grupo.

Cada uma das três posições em cada bloco representa um tipo específico de permissão: leitura, escrita e execução. A presença ou ausência dessas permissões é indicada por letras (r, w, x) ou pelo caractere -, que indica que a permissão correspondente não está concedida.

  • r => A primeira posição indica a permissão de leitura (read). Quando presente, permite visualizar o conteúdo do arquivo. Se for substituída por um traço (-), a leitura não é permitida.
  • w => A segunda posição representa a permissão de escrita (write). Com ela, é possível modificar o conteúdo do arquivo. Se houver um traço (-), a escrita está desabilitada.
  • x => A terceira posição indica a permissão de execução (execute). Essa permissão permite que o arquivo seja executado como um programa ou script. Se estiver como traço (-), o arquivo não pode ser executado.
ownergroupothers
rwrr
leituragravaçãoexecuçãoleituragravaçãoexecuçãoleituragravaçãoexecução
simsimnãosimnãonãosimnãonão

Assim, no exemplo anterior, o proprietário do arquivo possui permissões de leitura e escrita. Os usuários do grupo têm apenas permissão de leitura, e o mesmo vale para os demais usuários (others), que também podem apenas ler o arquivo.

Vamos a outro exemplo. Suponha que um arquivo tenha as seguintes permissões: rwxr-x--x. O que isso significa?

O proprietário do arquivo tem permissões de leitura, escrita e execução. Os usuários do grupo podem ler e executar o arquivo, mas não podem alterá-lo. Já os demais usuários (others) possuem apenas a permissão de execução. Simples, certo?

Alterando as permissões de um arquivo

Para alterar as permissões de um arquivo, utilizamos o comando chmod. Ele aceita dois formatos para definir as permissões: o simbólico e o octal. Vamos começar pelo formato simbólico, que é geralmente considerado mais simples de entender.

Primeiro, precisamos definir a qual grupo de usuários queremos aplicar as permissões: proprietário, grupo ou outros. Para isso, utilizamos os seguintes símbolos:

  • u => proprietário do arquivo (owner)
  • g => grupo (group)
  • o =>demais usuários (others)
  • a => todos os grupos (all), ou seja, proprietário, grupo e outros

Em seguida, usamos símbolos para indicar qual tipo de modificação de permissão desejamos aplicar ao arquivo.

  • + => (simbolo de adição) adicionar a permissão
  • - => (simbolo de subtração) retirar a permissão
  • = =>(simbolo de igual) definir exatamente as permissões, substituindo as atuais

Por fim, utilizamos os símbolos que representam as três permissões básicas que já vimos anteriormente:

  • r => leitura
  • w => gravação (escrita)
  • x => execução

Dessa forma, podemos utilizar o seguinte comando como exemplo:

chmod u+x arquivo.sh

No exemplo acima, estamos concedendo ao arquivo arquivo.sh a permissão de execução para o usuário proprietário.

chmod o-w arquivo.sh

No exemplo acima, estamos removendo a permissão de escrita para os demais usuários (others), ou seja, aqueles que não são nem o proprietário nem membros do grupo do arquivo.

chmod g=rw- arquivo.sh

Agora estamos atribuindo permissões de leitura e escrita ao grupo. Observe que o caractere - na posição da execução indica que essa permissão não está sendo concedida.

Crie um arquivo e experimente diferentes combinações de permissões, sempre utilizando o comando ls -l para visualizar as alterações. Essa prática facilita bastante o entendimento do funcionamento das permissões no Linux.

Formato Numérico (Octal)

O formato numérico octal para permissões é bastante prático, embora possa ser um pouco mais difícil de compreender e se acostumar no início. Além disso, em algumas configurações, ele é o único formato aceito.

Nesse formato, cada grupo de três permissões — proprietário, grupo e outros — é representado por um número de 0 a 7. Vamos utilizar uma tabela para facilitar a compreensão.

PermissãoNº OctalBinário
---0000
--x1001
-w-2010
-wx3011
r--4100
r-x5101
rw-6110
rwx7111
Tabela que relaciona as permissões em formato simbólico com seus valores correspondentes nos sistemas octal e binário.

Dessa forma, podemos atribuir permissões utilizando números octais da seguinte maneira:

chmod 644 arquivo.txt

Aqui temos a permissão 644, em que o primeiro dígito 6 representa o bloco de permissões do proprietário. De acordo com a tabela, isso corresponde a rw- (leitura e escrita). O segundo dígito, 4, corresponde a r--, concedendo apenas permissão de leitura ao grupo. O terceiro dígito, também 4, indica que os demais usuários têm apenas permissão de leitura.

Portanto, ao executar o comando chmod 644 arquivo.txt, as permissões do arquivo passam a ser rw-r--r--.

Veja mais alguns exemplos:

  • 711 => rwx--x--x
  • 660 => rw-rw----
  • 655 =>rw-r-xr-x

Não é necessário decorar toda a tabela; basta lembrar que a permissão de execução corresponde ao valor 1, escrita ao 2 e leitura ao 4. Somando esses valores, é possível obter todas as combinações de permissões.

  • 4 (r) + 2 (w) + 1(x) = 7 (rwx)
  • 4 (r) + 1 (x) = 5 (r-x)
  • 4 (r) + 2 (w) = 6 (rw-)

Algo muito interessante sobre esse sistema de permissões é que, para cada bloco de três permissões, o número correspondente é representado por um valor binário de 3 bits — coincidência? Eu acho que não! Observe a tabela e perceba que cada bit “1” no valor binário indica a presença da permissão na posição correspondente da sequência simbólica.

Esse sistema permite combinar os bits dos três blocos de permissões em um único valor, que pode ser convertido para um número inteiro. Assim, todas as permissões ficam representadas por um único valor. Para verificar se uma permissão está ativa, utilizamos operadores lógicos bit a bit (bitwise) com máscaras específicas.

Vamos ver um exemplo prático utilizando a permissão 644 em um arquivo.

644
rwrrrw-r--r--
110100100= 420 decimal ou 0644 octal

Agora podemos representar todas as permissões como um único número inteiro, lembrando que o binário 110100100 corresponde ao octal 644 e ao decimal 420.

Para verificar se um arquivo possui uma permissão específica, utilizamos o operador bit a bit AND (&) com uma máscara que possui um único bit ligado (1) na posição correspondente à permissão que queremos checar. Um exemplo ajuda a entender melhor.

rwxrwxrwxValor Numérico
permissão110100100420 decimal ou 0644 octal
operador&&&&&&&&&
máscara000000100 4 decimal ou 0004 octal
resultado0000001004 ou 0004

No exemplo acima, utilizamos a máscara 000000100 em binário, ou 0004 em octal, onde o bit 1 está posicionado apenas na permissão de leitura para os outros usuários. Ao realizarmos a operação bit a bit AND (&) entre essa máscara e o valor das permissões, o resultado terá um bit 1 somente na posição de leitura para outros usuários — pois essa é a única posição em que ambos, máscara e permissões, têm o bit 1.

Lembrando que o operador & só retorna 1 quando os dois bits comparados são 1. Portanto, se o resultado da operação for igual à máscara, significa que o arquivo possui a permissão indicada; se for 0, significa que essa permissão não está concedida.

Agora, vamos a outro exemplo, verificando se o usuário proprietário possui permissão de execução.

rwxrwxrwxValor numérico
permissão110100100420 decimal ou 0644 octal
operador&&&&&&&&&
máscara00100000064 decimal ou 0100 octal
resultado0000000000 decimal ou 0000 octal

Neste caso, utilizamos uma máscara diferente: 001000000 em binário, ou 0100 em octal. Essa máscara possui o bit 1 apenas na posição correspondente à permissão de execução do proprietário do arquivo.

Ao realizarmos a operação bit a bit &, comparamos os bits da máscara com os bits das permissões do arquivo. Como na posição de execução do proprietário o valor da permissão é 0 e o da máscara é 1, o resultado da operação nessa posição será 0 — pois, conforme a lógica do operador &, o resultado só será 1 se ambos os bits forem 1.

Como essa é a única posição em que a máscara tem bit 1 e o resultado foi 0, o valor final da operação também será 0. Isso indica que o arquivo não possui permissão de execução para o proprietário.

Claro, em código não precisamos trabalhar diretamente com os valores em binário. Podemos utilizar os valores em octal, com os quais já estamos familiarizados ao usar o comando chmod.

A seguir, temos um exemplo em PHP que utiliza o operador bit a bit & para verificar se uma determinada permissão está presente em um arquivo.

$permissao = 0644;

if($permissao & 0004){
    echo "Tem permissão de leitura para outros usuários\n";
}
if($permissao & 0002){
    echo "Tem permissão de escrita para outros usuários\n";
}
if($permissao & 0001){
    echo "Tem permissão de execucao para outros usuários\n";
}

if($permissao & 0040){
    echo "Tem permissão de leitura para grupo\n";
}
if($permissao & 0020){
    echo "Tem permissão de escrita para grupo\n";
}
if($permissao & 0010){
    echo "Tem permissão de execucao para grupo\n";
}

if($permissao & 0400){
    echo "Tem permissão de leitura para proprietário\n";
}
if($permissao & 0200){
    echo "Tem permissão de escrita para proprietário\n";
}
if($permissao & 0100){
    echo "Tem permissão de execucao para proprietário\n";
}

Compreender o sistema binário não é essencial para utilizar permissões no Linux — basta memorizar a tabela de valores octais. No entanto, entender como ele funciona pode ser muito útil, especialmente para programadores. O modelo de permissões baseado em bits é bastante robusto e pode servir de inspiração para criar sistemas de controle de acesso mais eficientes em suas próprias aplicações.

Ao adotar uma abordagem binária, é possível evitar estruturas de dados pouco otimizadas, como tabelas com uma coluna para cada tipo de permissão (algo que já vi ser usado) ou tabelas com inúmeros registros e a necessidade de realizar JOINs pesados. Utilizar máscaras de bits, como no sistema de permissões do Linux, permite armazenar e consultar múltiplas permissões de forma compacta e performática.

Esta foi uma introdução ao funcionamento do sistema de permissões de arquivos no Linux. Trata-se de um sistema bastante robusto e eficiente, embora possa parecer um pouco confuso para quem está tendo o primeiro contato. Mas não se intimide — com a prática, tudo começa a fazer sentido.

A melhor forma de aprender é colocando a mão na massa: crie um arquivo de teste, utilize o comando chmod para alterar suas permissões e observe os resultados com ls -l. Com o tempo, essas operações se tornarão naturais no seu dia a dia com o Linux.

Espero que tenha ajudado. T++