quarta-feira, 7 de maio de 2008

Entendendo o Sistema de Permissões no Linux

No Linux, assim como em outros sistemas operacionais, os arquivos podem possuir determinados atributos, ou permissões. Na época do DOS, até mais ou menos o Windows Me, os sistemas da Microsoft (que rodavam em partições FAT16 ou FAT32) trabalhavam apenas com dois atributos: oculto e somente-leitura, podiam ter valor de 0 ou 1.

Nos sistemas Microsoft da família NT (onde entram inclusive o XP e o Vista) temos um sistema de permissões próximo ao que trabalhamos no Linux, que são pemissões de leitura, escrita e execução, que podem ser configuradas em um arquivo, para serem inerentes ao dono do arquivo, ao grupo dono do arquivo e a outros usuários.

Normalmente as permissões nos arquivos são configuradas através do comando chmod permissões arquivo, onde permissões podem ser 1 para execução, 2 para escrita e 4 para leitura, ou uma combinação destes.

Exemplos?

Suponhamos que temos o arquivo programa, que pode ser executado/lido/escrito pelo seu dono e seu grupo, mas não pode ser acessado por outros usuários, devemos então usar o comando

Chmod 770 programa

Ou suponhamos o arquivo tabela, que não será executado, mas será lido e escrito por seu dono e será apenas lido por quaisquer outros usuários, um exemplo

Chmod 644 planilha

Simples, não? Muitas pessoas, porém não entendem o porquê do uso dessa numeração. A explicação é bem simples, e ajuda bastante a entender uma parte fundamente de funcionamento do sistema e ajuda a se familiarizar com o processo.

Dando um ls –l em um determinado diretório, temos o seguinte retorno

drwxrwxrwx diretório
-rwxrwx--- programa
-rw-r-—r-- planilha


Essa informação retornada antes do nome dos arquivos, são as permissões que os mesmos possuem. As permissões são salvas em uma área especial de metadados da partição (isso varia de partição para partição. Lendo meu post sobre ReiserFS você pode ver que no caso desta partição eles ficam salvos nas folhas da árvore, junto com os inodes diretos), sendo uma seqüência de 9 bits, que podem assumir 0 ou 1.

No caso do retornado pelo ls –l, ele ainda nos mostra um primeiro caracter, que pode assumir determinados valores que podem variar de vazio, para arquivos, d, para diretórios, l, para links simbólicos entre outros. Olhando para as permissões em si, tomemos como exemplo as do arquivo planinha

+------+-------+--------+
rw- r-- r—-
+------+-------+--------+
dono grupo outros
+------+-------+--------+


São portanto 3 permissões, para 3 “entidades” distintas: usuário, grupo e outros; cada permissão dessa pode assumir valor sim ou não, ou 0 e 1. Vamos então pegar os valores acima e substituir as letras por números:

+------+-------+--------+
110 100 100
+------+-------+--------+
dono grupo outros
+------+-------+--------+


Convertendo binário para decimal temos:

Permissão para o dono do arquivo: 110 (binário) ou 6 (decimal)
Permissão para o grupo do arquivo: 100 (binário) ou 4 (decimal)
Permissão para outros usuários: 100 (binário) ou 4 (decimal)


Opa! 644 não são os valores que nós definimos para esse arquivo pelo chmod???

É isso mesmo, os números 1, 2 e 4, são na verdade representações decimais para os valores binários das permissões.

Execução => 1 => 001
Escrita => 2 => 010
Leitura => 4 => 100

Adaptando isso para determinadas permissões

Em linguagem humana:
Execução/Leitura/Escrita-Execução/Leitura-Execução

Em decimal:
751

Em binário;
111101001

Fácil não?