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
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.txtA tabela a seguir decompõe cada conjunto de permissões -rwxrw-r--.
- | rwx | rw- | r-- | |
|---|---|---|---|---|
| Posição | 1 | 2-4 | 5-7 | 8-10 |
| Conjunto | Tipo do arquivo | Dono | Grupo | Outros usuários |
-: Tipo do arquivo. Representado por-é um arquivo comum,dum diretório,lum link simbólico,cum dispositivo de caractere ebum dispositivo de bloco.rwx: Dono do arquivo (representado pelo primeirocaioda 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 segundocaio.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:
umuda a permissão para o dono do arquivo;gpara o grupo do arquivo;opara outros usuários do arquivo;apara 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_arquivomode 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_arquivomode 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_arquivomode 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_arquivomode 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_arquivomode 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_arquivomode 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/hostsPara 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_arquivomode 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_dirmode 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 hostsPara 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 hosts127.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 deniedVamos devolver a permissão de leitura para utilizar o arquivo na próxima seção.
chmod u+r hostsEscrita
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 -03Sem a permissão de escrita, o redirecionamento não é possível.
chmod u-w hosts
date >> hosts
bash: hosts: Permission deniedExecuçã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.shbash: ./meu_script.sh: Permission deniedPara 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_dirAqui 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_dirmkdir: 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 deniedLeitura
Permissão de leitura (r) nos permite listar o conteúdo de um diretório.
ls meu_dirsub_dirSem a permissão teríamos o seguinte erro.
chmod u-r meu_dir
ls meu_dir
ls: cannot open directory 'meu_dir': Permission deniedContudo o diretório em si ainda pode ser exibido.
ls -ld meu_dird--xrwxr-x 3 caio caio 4096 Nov 4 22:11 meu_dirExecuçã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_dirPara 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_dirbash: cd: meu_dir: Permission deniedAinda 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_dirbash: cd: meu_dir/sub_dir: Permission deniedIgnorando 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.
groupscaio adm cdrom sudo dip plugdev lpadmin lxd sambashareCaso 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