Em uma frase
chmod é o comando Unix que define quem pode ler, escrever ou executar um arquivo, funcionando como o sistema de controle de acesso fundamental para a maioria dos servidores e máquinas de desenvolvimento do mundo.
O problema que ele resolve
Imagine os primórdios da computação: uma pessoa, uma máquina, uma tarefa por vez. Em um sistema como esse, permissões de arquivo são uma solução em busca de um problema. Se você é a única pessoa que usará o computador, de quem você está protegendo os arquivos? De si mesmo?
Então veio o Unix no final dos anos 1960, nos Bell Labs. Sua ideia revolucionária era ser um sistema operacional multiusuário e multitarefa desde o início. De repente, você tinha vários programadores logados no mesmo computador mainframe por meio de terminais diferentes, todos trabalhando ao mesmo tempo. Isso criou um problema novo e urgente: como impedir que Dennis apague acidentalmente (ou "acidentalmente") o novo compilador C de Ken? Como deixar seu parceiro de projeto ler seu código, mas impedi-lo de alterá-lo? Como proteger os arquivos principais do sistema operacional de um estagiário desastrado?
A solução foi um sistema lindamente simples e robusto de propriedade e permissões embutido no próprio sistema de arquivos. Todo arquivo e diretório teria um proprietário, pertenceria a um grupo e teria um conjunto específico de permissões para três classes de usuários: o proprietário, os membros do grupo e todo o resto.
O comando para "mudar o modo" de um arquivo — ou seja, para modificar essas permissões — foi nomeado chmod. Ele se tornou a ferramenta universal para administradores de sistemas e usuários declararem: "Este arquivo é meu, e estas são as regras para interagir com ele." Ele resolveu o problema do caos multiusuário de forma tão eficaz que o mesmo modelo principal ainda é usado hoje em praticamente todos os servidores Linux, máquinas macOS, telefones Android e dispositivos IoT do planeta.
Como funciona por debaixo dos panos
Em sua essência, o sistema chmod é uma grade de regras 3x3, com algumas flags especiais para dar um toque a mais. Para entendê-lo, você precisa compreender os três tipos de permissões e as três classes de usuários às quais elas podem se aplicar.
As Três Permissões: Read, Write, Execute
Tudo gira em torno de três ações básicas que você pode realizar em um arquivo ou diretório. Elas são representadas pelas letras r, w e x.
- Read (
r): A capacidade de abrir e visualizar o conteúdo de um arquivo. - Write (
w): A capacidade de modificar, alterar ou apagar o conteúdo de um arquivo. - Execute (
x): A capacidade de rodar o arquivo como um programa ou script.
Mas aqui está a primeira "pegadinha": essas permissões significam coisas ligeiramente diferentes para um diretório. Este é um ponto de confusão super comum.
| Permissão | Em um Arquivo | Em um Diretório |
|---|---|---|
Read (r) |
Pode ver o conteúdo do arquivo | Pode listar os nomes dos arquivos no diretório (ls) |
Write (w) |
Pode alterar o conteúdo do arquivo | Pode criar, renomear ou apagar arquivos dentro do diretório |
Execute (x) |
Pode rodar o arquivo | Pode entrar no diretório (cd) e acessar os arquivos dentro dele |
Pense nessa última. Se um diretório não tem permissão de execução para você, você não pode usar cd para entrar nele, mesmo que consiga ver seu conteúdo! Você precisa de x para passar pela "porta" do diretório.
As Três Classes de Usuários: Owner, Group, Others
As permissões Unix não são universais; elas são atribuídas a categorias específicas de usuários.
- Owner (
u): Um único usuário que é dono do arquivo. Normalmente, é a pessoa que o criou. O proprietário tem o maior controle. - Group (
g): Todo arquivo pertence a um grupo. Isso permite que o proprietário compartilhe o acesso com membros específicos da equipe. Por exemplo, todos os arquivos do "Projeto Apollo" poderiam pertencer ao grupoapollo-devs. - Others (
o): Literalmente todo o resto. Qualquer usuário no sistema que não seja o proprietário e não pertença ao grupo do arquivo.
Quando você vê uma string de permissão como rwxr-xr--, na verdade são três conjuntos de permissões rwx combinados para Owner, Group e Others, nessa ordem.
rwx: O Owner (proprietário) pode ler, escrever e executar.r-x: O Group (grupo) pode ler e executar, mas não escrever.r--: Others (outros) podem apenas ler.
As Duas Notações: Simbólica vs. Octal
Existem duas maneiras de dizer ao chmod o que você quer, e os desenvolvedores estão sempre traduzindo entre elas.
1. Notação Simbólica (o jeito "amigável")
A notação simbólica usa as letras que já aprendemos (r, w, x e u, g, o, a onde a significa "todos"). Você usa + para adicionar uma permissão, - para remover e = para definir exatamente.
# Dar permissão de execução para o proprietário
$ chmod u+x meu_script.sh
# Remover permissão de escrita para o grupo e outros
$ chmod go-w dados_sensiveis.txt
# Definir permissões exatas: proprietário pode ler/escrever, grupo pode ler, outros não têm acesso
$ chmod u=rw,g=r,o= config.yml
Isso é ótimo para fazer pequenas alterações direcionadas.
2. Notação Octal (o jeito "nerd")
A notação octal é mais rápida, mais comum em scripts e baseada em binário. Cada permissão (r, w, x) é um bit em um número de 3 bits.
r(read) é o primeiro bit, com valor 4.w(write) é o segundo bit, com valor 2.x(execute) é o terceiro bit, com valor 1.
Você soma os números para obter as permissões que deseja.
| Número | Binário (rwx) |
Permissões Concedidas |
|---|---|---|
| 0 | 000 (---) |
Nenhuma |
| 1 | 001 (--x) |
Executar |
| 2 | 010 (-w-) |
Escrever |
| 3 | 011 (-wx) |
Escrever e executar |
| 4 | 100 (r--) |
Ler |
| 5 | 101 (r-x) |
Ler e executar |
| 6 | 110 (rw-) |
Ler e escrever |
| 7 | 111 (rwx) |
Ler, escrever, executar |
Um código octal de três dígitos como 755 representa as permissões para Owner, Group e Others.
chmod 755 meu_script.sh significa:
- Owner:
7(rwx) - Ler, escrever e executar. - Group:
5(r-x) - Ler e executar. - Others:
5(r-x) - Ler e executar.
Esta é uma permissão muito comum para scripts executáveis que são seguros para outros rodarem. Uma permissão comum para um arquivo é 644 (proprietário pode ler/escrever, todos os outros podem apenas ler).
Os Convidados Especiais: SUID, SGID e o Sticky Bit
Além do rwx básico, existem três modos especiais, representados por um quarto dígito octal no início (ex: chmod 4755).
- SUID (Set User ID) - Octal
4: Quando um arquivo executável com este bit é rodado, ele executa com as permissões do proprietário do arquivo, não do usuário que o rodou. O exemplo clássico é o comandopasswd, que precisa modificar o arquivo protegido/etc/shadow. O executávelpasswdpertence aoroote tem o bit SUID ativado, então, quando um usuário normal o executa, ele ganha temporariamente privilégios de root apenas para aquela operação. É poderoso, mas perigoso. - SGID (Set Group ID) - Octal
2: Semelhante ao SUID, mas um executável roda com a identidade do grupo do arquivo. De forma mais útil, quando definido em um diretório, qualquer novo arquivo ou diretório criado dentro dele herdará automaticamente o grupo do diretório pai, e não o grupo primário do usuário criador. Isso é essencial para pastas de projetos compartilhados. - Sticky Bit - Octal
1: Este tem uma história estranha, mas hoje é usado quase exclusivamente em diretórios. Quando um diretório tem o sticky bit (como a pasta/tmpdo sistema), todos os usuários podem criar arquivos nele, mas um usuário só pode apagar ou renomear os arquivos que ele mesmo possui. Isso impede que as pessoas mexam nas coisas umas das outras em um espaço compartilhado.
Histórias do mundo real
O Caso do Script Inexecutável
Um desenvolvedor júnior, Alex, escreve um script shell brilhante para automatizar o deploy do servidor. Ele commita deploy.sh no Git. No servidor de produção, ele clona o repositório, digita ./deploy.sh e aperta Enter. A resposta: bash: ./deploy.sh: Permission denied. Pânico. Será que ele quebrou o servidor? Um desenvolvedor sênior calmamente digita ls -l deploy.sh e mostra a saída: -rw-r--r--. O arquivo tinha permissões de leitura e escrita, mas não de execução (x). O Git não preserva as permissões de execução por padrão. Um rápido chmod +x deploy.sh depois, o script rodou perfeitamente.
Lição: Arquivos, especialmente de fontes como Git ou arquivos zip, não são executáveis por padrão. Você deve conceder explicitamente a permissão para executá-los.
O Pesadelo da Pasta de Projeto Compartilhada
Uma equipe de design e uma equipe de desenvolvimento precisavam compartilhar assets em uma pasta em um servidor Linux: /data/projeto-x. O administrador do sistema colocou todos no grupo projeto-x-team e deu ao grupo acesso de escrita à pasta. Mas o caos se instalou. Quando um designer fazia upload de um arquivo, ele pertencia a designer:designers, e os desenvolvedores não podiam modificá-lo. Quando um desenvolvedor criava uma subpasta, ela pertencia a dev:developers, e os designers não podiam adicionar arquivos a ela. Todos estavam constantemente pedindo ao sysadmin para corrigir as permissões. A solução? O admin rodou chmod g+s /data/projeto-x. Isso ativou o bit SGID no diretório. A partir de então, cada novo arquivo e pasta criado dentro de /data/projeto-x herdava automaticamente o grupo projeto-x-team. A harmonia foi restaurada.
Lição: O SGID em um diretório é a maneira correta e sem gambiarras de gerenciar pastas de grupo compartilhadas.
A Brecha de Segurança do Site Público
Um desenvolvedor web freelancer lançou um site simples em PHP para um cliente. Por conveniência, ele deixou o arquivo de configuração do banco de dados, config.inc.php, no mesmo diretório da página inicial. O arquivo continha o nome de usuário e a senha do banco de dados em texto plano. Suas permissões eram o padrão 644 (-rw-r--r--), o que significava que o usuário do servidor web podia lê-lo (bom), mas também qualquer pessoa no planeta que adivinhasse a URL. Um scanner de segurança encontrou o arquivo, e o invasor baixou as credenciais do banco de dados. A correção deveria ter sido chmod 600 config.inc.php, tornando-o legível apenas pelo proprietário (o processo do servidor web).
Lição: Nunca presuma que as permissões padrão são seguras. Arquivos sensíveis como configurações e chaves privadas devem ser travados para serem o mais restritivos possível.
Erros e armadilhas comuns
- A marreta do
chmod 777. Quando frustrados, muitos são tentados a rodarchmod -R 777 .em um diretório. Isso recursivamente dá a todos permissão para ler, escrever e executar tudo. É uma vulnerabilidade de segurança catastrófica e o equivalente digital a tirar as portas da sua casa e deixar uma placa de "Coisas Grátis Aqui Dentro" no gramado. Não faça isso. - Esquecer a permissão
xdo diretório. Você pode ter permissãorem um arquivo, mas não conseguir acessá-lo porque não tem permissãoxem um dos diretórios pais em seu caminho. Você precisa de permissão de execução em todos os diretórios que deseja atravessar. - O mistério do
umask. Já se perguntou por que os novos arquivos que você cria são644e não777? É o seuumaskem ação. Umumaské uma "máscara" que seu shell aplica, removendo permissões de arquivos e diretórios à medida que são criados. Umumaskcomum de022remove a permissão de "escrita" para o Grupo e Outros, transformando um666padrão em644. - Achar que
chmod +xé o mesmo quechmod 755. Não é.chmod 755 meu_arquivodefine as permissões de forma absoluta.chmod +x meu_arquivoadiciona o bit de execução para qualquer classe de usuário (proprietário, grupo, outro) que já tenha o bit de leitura, sem alterar nenhum outro bit. O modo simbólico é relativo; o modo octal é absoluto.
Por que isso deve estar no seu radar
Se você mexe em uma linha de comando que não seja Windows, precisa entender chmod. Não é opcional. Este conhecimento é crucial quando:
- Fazendo deploy de qualquer aplicação em um servidor Linux.
- Escrevendo scripts (Shell, Python, Node.js) que precisam ser executados.
- Trabalhando com Git, que tem suas próprias ideias sobre permissões de arquivo.
- Configurando compartilhamentos de arquivos ou ambientes colaborativos.
- Reforçando a segurança de um servidor, restringindo o acesso a arquivos sensíveis.
- Usando Docker, onde as permissões de arquivo dentro do contêiner são primordiais.
chmod é um dos primeiros e mais fundamentais comandos que separam um usuário casual de um verdadeiro operador de sistema ou desenvolvedor. Entendê-lo é um rito de passagem para controlar a máquina, não apenas usá-la.
Vá mais a fundo
- Wikipedia: chmod - Uma ótima visão geral do comando, sua história e suas diferentes notações (em inglês).
- Wikipedia: File-system permissions - Uma visão mais ampla dos conceitos de DAC, ACLs e a notação simbólica/octal em vários sistemas (em inglês).
- The Linux man-pages project: chmod(1) - A referência técnica canônica para o comando
chmodno Linux. Densa, mas oficial (em inglês). - The Open Group Base Specifications (POSIX): chmod - O padrão real que define como
chmoddeve se comportar em qualquer sistema compatível com POSIX (como macOS e Linux) (em inglês). - ArchWiki: File permissions and attributes - Um guia muito prático e bem mantido da comunidade Arch Linux, cobrindo
chmod,chowne atributos especiais (em inglês).