Ir para o conteúdo

Tutorial do chmod

Este é um tutorial que ensina o comando chmod do UNIX ®/Linux ®. Presume-se que já saiba usar o comando ls para listar o conteúdo de um directório.

Este tutorial está coberto por uma licença de Atribuição-Uso Não-Comercial-Partilha nos termos da mesma Licença 2.5 Baseado no original em inglês: http://catcode.com/teachmod/index.html

UNIX é uma marca registada de The Open Group. Linux é uma marca registada de Linus Torvalds.

O que é o chmod?

O chmod é um comando do Unix que lhe permite indicar ao sistema que operações são permitidas sobre determinado ficheiro.

Alterar permissões de ficheiros

Vamos olhar em pormenor para os conteúdos de um directório utilizando o comando ls -l (o “l” significa "longo" (long)).

 total 42

 1  -rwxr-xr-x   1   joe   acctg   23068   Feb 26  2004   archive.sh
 2  -rw-rw-r--   1   joe   acctg   12878   Jul 24 21:58   orgchart.gif
 3  -rw-rw-r--   1   joe   acctg    2645   Jun 30 08:48   personnel.txt
 4  -rw-r--r--   1   joe   acctg     168   Jul 17 11:51   publicity.html
 5  drwxrwxr-x   2   joe   acctg    1024   Mar 18 16:27   sales
 6  -rw-r-----   1   joe   acctg     512   Sep  1 07:00   topsecret.inf
 7  -rwxr-xr-x   1   joe   acctg    2645   Aug  4 11:03   wordmatic

A linha total indica quantos blocos (normalmente 1024 bytes por bloco) estão contidos neste directório.

Na primeira coluna, o primeiro carácter indica o tipo de ficheiro. O hífen representa um ficheiro normal; o d representa um directório. Os restantes caracteres descrevem as permissões do ficheiro que irão ser referidas em detalhe nas próximas páginas.

A segunda coluna indica o número de hard links existentes para este ficheiro.

A terceira e quarta indicam o dono do ficheiro e o grupo a que pertence, respectivamente.

A quinta mostra tamanho do ficheiro, em bytes. Para directórios, é indicado o tamanho do directório, não o total do seu conteúdo!

A sexta coluna contém a data e hora da última modificação do ficheiro. Note que obtém a hora do dia caso a modificação tenha ocorrido no ano actual; caso contrário, apenas verá o ano.

Por fim, na última coluna é apresentado o nome do ficheiro.

As suas permissões

Vamos olhar em pormenor para a primeira coluna. Como dissemos na página anterior, as primeiras letras indicam se está a lidar com um ficheiro normal ou com um directório. As letras seguintes indicam ao sistema que acesso é permitido para o ficheiro; surge o nome “permissões.”

Na lista em baixo, eliminamos algumas colunas e adicionamos espaços à coluna de permissões para facilitar a leitura.

 1  - rwx r-xr-x  joe  acctg  archive.sh 
 2  - rw- rw-r--  joe  acctg  orgchart.gif
 3  - rw- rw-r--  joe  acctg  personnel.txt
 4  - rw- r--r--  joe  acctg  publicity.html
 5  d rwx r-xr-x  joe  acctg  sales
 6  - rw- r-----  joe  acctg  topsecret.inf
 7  - rwx r-xr-x  joe  acctg  wordmatic

O primeiro conjunto de três letras depois do tipo de ficheiro indica a si, dono do ficheiro, quais as suas permissões sobre ele.

Um r na primeira posição significa que tem permissão para ler (read) o ficheiro. Um w na segunda posição significa que pode escrever (write) no ficheiro. Isto inclui poder eliminar ficheiros. Um x na terceira posição significa que pode executar (execute) o ficheiro.

Um hífen em qualquer posição significa que não tem a permissão em particular dessa posição.

Como pode ver em cima, joe, o dono do ficheiro, pode ler e escrever todos os ficheiros. Ele pode executar o script de consola archive.sh e o programa wordmatic.

Mas o que faz o x no directório sales? Quando um directório tem um x nas permissões, tem um significado especial de ser ”permitida a procura nesse directório”.

Permissões de grupo

As 3 letras seguintes às suas permissões, são as permissões de grupo.

 1  -rwx r-x r-x  joe  acctg  archive.sh 
 2  -rw- rw- r--  joe  acctg  orgchart.gif
 3  -rw- rw- r--  joe  acctg  personnel.txt
 4  -rw- r-- r--  joe  acctg  publicity.html
 5  drwx r-x r-x  joe  acctg  sales
 6  -rw- r-- ---  joe  acctg  topsecret.inf
 7  -rwx r-x r-x  joe  acctg  wordmatic

Os utilizadores do grupo acctg não podem escrever no script archive.sh, publicity.html, topsecret.inf, nem no programa wordmatic.

Eles podem escrever nos ficheiros orgchart.gif e personnel.txt.

Eles podem ainda executar o archive.sh e o wordmatic, e procurar no directório sales.

Permissões de outros

As últimas três letras na coluna de permissões indicam o que o resto do mundo, os "outros" podem fazer.

1  -rwxr-x r-x  joe  acctg  archive.sh 
2  -rw-rw- r--  joe  acctg  orgchart.gif
3  -rw-rw- r--  joe  acctg  personnel.txt
4  -rw-r-- r--  joe  acctg  publicity.html
5  drwxrwx r-x  joe  acctg  sales
6  -rw-r-- ---  joe  acctg  topsecret.inf
7  -rwxr-x r-x  joe  acctg  wordmatic

Os "outros" têm uma vida muito restrita. Eles não podem escrever sobre nenhum ficheiro ou directório, e não têm qualquer tipo de acesso ao ficheiro topsecret.inf.

Eles podem correr o script archive.sh e o programa wordmatic, e procurar no directório sales.

Porém, as coisas não devem ser como nós queremos.

  • Não queremos que ninguém fora do nosso grupo de utilizadores execute o archive.sh (embora o possam ler para aprenderem como fazer um bom script de consola).
  • Queremos restringir o topsecret.inf, portanto ele está inacessível para todos excepto o utilizador joe.
  • Também queremos negar o acesso ao directório sales a utilizadores fora do grupo.
  • Finalmente, o ficheiro publicity.html contém comunicados de imprensa, e deve poder ser aberto por qualquer um na empresa, para modificação.

O comando chmod

Usamos o comando chmod para mudar (change) o modo de acesso (access mode) a um ficheiro. Este comando pode ser descrito de vários modos, mas iremos usar principalmente um deles:

 chmod utilizador=permissões nome_ficheiro

Isto dá ao "utilizador" as permissões fornecidas para um dado ficheiro.

Utilizador

O "utilizador" é uma lista de letras que especifica a quem irá dar as permissões. Estas podem ser especificadas em qualquer ordem.

Letra Significado
u O utilizador que é dono do ficheiro (isto significa “você.”)
g O grupo ao qual o ficheiro pertence.
o Os outros utilizadores
a Todos os anteriores (uma abreviatura para ugo)

Permissões

Como é óbvio, as permissões são as mesmas letras que vê na listagem de directórios:

Letra Significado
r Permissão para ler (read) o ficheiro.
w Permissão para escrever (write) (ou eliminar) o ficheiro.
x Permissão para executar (execute) o ficheiro, ou no caso de um directório, permitir procurar dentro do mesmo.

Importante: Não coloque espaços em branco em torno do sinal de igual, caso contrário, o comando não funcionará!

Exemplos do chmod

Vamos alterar algumas permissões como vimos à uns capitulos atrás. De momento, os nossos ficheiros estão assim:

 1   -rwxr-xr-x  joe  acctg  archive.sh 
 2   -rw-rw-r--  joe  acctg  orgchart.gif
 3   -rw-rw-r--  joe  acctg  personnel.txt
 4   -rw-r--r--  joe  acctg  publicity.html
 5   drwxrwxr-x  joe  acctg  sales
 6   -rw-r-----  joe  acctg  topsecret.inf
 7   -rwxr-xr-x  joe  acctg  wordmatic

Primeiro, vamos começar por não permitir que os outros executem o script archive.sh:

 Antes:     -rwxr-xr-x  archive.sh
 Comando:   chmod o=r archive.sh
 Depois:    -rwxr-xr--  archive.sh

Remover todas as permissões do topsecret.inf. Isto faz-se deixando a parte das permissões, no nosso comando, vazia:

 Antes:     -rw-r-----  topsecret.inf
 Comando:   chmod g= topsecret.inf
 Depois:    -rw-------  topsecret.inf

Abrir o ficheiro publicity.html para escrita e leitura, para qualquer utilizador:

 Antes:     -rw-r--r--  publicity.html
 Comando:   chmod og=rw publicity.html
 Depois:    -rw-rw-rw-  publicity.html

Atalhos do chmod

Vamos supor que temos os seguintes ficheiros:

 1  -rwxrwxrwx  joe  acctg  wordmatic
 2  -r--r--r--  joe  acctg  calcmatic

Gostariamos de remover a permissão de escrita para o grupo e outros no ficheiro wordmatic, e adicionar permissão de execução para todos (all) os utilizadores no ficheiro calcmatic.

Em vez de tentar descobrir o que fazem as novas permissões e fazer os comandos:

 chmod go=rx wordmatic
 chmod a=rwx calcmatic

O chmod permite-nos, literalmente, adicionar e subtrair permissões de um conjunto existente usando o sinal + e -, em vez do =

Desta forma, podemos remover as permissões de escrita do primeiro ficheiro ao grupo e outros com o comando:

 chmod go-w wordmatic

...e podemos adicionar as permissões de escrita e execução do segundo ficheiro para todos (all) os utilizadores com o comando:

 chmod a+wx calcmatic

Copiar permissões

Tal como se fosse um atalho, é possível indicar ao chmod para "dar a uma classe as mesmas permissões de outra."

Vamos supor que temos os seguintes ficheiros:

 1  d------rwx  joe  acctg  sales
 2  -rw-r--r--  joe  acctg  info.dat

Os outros utilizadores têm permissão total sobre o directório sales. Gostariamos que "o utilizador e o grupo tivessem as mesmas (=) permissões que os outros." Isto traduz-se em:

 chmod ug=o

De igual modo, para tornar o ficheiro info.dat para leitura e escrita para o grupo:

 chmod g=u info.dat

(pode ler isto como "o grupo tem as mesmas (=) permissões que o utilizador que é dono do ficheiro.")

Pode ainda usar o + e o - para adicionar e subtrair permissões que pertençam de momento a outra classe de utilizadores diferente.

Não pode misturar as permissões por omissão (r, w e x) com os atalhos de cópia de permissões. O chmod irá "protestar" se lhe der algo do género:

 chmod g=wu info.dat

O chmod resolve problemas

Podemos fazer bastantes coisas para proteger os nossos ficheiros com o que já sabemos de momento. Antes de avançarmos para outro aspecto bastante importante do chmod, vamos ver um problema que, com os conhecimentos correntes, já conseguimos resolver.

Aqui está uma lista dos conteúdos do directório /home/steve, que pertence ao utilizador steve, no grupo sales.

 1  -rw-------  steve  sales  customers.dat
 2  -rwx------  steve  sales  summarize

O ficheiro customers.dat contém nomes, endereços, números de telefone, idades, e salários de clientes. O programa summarize lê esse ficheiro e imprime um relatório de clientes, agrupado por idade e salário. O Steve não pretende que qualquer um leia estes dados confidenciais, por isso ele usa o que já sabe de chmod para definir as permissões, logo ele será a única pessoa que poderá ler o ficheiro de dados confidenciais dos clientes ou executar o programa. Vamos ver exactamente o que acontece quando o Steve corre o programa.

Evento Linux devolve
O Steve escreve summarize É o utilizador steve.
Pretende executar o ficheiro /home/steve/summarize.
Permissão concedida.
O programa começa. ---
O programa pede para ler o ficheiro /home/steve/customers.dat É o utilizador steve.
Pretende ler o ficheiro /home/steve/customers.dat.
Permissão concedida.

Um novo problema

A Michele, do departamento de Markting, pretende também usar o programa de relatórios para encontrar quem está a comprar determinado produto. O Steve faz isto:

 chmod og+rx summarize

Agora, as permissões serão algo do género:

 1  -rw-------  steve  sales  customers.dat
 2  -rwxr-xr-x  steve  sales  summarize

Agora, qualquer um poderá executar o programa de relatórios, mas o ficheiro de clientes ainda está protegido, pensa o Steve. Bem, infelizmente, está. Vejamos o que acontece quando a Michele tenta correr o programa.

Evento Linux devolve
A Michele escreve /home/steve/summarize. É a utilizadora michele, do grupo mktg.
É "outro" utilizador.
Pretende executar o ficheiro /home/steve/summarize.
Permissão concedida.
O programa começa. ---
O programa pede para ler o ficheiro /home/steve/customers.dat É a utilizadora michele do grupo mktg.
É ""outro" utilizador. Pretende ler o ficheiro /home/steve/customers.dat.
Permissão negada.

O Steve tem um problema. Se ele fizer:

 chmod og+r customers.dat

então o ficheiro de clientes pode ser aberto por qualquer um, a qualquer hora. Só se o Steve pudesse "dar à Michele as mesmas permissões que ele tem, mas apenas quando está a corrrer o programa."...

Definir o ID de utilizador

Como é óbvio, há uma forma que permite ao Steve dar à Michele as mesmas permissões que ele tem enquanto ela corre o programa summarize. O Steve escreve:

 chmod u+s summarize

Isto significa "adiciona ao programa summarize a capacidade de definir do ID de utilizador, para outro utilizador poder ter as mesmas permissões do dono do ficheiro". Agora, as permissões serão algo como:

 1  -rw-------  steve  sales  customers.dat
 2  -rwsr-xr-x  steve  sales  summarize

Agora vamos ver o que acontece quando a Michele corre o programa:

Evento Linux devolve
A Michele escreve /home/steve/summarize É a utilizadora michele do gupo mktg. É "outro" utilizador. Pretende executar o ficheiro /home/steve/summarize. Permissão concedida.
O programa começa. A definição do ID de utilizador é activada. Alakabaud! ® Eu mudei o seu ID de utilizador. Agora é o utilizador steve enquanto o programa estiver em execução.
O programa pede para ler o ficheiro /home/steve/customers.dat É o utilizador steve. Pretende ler o ficheiro /home/steve/customers.dat. Permissão concedida.

O problema está agora resolvido! O Steve pode deixar a Michele correr o programa. O programa muda temporariamente o ID de utilizador da Michele para o do Steve, de forma a tornar o ficheiro de clientes acessível para leitura para ela. Se a Michele tentar aceder ao ficheiro de clientes com outro programa, as permissões continuaram a negar-lhe o acesso.

Pode ainda usar um comando como este para dar as permissões de grupo a qualquer um que corra o programa:

 chmod g+s summarize

Nota: Alakabaud! é uma marca registada de Vadic, a Modem Magician.

Formulário de referência rápida do chmod

A forma geral de escrever o comando chmod é:

 chmod options file

As opções são construídas escolhendo uma opção de cada coluna abaixo, sem deixar espaços entre elas:

Utilizador Operação Permissão
Uma combinação de:
u utilizador (dono do ficheiro)
g grupo
o outros
a todos (mesmo que ugo)
As permissões são:
= atribuir
+ adicionar
- subtrair
A combinação de:
r ler
w escreve
x executar
ou uma das seguintes opções para copiar permissões:
u utilizador
g grupo
o outro
ou, definir o ID de utilizador:
s

Nota: Definir o ID de utilizador normalmente é apenas usado em programas. Poderá definir a permissão s para um utilizador ou para o grupo; as pessoas que correrem o programa irão "adoptar" a identidade desse utilizador ou grupo enquanto o programa estiver a correr.

Chmod com Números

Até este ponto, definimos o modo de acesso aos ficheiros com letras. Daí conclui-se que seja possível definir o modo de acesso com número. Aqui está como funciona:

  • Escreva as permissões que pretende que o ficheiro tenha. Para tornar a vida mais fácil, escreva as permissões agrupadas em conjuntos de três letras. Por exemplo, vamos assumir que pretende que o ficheiro info.sh tenha as seguintes permissões:
 1  - rwx r-x r-- info.sh
  • Por baixo de cada letra, escreva o número 1; por baixo de cada hífen escreva o número zero. Ignore o hífen inicial que indica se é um ficheiro ou um directório. Isto devolve-lhe três números binários.
 1  - rwx r-x r-- info.sh
      111 101 100
  • Agora converta cada conjunto de três números para um único número, usando a seguinte tabela:
Binary Decimal
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7

Por exemplo, para o número 111 101 100 traduz-se no 754.

  • Por fim, basta usar esse número no comando chmod para definir as permissões desejadas para o ficheiro:
 chmod 754 info.sh