Gerenciamento de permissões no Bash

Curso de Bash

Seção do curso de Bash sobre como identificar e modificar as permissões aos arquivos e diretórios.

Acesso aos arquivos e diretórios dependem de permissões concedidas à usuários e grupos.

Conteúdo

  1. O que são permissões?
  2. Mudando permissões com chmod
  3. Permissões para arquivos
  4. Permissões para diretório
  5. Ignorando permissões com super usuário
  6. Exercícios

O que são permissões?

Permissões de arquivos garantem à usuários a capacidade de ler, escrever ou executar arquivos.

Permissões de diretórios concedem acesso para listar e criar/renomear/remover seus conteúdos.

Cada arquivo e diretório no Linux contém três conjuntos de permissões: um para o usuário dono do arquivo, um para usuários do grupo e outro para usuários fora do grupo.

O conjunto é representado pela sequência constante de 3 letras r, w e x que significam permissão de leitura, escrita e execução, respectivamente.

Quando uma das letras na sequência é substituída por - a permissão correspondente é negada.

Analisando as permissões

ls com a opção -l exibe, entre outras infos, as permissões dos arquivos e diretórios.

ls -l arq.txt
-rwxrw-r-- 1 caio caio    0 Oct 29 18:34 arq.txt

A tabela a seguir decompõe cada conjunto de permissões -rwxrw-r--.

-rwxrw-r--
Posição12-45-78-10
ConjuntoTipo do arquivoDonoGrupoOutros usuários
  • -: Tipo do arquivo. Representado por - é um arquivo comum, d um diretório, l um link simbólico, c um dispositivo de caractere e b um dispositivo de bloco.
  • rwx: Dono do arquivo (representado pelo primeiro caio da saída acima) tem permissão para ler, escrever e executar o arquivo.
  • rw-: Usuários do grupo têm permissão para ler, escrever mas não executar o arquivo. O nome do grupo é representado pelo segundo caio.
  • r--: Outros usuários, que são os usuários fora do grupo, podem apenas ler o arquivo.

Mudando permissões com chmod

chmod muda as permissões de arquivos/diretórios.

O primeiro argumento é chamado modo. a+rw é um exemplo de modo válido.

Os primeiros caracteres do modo são chamados de classe e podem ser uma combinação entre u, g, o e a:

  • u muda a permissão para o dono do arquivo;
  • g para o grupo do arquivo;
  • o para outros usuários do arquivo;
  • a para todas as classes anteriores.

O caractere seguinte deve ser +, - ou =:

  • + adiciona as permissões;
  • - remove as permissões;
  • = redefine as permissões. Permissões para determinada classe não informadas são removidas e as informadas são adicionadas.

Os últimos caracteres são r, w e x, as permissões que cobrimos na seção anterior.

Do segundo argumento em diante, são informados os arquivos/diretórios a terem suas permissões modificadas.

Exemplos

Abaixo, todos os usuários (a) têm removidas (-) as permissões r, w e x para o arquivo meu_arquivo.

chmod -v a-rwx meu_arquivo
mode of 'meu_arquivo' changed from 0664 (rw-rw-r--) to 0000 (---------)

Outros usuários (o) e o grupo (g) do arquivo têm adicionada (+) a permissão de leitura (r) no exemplo abaixo.

chmod -v go+r meu_arquivo
mode of 'meu_arquivo' changed from 0000 (---------) to 0044 (---r--r--)

Mais de um modo pode ser definido no primeiro argumento. Os modos são separados por , e nenhum espaço.

Outros usuários do arquivo têm redefinidas (=) as permissões apenas para execução x e o grupo do arquivo apenas para escrita w. Com a redefinição a permissão de leitura para o grupo e outros usuários foi removida.

chmod -v o=x,g=w meu_arquivo
mode of 'meu_arquivo' changed from 0044 (---r--r--) to 0021 (----w---x)

Aqui as permissões para o grupo de arquivo foram redefinidas para nenhuma, ou seja, foram removidas e nenhuma foi adicionada.

chmod -v g= meu_arquivo
mode of 'meu_arquivo' changed from 0021 (----w---x) to 0001 (--------x)

⚠️ Caso a classe não seja informada no modo, a classe será considerada a contudo as permissões para cada classe estarão sujeitas ao comando umask (não abordado neste curso).

O comando abaixo foi executado em sessão que umask resulta em 0002. Note que a permissão w não foi concedida aos outros usuários do arquivo.

chmod -v +w meu_arquivo
mode of 'meu_arquivo' changed from 0001 (--------x) to 0221 (-w--w---x)

Copiando permissões

Ao invés de definirmos as permissões, podemos copia-las utilizando a opção --reference.

Removemos todas as permissões de meu_arquivo abaixo.

chmod -v a= meu_arquivo
mode of 'meu_arquivo' changed from 0221 (-w--w---x) to 0000 (---------)

/etc/hosts tem as permissões que queremos em meu_arquivo.

ls -l /etc/hosts
-rw-r--r-- 1 root root 222 Dec 22  2019 /etc/hosts

Para copia-las, basta utilizarmos a opção --reference seguida de = e o arquivo do qual copiaremos as permissões.

chmod -v --reference=/etc/hosts meu_arquivo
mode of 'meu_arquivo' changed from 0000 (---------) to 0644 (rw-r--r--)

Alterando permissões recursivamente

É possível alterar de uma só vez a permissão de um diretório e todos os seus subarquivos e subdiretórios com a opção -R/--recursive.

O diretório meu_dir é criado e então o arquivo outro_arquivo é criado sob o diretório.

mkdir meu_dir
touch meu_dir/outro_arquivo

Abaixo as permissões do grupo e outros usuários do arquivo são removidas de meu_dir e outro_arquivo em um só comando graças à opção -R.

chmod -vR g=,o= meu_dir
mode of 'meu_dir' changed from 0775 (rwxrwxr-x) to 0700 (rwx------)
mode of 'meu_dir/outro_arquivo' changed from 0664 (rw-rw-r--) to 0600 (rw-------)

Permissões para arquivos

Vamos copiar um arquivo para estudar o que é possível realizar com cada uma das permissões.

cp /etc/hosts .
ls -l hosts
-rw-r--r-- 1 caio caio 222 Nov  1 15:25 hosts

Para o usuário caio, dono do arquivo, temos rw- (caractere 2 ao 4), o que significa permissão de leitura e escrita.

Leitura

O comando head exibe as n primeiras linhas de um ou mais arquivos, então a permissão de leitura é necessária.

head -n 2 hosts
127.0.0.1       localhost
127.0.1.1       FX505DV

Uma vez que removemos a permissão de leitura, head não poderá exibir o conteúdo do arquivo hosts.

chmod u-r hosts
head -n 2 hosts
head: cannot open 'hosts' for reading: Permission denied

Vamos devolver a permissão de leitura para utilizar o arquivo na próxima seção.

chmod u+r hosts

Escrita

Com a permissão de escrita w podemos utilizar ções para escrever em arquivos (redirecionamentos são abordados em Redirecionamentos).

O conteúdo de date é inserido ao fim do arquivo hosts. tail exibe as últimas n linhas do arquivo.

date >> hosts
tail -n 1 hosts
Wed 04 Nov 2020 19:09:09 -03

Sem a permissão de escrita, o redirecionamento não é possível.

chmod u-w hosts
date >> hosts
bash: hosts: Permission denied

Execução

Com a permissão de execução x, arquivos contendo comandos podem ser executados. Tais arquivos, chamados de script, serão cobertos posteriormente.

Baixe o arquivo abaixo ou copie e cole seu conteúdo em um novo arquivo chamado meu_script.sh.

#!/usr/bin/env bash

echo "Olá"

Caso tenha baixado o script, navegue até o diretório utilizando cd.

Tente executá-lo como abaixo.

./meu_script.sh
bash: ./meu_script.sh: Permission denied

Para executar, dê a permissão de execução para o dono do arquivo.

chmod u+x meu_script.sh
./meu_script.sh
Olá

Permissões para diretório

Vamos criar um diretório para analisar como funcionam suas permissões.

A opção -d de ls lista o diretório em si, não seu conteúdo.

mkdir meu_dir
ls -ld meu_dir
drwxrwxr-x 2 caio caio 4096 Nov  4 21:43 meu_dir

Aqui o usuário dono do diretório tem as permissões rwx.

Escrita

Com a permissão de escrita (w), podemos criar subdiretórios e subarquivos.

mkdir -v  meu_dir/sub_dir
mkdir: created directory 'meu_dir/sub_dir'

Sem a permissão teríamos o seguinte erro.

chmod u-w meu_dir
mkdir -v  meu_dir/sub_dir2
mkdir: cannot create directory ‘meu_dir/sub_dir2’: Permission denied

Leitura

Permissão de leitura (r) nos permite listar o conteúdo de um diretório.

ls meu_dir
sub_dir

Sem a permissão teríamos o seguinte erro.

chmod u-r meu_dir
ls meu_dir
ls: cannot open directory 'meu_dir': Permission denied

Contudo o diretório em si ainda pode ser exibido.

ls -ld meu_dir
d--xrwxr-x 3 caio caio 4096 Nov  4 22:11 meu_dir

Execução

A permissão de execução permite que o diretório seja o diretório atual (ou seja, navegável com cd) desde de que todos os seus diretórios pais também tenham a permissão de execução.

cd meu_dir
pwd
/home/caio/meu_dir

Para retirarmos a permissão, devemos ter outro diretório atual. Vamos navegar então para o diretório pai.

cd ..

Sem a permissão teríamos o seguinte erro.

chmod u-x meu_dir
cd meu_dir
bash: cd: meu_dir: Permission denied

Ainda que sub_dir tenha permissão de execução, não será possível defini-lo como diretório atual já que meu_dir não tem a permissão x.

cd meu_dir/sub_dir
bash: cd: meu_dir/sub_dir: Permission denied

Ignorando permissões com super usuário

Super usuário, também chamado de usuário raiz, é o usuário com todas as permissões.

Tipicamente utilizado para executar comandos que exigem privilégios elevados como instalação/remoção de pacotes, gerenciamento de usuários, operações em arquivos do sistema, entre outros.

Para executar um comando utilizando o super usuário, verifique se seu usuário faz parte do grupo sudo.

groups
caio adm cdrom sudo dip plugdev lpadmin lxd sambashare

Caso não faça, veremos em Gerenciamento de usuários como adicionar usuários a grupos.

Basta então executar o comando no arquivo/diretório sem permissão precedido por sudo.

A senha de seu usuário será perguntada antes do comando ser executado. Após preenchê-la, pressione Enter e o comando será executado com as credenciais do super usuário.

sudo ls -l meu_dir/
[sudo] password for caio:
total 4
drwxrwxr-x 2 caio caio 4096 Nov  4 22:11 sub_dir

Exercícios

Selecione as afirmações verdadeiras

Sobre a permissão -rw-rw-r--
Sobre a permissão drwxrwxr-x
Sobre modo u+rwx,o=r
Dado um arquivo com as permissões ----------. A execução de chmod
Dado um diretório com as permissões drwxrwxrwx. A execução de chmod
Dado um diretório com as permissões drwxrwxrwx. A execução de chmod
Escrito por Caio Santesso.

Comentários

  • Conteúdo dos posts, exceto onde indicado contrário, licenciado sob a licença CC BY-SA 4.0 .