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.txt
A 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,d
um diretório,l
um link simbólico,c
um dispositivo de caractere eb
um dispositivo de bloco.rwx
: Dono do arquivo (representado pelo primeirocaio
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 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
:
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