FlowingDev

Chmod, explicado: o aperto de mão secreto para seus arquivos e pastas

Entenda as permissões de arquivo do Unix, o sistema de direitos de leitura, escrita e execução que protege arquivos e diretórios no Linux, macOS e servidores web.

Testar a ferramenta: Calculadora Chmod

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 grupo apollo-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 comando passwd, que precisa modificar o arquivo protegido /etc/shadow. O executável passwd pertence ao root e 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 /tmp do 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 rodar chmod -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 x do diretório. Você pode ter permissão r em um arquivo, mas não conseguir acessá-lo porque não tem permissão x em 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ão 644 e não 777? É o seu umask em ação. Um umask é uma "máscara" que seu shell aplica, removendo permissões de arquivos e diretórios à medida que são criados. Um umask comum de 022 remove a permissão de "escrita" para o Grupo e Outros, transformando um 666 padrão em 644.
  • Achar que chmod +x é o mesmo que chmod 755. Não é. chmod 755 meu_arquivo define as permissões de forma absoluta. chmod +x meu_arquivo adiciona 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

Teoria feita. Hora de pôr a mão na massa — 100% no seu navegador.

Testar a ferramenta: Calculadora Chmod