Ubuntu chmod

O chmod (de change mode, "mudar o modo") muda as permissões de um arquivo ou pasta: quem pode ler, escrever e executar. É o comando que você usa para tornar um script executável ou para proteger um arquivo com senhas.

Você vai aprender
  • A ler -rwxr-x--- posição por posição.
  • As duas formas de usar o chmod: simbólica (u+x) e octal (755), com a conta explicada.
  • A mudar pastas inteiras sem tornar todos os arquivos executáveis.
  • A resolver o "Permissão negada" ao rodar ./script.sh.

O conceito de permissões está em Entendendo Permissões. Aqui vamos à prática. O simulador do guia não tem o chmod, mas tem o ls -l, então você pode praticar a leitura.


Lendo as permissões, posição por posição

O ls -l mostra as permissões nos 10 primeiros caracteres da linha:

$ ls -l backup.sh
-rwxr-x--- 1 ana ana 45 Oct 15 09:15 backup.sh
-
Tipo: - arquivo comum, d pasta, l link.
rwx
Posições 2 a 4: o que o dono (ana) pode fazer. Aqui, tudo.
r-x
Posições 5 a 7: o que o grupo (ana) pode. Ler e executar; o - no meio diz que não pode escrever.
---
Posições 8 a 10: o que os outros (todo o resto) podem. Nada.

Cada trio é sempre na mesma ordem: r (read, ler), w (write, escrever), x (execute, executar). Um - no lugar da letra significa "não pode".

Missão: rode ls -l Documentos/projetos. Qual arquivo é executável pelo dono? E qual é uma pasta? Depois execute o script digitando o caminho dele: Documentos/projetos/backup.sh.


Modo simbólico: quem, operação, permissão

No modo simbólico, você escreve a mudança com letras. Ele tem três partes:

chmod
O programa.
u
Quem: u dono (user), g grupo, o outros (others), a todos (all).
+
Operação: + dá, - tira, = define exatamente.
x
Permissão: r, w e/ou x.
backup.sh
O arquivo.

Atenção: entre u, + e x não há espaço. O conjunto u+x é uma palavra só.

$ ls -l backup.sh
-rw-rw-r-- 1 ana ana 45 Oct 15 09:15 backup.sh
$ chmod u+x backup.sh
$ ls -l backup.sh
-rwxrw-r-- 1 ana ana 45 Oct 15 09:15 backup.sh       « o dono ganhou o x

Mais exemplos, sempre olhando o antes e o depois:

$ chmod go-w backup.sh
$ ls -l backup.sh
-rwxr--r-- 1 ana ana 45 Oct 15 09:15 backup.sh       « grupo perdeu o w
$ chmod u=rw,go=r backup.sh
$ ls -l backup.sh
-rw-r--r-- 1 ana ana 45 Oct 15 09:15 backup.sh       « "=" define exatamente; a vírgula separa as partes
$ chmod +x backup.sh
$ ls -l backup.sh
-rwxr-xr-x 1 ana ana 45 Oct 15 09:15 backup.sh       « sem "quem": vale para todos
ComandoEfeito
chmod u+x arqDono pode executar
chmod +x arqTodos podem executar (respeitando o umask)
chmod go-rwx arqSó o dono acessa
chmod a+r arqTodos podem ler
chmod u=rw,go= arqDono lê e escreve; os outros, nada
chmod g+w pastaO grupo pode criar e apagar arquivos na pasta

Modo octal: a conta 4 + 2 + 1

No modo octal, cada trio vira um número. Cada permissão tem um valor, e você soma os que quer dar:

PermissãoValor
r ler4
w escrever2
x executar1
nada0

Com isso, cada soma de 0 a 7 corresponde a uma combinação única:

NúmeroContaTrioSignifica
74+2+1rwxTudo
64+2rw-Ler e escrever
54+1r-xLer e executar
44r--Só ler
00---Nada

Três números, um para cada trio, na ordem dono, grupo, outros:

chmod
O programa.
7
Dono: 4+2+1 = rwx.
5
Grupo: 4+1 = r-x.
4
Outros: 4 = r--.
backup.sh
O arquivo.

No comando, os três números ficam juntos: chmod 754 backup.sh.

$ chmod 754 backup.sh
$ ls -l backup.sh
-rwxr-xr-- 1 ana ana 45 Oct 15 09:15 backup.sh
$ stat -c "%a %A %n" backup.sh
754 -rwxr-xr-- backup.sh              « o stat mostra o número e as letras lado a lado

Os valores que você vai usar sempre

OctalLetrasUso típico
644rw-r--r--Arquivo comum: você edita, os outros só leem
755rwxr-xr-xScript ou programa; pasta pública
600rw-------Arquivo privado: chave SSH, senhas
700rwx------Pasta privada, como ~/.ssh
664 / 775rw-rw-r-- / rwxrwxr-xArquivos e pastas compartilhados com o grupo

Simbólico ou octal?

SituaçãoMelhor formaExemplo
Mudar uma coisa e manter o restoSimbólicochmod u+x script.sh
Deixar exatamente de um jeitoOctalchmod 600 ~/.ssh/id_ed25519
Seguir uma instrução da internetOctal (é o mais comum)chmod 644 index.html
Pastas e arquivos juntosSimbólico com Xchmod -R u=rwX,go=rX site

Ver o que mudou: -v e -c

Como quase todo comando, o chmod fica quieto quando dá certo. Para ele contar o que fez:

$ chmod -v 755 backup.sh
mode of 'backup.sh' changed from 0754 (rwxr-xr--) to 0755 (rwxr-xr-x)
$ chmod -v o+r backup.sh
mode of 'backup.sh' retained as 0755 (rwxr-xr-x)        « já tinha, nada mudou

A opção -c (de changes) mostra só quando houve mudança de verdade. É útil com -R, em pastas grandes. As mensagens do chmod aparecem em inglês no Ubuntu 26.04.


Pastas inteiras: -R e o X maiúsculo

A opção -R (de recursive) aplica a mudança na pasta e em tudo o que está dentro dela.

O problema: pastas precisam de x para que se possa entrar nelas, mas arquivos de texto não devem ser executáveis. O X maiúsculo resolve isso: ele dá o x só às pastas, e aos arquivos que já eram executáveis.

chmod
O programa.
-R
Em tudo dentro da pasta.
u=rwX
Dono: ler, escrever e, se for pasta, entrar.
,go=rX
Grupo e outros: ler e, se for pasta, entrar.
site
A pasta.
$ chmod -R u=rwX,go=rX site
$ ls -lR site
site:
total 4
drwxr-xr-x 2 ana ana 4096 Oct 15 10:30 css           « pasta: ganhou x
-rw-r--r-- 1 ana ana    0 Oct 15 10:30 index.html    « arquivo: sem x

site/css:
total 0
-rw-r--r-- 1 ana ana 0 Oct 15 10:30 a.css

Outra forma, mais explícita, usa o find para tratar pastas e arquivos separadamente:

$ find site -type d -exec chmod 755 {} +
$ find site -type f -exec chmod 644 {} +
Cuidado com -R

Um chmod -R na pasta errada (como /, /etc ou a sua pasta pessoal inteira) pode quebrar o sistema ou o SSH, que exige permissões restritas em ~/.ssh. Confira o caminho duas vezes antes de apertar Enter.


Por que nunca usar 777

chmod 777 dá tudo a todos: qualquer usuário, ou programa invadido, pode alterar ou apagar o arquivo. Muitas respostas na internet sugerem 777 para "resolver" um Permissão negada. Isso tira o erro e abre um buraco de segurança.

Em vez disso, descubra quem precisa de acesso e dê só a ele: mude o dono com chown ou coloque a pessoa no grupo certo (Usuários e Grupos).


Permissões especiais

Às vezes aparece um quarto número na frente, como chmod 2775, ou letras diferentes no lugar do x:

NomeOctalAparece comoEfeito
setuid4000rwsr-xr-xO programa roda com o poder do dono (ex.: /usr/bin/passwd)
setgid2000rwxrwsr-xEm pastas: arquivos novos herdam o grupo da pasta
sticky1000rwxrwxrwtEm pastas: cada um só apaga os próprios arquivos
$ ls -ld /tmp
drwxrwxrwt 18 root root 4096 Oct 15 10:20 /tmp       « o "t" no fim é o sticky

Quando não funciona

"Permissão negada" ao rodar ./script.sh
$ ./backup.sh
bash: ./backup.sh: Permissão negada
$ echo $?
126                                  « 126 = encontrou, mas não pôde executar
$ ls -l backup.sh
-rw-rw-r-- 1 ana ana 45 Oct 15 09:15 backup.sh       « não tem nenhum x

O que aconteceu: o arquivo não tem permissão de execução. Isso é normal em arquivos recém-criados ou baixados.

Como resolver (duas formas):

$ chmod +x backup.sh
$ ./backup.sh
Fazendo backup...
$ bash backup.sh
Fazendo backup...                    « também funciona sem x: o bash lê o arquivo

Se o arquivo já tem x e o erro continua, ele pode estar num pendrive ou partição montada com a opção noexec. Copie para a sua pasta pessoal ou use bash script.sh. Veja mount e fstab.

"Operation not permitted"
$ chmod 755 /etc/hostname
chmod: changing permissions of '/etc/hostname': Operation not permitted

O que aconteceu: só o dono do arquivo (ou o root) pode mudar as permissões dele. O dono de /etc/hostname é o root.

Como resolver: confirme se a mudança é necessária e use sudo chmod ….

"invalid operator"
$ chmod abc backup.sh
chmod: invalid operator (expected +, -, or =, but found b)

O que aconteceu: o modo foi escrito errado. Depois do "quem" (u g o a) precisa vir +, - ou =.

Como resolver: confira a anatomia: chmod u+x, sem espaços.

A pasta tem r, mas não consigo entrar
$ ls -ld privada
drw-r--r-- 2 ana ana 4096 Oct 15 10:40 privada
$ cd privada
bash: cd: privada: Permissão negada

O que aconteceu: numa pasta, o x é a permissão de entrar. Sem ele, nem o dono acessa o conteúdo.

Como resolver: chmod u+x privada, ou o valor completo chmod 700 privada.


Referência de opções

OpçãoDescriçãoExemplo
-RAplica em tudo dentro da pastachmod -R go-w pasta
-vMostra cada arquivo processadochmod -v 644 a.txt
-cMostra só o que mudouchmod -Rc 755 bin
--reference=arqCopia as permissões de outro arquivochmod --reference=a.sh b.sh
X (no modo)x só para pastas e já executáveischmod -R a+rX pasta

Exercícios

1. Tornar executável

Complete para que só o dono ganhe permissão de executar:

chmod deploy.sh

2. Fazer a conta

Qual número octal corresponde a rw-r-----?

chmod segredo.txt

3. Chave SSH

Uma chave privada só pode ser lida e escrita pelo dono. Complete:

chmod ~/.ssh/id_ed25519

4. O que chmod 755 app.sh deixa o grupo fazer?

5. ./script.sh deu "Permissão negada" e o ls -l mostra -rw-rw-r--. Qual é a melhor solução?


Resumo

  • Permissões são três trios (dono, grupo, outros) de r w x.
  • Simbólico muda uma parte: chmod u+x, go-w, a=r.
  • Octal define tudo: r=4, w=2, x=1, somados por trio. Exemplos: 644, 755, 600.
  • Em pastas, use -R com X maiúsculo; nunca 777.
  • "Permissão negada" em ./script.sh: falta o x. Use chmod +x ou bash script.sh.