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
UNIX é uma marca registada de The Open Group. Linux é uma marca registada de Linus Torvalds.
O chmod
é um comando do Unix que lhe permite indicar ao sistema que operações são permitidas sobre determinado ficheiro.
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.
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”.
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
.
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.
archive.sh
(embora o possam ler para aprenderem como fazer um bom script de consola).topsecret.inf
, portanto ele está inacessível para todos excepto o utilizador joe
.sales
a utilizadores fora do grupo.publicity.html
contém comunicados de imprensa, e deve poder ser aberto por qualquer um na empresa, para modificação.
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.
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 ) |
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. |
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
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
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
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. |
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."…
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.
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 |
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.
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:
1 - rwx r-x r-- info.sh
1 - rwx r-x r-- info.sh 111 101 100
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.
chmod
para definir as permissões desejadas para o ficheiro:chmod 754 info.sh
Baseado no original em inglês: http://catcode.com/teachmod/index.html