Permissões de arquivos no Linux: chmod, chown e sudo com exemplos
As permissões de arquivos no Linux são definidas por três conjuntos rwx, para o dono, para o grupo e para os demais, e são alteradas com chmod, em forma simbólica (chmod u+x) ou numérica (chmod 755, onde r=4, w=2 e x=1). O chown muda o dono, e as ações de administrador são feitas com sudo. O erro Permission denied quase sempre indica que seu usuário não tem a permissão necessária no arquivo ou em um dos diretórios do caminho.
As permissões de arquivos no Linux respondem à pergunta «quem pode fazer o quê com este arquivo». Todo arquivo tem um dono, um grupo e três conjuntos de permissões: para o dono, para o grupo e para todos os outros. As permissões são alteradas com chmod, o dono com chown, e as ações de administrador são executadas com sudo. Veja a seguir como ler as permissões, como alterá-las e como resolver o erro Permission denied.
Como ver as permissões de um arquivo
As permissões aparecem na saída de ls -l:
$ ls -l
-rw-r--r-- 1 alice developers 1204 Oct 10 14:02 notes.txt
-rwxr-xr-x 1 alice developers 356 Oct 10 14:05 deploy.sh
drwxr-x--- 2 alice developers 4096 Oct 10 13:50 secrets
Os dez primeiros caracteres se leem assim:
- O primeiro caractere é o tipo:
-arquivo comum,ddiretório,llink simbólico. - Os caracteres 2 a 4 são as permissões do dono (user).
- Os caracteres 5 a 7 são as permissões do grupo (group).
- Os caracteres 8 a 10 são as permissões dos demais (others).
Depois vêm o número de links, o dono (alice), o grupo (developers), o tamanho, a data e o nome. Para um único arquivo, o comando stat é prático:
$ stat -c '%A %a %U:%G %n' deploy.sh
-rwxr-xr-x 755 alice:developers deploy.sh
O que significam r, w e x
O significado das permissões é diferente para arquivos e para diretórios, e essa é a principal causa de confusão.
| Permissão | Para arquivo | Para diretório |
|---|---|---|
r (read) | ler o conteúdo | ver a lista de arquivos (ls) |
w (write) | alterar o conteúdo | criar, apagar e renomear arquivos dentro dele |
x (execute) | executar como programa | entrar no diretório (cd) e acessar arquivos pelo caminho |
Observe que quem tem w e x em um diretório pode apagar um arquivo dentro dele, mesmo sem permissão de escrita no próprio arquivo. E sem x no diretório não é possível abrir os arquivos dentro dele, ainda que as permissões do arquivo permitam a leitura.
O sistema verifica as permissões nesta ordem: se você é o dono, aplicam-se as permissões do dono; senão, se você pertence ao grupo do arquivo, aplicam-se as permissões do grupo; senão, aplicam-se as permissões dos demais. O usuário root ignora as verificações de leitura e escrita.
Notação numérica: 755, 644, 600
Cada permissão tem um peso: r = 4, w = 2, x = 1. A soma dos pesos de cada um dos três conjuntos resulta em um dígito de 0 a 7.
| Dígito | Permissões | Cálculo |
|---|---|---|
| 7 | rwx | 4+2+1 |
| 6 | rw- | 4+2 |
| 5 | r-x | 4+1 |
| 4 | r-- | 4 |
| 0 | --- | 0 |
Vale memorizar estes conjuntos típicos:
| Modo | Forma | Onde é usado |
|---|---|---|
644 | rw-r--r-- | arquivos comuns, arquivos de configuração, HTML |
755 | rwxr-xr-x | diretórios, scripts e programas |
600 | rw------- | chaves SSH privadas, arquivos com senhas |
700 | rwx------ | diretório ~/.ssh, diretórios pessoais |
640 | rw-r----- | configurações que o grupo do serviço precisa ler |
777 | rwxrwxrwx | todos podem tudo: quase nunca é necessário |
O comando chmod: como alterar permissões
Modo numérico
A forma numérica define todas as permissões de uma vez:
chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519
Modo simbólico
A forma simbólica altera permissões específicas sem mexer nas demais. Quem: u dono, g grupo, o demais, a todos. Ação: + adiciona, - remove, = define exatamente.
chmod +x deploy.sh # permitir a execução
chmod u+x,g-w file # o dono executa; o grupo perde a escrita
chmod o-rwx secrets/ # nenhuma permissão para os demais
chmod g=rx app/ # o grupo apenas lê e entra no diretório
Recursivo: arquivos e diretórios de forma diferente
A opção -R aplica as permissões a toda a árvore de diretórios. Mas chmod -R 755 tornaria executáveis todos os arquivos, o que normalmente não é desejado. O melhor é separar arquivos e diretórios com find:
find /srv/site -type d -exec chmod 755 {} +
find /srv/site -type f -exec chmod 644 {} +
Existe também uma forma curta: a letra maiúscula X acrescenta execução apenas aos diretórios e aos arquivos que já são executáveis.
chmod -R u=rwX,go=rX /srv/site
O comando chown: alterar dono e grupo
Só o root pode trocar o dono de um arquivo, por isso o chown quase sempre é executado com sudo.
sudo chown alice report.txt # dono
sudo chown alice:developers report.txt # dono e grupo
sudo chown :www-data index.html # apenas o grupo
sudo chown -R www-data:www-data /var/www/site
Para alterar só o grupo existe o comando chgrp: sudo chgrp developers report.txt. Os seus grupos são mostrados por id ou groups.
$ id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)
Para adicionar um usuário a um grupo use sudo usermod -aG developers bob. A opção -a é obrigatória: sem ela, o usuário sai de todos os outros grupos secundários. O novo grupo passa a valer depois de um novo login.
sudo: executar ações como administrador
O sudo executa um único comando com privilégios de root (ou de outro usuário) e pede a sua senha, não a do root. Todas as chamadas são registradas em log, então se sabe quem fez o quê.
sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql # como o usuário postgres
sudo -i # shell interativo de root
sudo -l # o que eu tenho permissão de executar
Quem pode fazer o quê é definido em /etc/sudoers e nos arquivos do diretório /etc/sudoers.d/. Edite esses arquivos somente com sudo visudo: ele verifica a sintaxe, e um erro no arquivo não faz você perder o acesso ao sudo. No Ubuntu, o direito de usar sudo é dado pela participação no grupo sudo; nos sistemas da família RHEL, pelo grupo wheel.
# /etc/sudoers.d/deploy — o usuário deploy pode apenas reiniciar o nginx
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
Por que sudo echo > arquivo não funciona
Esta é uma armadilha comum:
$ sudo echo "127.0.0.1 test.local" >> /etc/hosts
bash: /etc/hosts: Permission denied
O redirecionamento >> é feito pelo seu shell, e não pelo sudo, então o arquivo é aberto sem privilégios de root. O certo é usar tee:
echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts
Permission denied: causas e como corrigir
O erro Permission denied significa que o kernel recusou a operação ao seu processo. O diagnóstico segue sempre o mesmo roteiro: quem sou eu (id), quem é o dono e quais são as permissões (ls -l), quais são as permissões de cada diretório do caminho (namei -l).
$ namei -l /srv/app/config/app.env
f: /srv/app/config/app.env
drwxr-xr-x root root /
drwxr-xr-x root root srv
drwxr-x--- deploy deploy app
drwxr-xr-x deploy deploy config
-rw-r----- deploy deploy app.env
Aqui se vê que o diretório app está fechado para os demais: um usuário que não pertence ao grupo deploy não consegue passar por ele, independentemente das permissões do próprio arquivo.
O script não executa
$ ./deploy.sh
bash: ./deploy.sh: Permission denied
O arquivo não tem permissão de execução. A solução é chmod +x deploy.sh, ou executar pelo interpretador: bash deploy.sh. Se a partição estiver montada com a opção noexec (o que é comum em /tmp), não será possível executar o arquivo diretamente, e só a segunda opção funciona.
Não é possível gravar em um diretório do sistema
Os arquivos em /etc, /usr e /var/www pertencem ao root ou a usuários do sistema. Use sudo para alterações pontuais; para o trabalho contínuo, dê a permissão a um grupo, e não a todos.
O servidor web responde 403
O Nginx ou o Apache rodam com o usuário www-data (no Debian e no Ubuntu). Esse usuário precisa de leitura nos arquivos e de x em todos os diretórios do caminho. A correção: sudo chown -R www-data:www-data /var/www/site, ou permissões 755 para os diretórios e 644 para os arquivos.
O SSH não aceita a chave
O SSH recusa chaves com permissões excessivamente abertas. A chave privada deve ser 600, o diretório ~/.ssh deve ser 700, e o arquivo authorized_keys no servidor deve ser 600.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys
Sem acesso ao Docker
A mensagem permission denied while trying to connect to the Docker daemon socket indica que você não está no grupo docker. Execute sudo usermod -aG docker $USER e entre no sistema novamente. Lembre que ser membro desse grupo equivale, na prática, a ter privilégios de root.
Por que chmod 777 é uma má ideia
O conselho «basta fazer chmod 777» elimina o erro, mas deixa o arquivo gravável por qualquer usuário e qualquer processo do sistema. Se uma aplicação web for invadida, o atacante poderá alterar esses arquivos. O caminho correto é descobrir qual usuário precisa de acesso e liberar a permissão exatamente para ele, pelo dono ou pelo grupo.
umask: permissões padrão
Os arquivos novos recebem permissões de acordo com a máscara umask. Com o valor comum 022, os arquivos são criados com 644 e os diretórios com 755.
$ umask
0022
Conclusão
As permissões no Linux são três conjuntos rwx para o dono, o grupo e os demais. O chmod altera as permissões no modo numérico (755, 644, 600) ou simbólico, o chown altera o dono, e o sudo permite executar um comando isolado como root. Diante de um Permission denied, verifique o usuário, as permissões do arquivo e as de cada diretório do caminho, e não resolva com 777. Usuários, grupos, permissões e sudo são explicados em detalhes e com prática no curso de Linux.
Perguntas frequentes
O que significa chmod 755?
O dono pode ler, escrever e executar (7), e o grupo e os demais podem ler e executar (5). É o padrão para diretórios e scripts.
Qual a diferença entre chmod e chown?
O chmod altera as permissões (o que pode ser feito com o arquivo), enquanto o chown altera o dono e o grupo (de quem são essas permissões).
Como dar ao usuário permissão de sudo?
No Ubuntu e no Debian, adicione-o ao grupo sudo com sudo usermod -aG sudo nome_do_usuario; nos sistemas da família RHEL, ao grupo wheel. As mudanças valem após um novo login.
O que são as permissões 4755 e o bit SUID?
O dígito inicial 4 ativa o SUID: o programa roda com os privilégios do dono do arquivo, e não de quem o executou. É assim que funciona, por exemplo, o passwd; na saída do ls, o x do dono aparece como s.
Por que o root consegue ler um arquivo com permissão 000?
Porque o kernel não verifica as permissões comuns de leitura e escrita para o root. Para restringi-lo, são necessários outros mecanismos, como SELinux, AppArmor ou o atributo imutável chattr +i.
Este tema é abordado em profundidade, com prática, no curso “Linux: с нуля до уверенного администрирования”.
Ir para o curso