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 utilizadorjoe
. - 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 grupoo outrosa todos (mesmo que ugo ) |
As permissões são:= atribuir+ adicionar- subtrair |
A combinação de:r lerw escrevex executarou uma das seguintes opções para copiar permissões: u utilizadorg grupoo outroou, 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