Chmod

Em sistemas operacionais do tipo Unix, o chmod (abreviação de change mode, em português: alterar modo) é o comando e a chamada de sistema que pode alterar permissões de acesso de objetos do sistema (arquivos e diretórios) e sinalizações (flags) de modo especial. A requisição é filtrada pelo umask.[1]

História

Um comando chmod apareceu pela primeira vez na versão 1 do Unix da AT&T.

À medida que os sistemas cresciam em número e tipos de usuários, listas de controle de acesso eram adicionadas a muitos sistemas de arquivos, além desses modos mais básicos para aumentar a flexibilidade.

Sintaxe do comando

$ chmod [opções] modo[,modo] arquivo1 [arquivo2 ...]

Opções implementadas frequentemente incluem:

  • -R recursive, isto é, inclui objetos e subdiretórios
  • -f force, segue em frente com todos os objetos, mesmo que ocorram erros
  • -v verbose, exibe todos os objetos processados

Se uma ligação simbólica for especificada, o objeto alvo é afetado. Os modos de arquivo diretamente associados às ligações simbólicas em si normalmente nunca são usados.

Para visualizar o modo do arquivo, os comandos ls ou stat podem ser usados:

$ ls -l encontrarNumerosDeTelefone.sh
-rwxr-xr--  1 tneves  equipe  823 Dec 16 15:03 encontrarNumerosDeTelefone.sh
$ stat -c %a encontrarNumerosDeTelefone.sh
754

O r, w e x especificam o acesso de leitura, gravação e execução, respectivamente. O primeiro caractere da exibição do ls indica o tipo de objeto. Um hífen representa um arquivo simples. Esse script pode ser lido, gravado e executado pelo proprietário, lido e executado por outros membros do grupo da equipe e também pode ser lido por outras pessoas.

Modo octal

Um octal é um número escrito sob a base 8, ou seja, usa 8 símbolos diferentes para ser representado, geralmente, os algarismos arábicos de 0 a 7. O chmod usa um número octal de 3 algarismos como parâmetro para realizar sua função.

Por meio do exemplo a seguir, pode-se identificar as partes principais das permissões chmod.

Exemplo: drwxrwx---

À direita do "d":

  • Os três caracteres da esquerda rwx definem permissões do PROPRIETÁRIO.
  • Os três caracteres do meio rwx definem permissões do GRUPO.
  • Os três caracteres da direita --- definem permissões de TODOS OS OUTROS. Neste exemplo, TODOS OS OUTROS não possuem permissões.

Permissões numéricas

O formato numérico do chmod aceita até quatro dígitos octais. Os três dígitos mais à esquerda referem-se às permissões para o proprietário, grupo e outros usuários do arquivo, respectivamente. O primeiro dígito opcional, quando são fornecidos 4 dígitos, especifica os sinalizadores (flags) especiais setuid, setgid e sticky.

Cada dígito dos três dígitos mais à direita representa um valor binário, cujos bits controlam a leitura, gravação e execução, respectivamente, onde 1 significa permitir e 0 significa não. Isso é semelhante à notação octal, mas representada em números decimais.

# Permissão rwx Binário
7 leitura, escrita e execução rwx 111
6 leitura e escrita rw- 110
5 leitura e execução r-x 101
4 apenas leitura r-- 100
3 escrita e execução -wx 011
2 apenas escrita -w- 010
1 apenas execução --x 001
0 nenhum --- 000

Cada grupo de 3 algarismos binários representa um dos níveis entre usuário (u), grupo (g) e outros (o), e cada um dos 3 algarismos ou bits de cada grupo representa um tipo de permissão entre leitura (r), do Inglês 'read', gravação (w), do Inglês 'write' e execução (x), do Inglês 'execute', onde um '1' indica permissão cedida e um '0', permissão negada.

Por exemplo, 754 permitiria:

  • ler, escrever e executar para o PROPRIETÁRIO, uma vez que o valor binário de 7 é 111, significando que todos os bits estão ativados;
  • ler e executar para o GRUPO, uma vez que o valor binário de 5 é 101, significando que leitura e execução estão ativados, porém escrita está desativado;
  • apenas ler para TODOS OS OUTROS, uma vez que o valor binário de 4 é 100, significando que apenas o bit de leitura está ativado.

Exemplos de permissões numéricas

$ chmod 750 arquivo.txt

No exemplo o número 750 está escrito na forma octal. Sua forma binária seria 111101000. O 7 é a forma octal do binário '111' e representa todas as permissões (leitura, escrita e execução) para o proprietário (user) do arquivo 'arquivo.txt'. O 5 é a forma octal do binário 101 e representa as permissões de leitura e execução para o grupo, e por fim, 0 representa a negação de todas as permissões para outros.

    Nível  u   g   o
Permissão rwx r-x ---
  Binário 111 101 000
    Octal  7   5   0
Para arquivos (-)
rwx 
000  0  (zero) permissão negada
001  1   permissão de execução
010  2   permissão de gravação
011  3   permissão de gravação e execução
100  4   permissão de leitura
101  5   permissão de leitura e execução
110  6   permissão de leitura e gravação
111  7   soma de todas as permissões
Para diretórios (d)
rwx
000  0  (zero) permissão negada
001  1   permissão para entrar no diretório
010  2   permissão para gravar dentro do diretório
011  3   permissão de entrar e gravar no diretório
100  4   permissão para listar o conteúdo do diretório
101  5   permissão de listar e entrar no diretório
110  6   permissão de listar e gravar no diretório
111  7   soma de todas as permissões

Há uma maneira prática de converter números binários para octais. Basta somar os valores relativos dos algarismos. Exemplo: sabendo que os valores absolutos de cada algarismo em 111 são respectivamente 4, 2 e 1, somados dão o resultado 7. Já em 000, dão o resultado 0.

Modos simbólicos

É possível e mais humano prescindir do modo octal. Quando a modificação se fizer sobre o grupo, por exemplo, faremos assim para adicionar a permissão de escrita:

$ chmod g+w arquivo.txt

Dessa forma o grupo a que pertence este arquivo passa a ter permissão de gravação no mesmo. É possível mudar várias permissões para o mesmo ficheiro. Por exemplo:

$ chmod o+rw envel.ficheiro

Atribui a outros, de uma vez, as permissões de leitura e escrita sobre o ficheiro envel.ficheiro. De forma semelhante é possível mudar permissões de uma só vez para diversas classes de utilizador:

$ chmod ugo-rwx envel.ficheiro

Retira todas as permissões, a todas as classes de utilizador, relativamente ao ficheiro envel.ficheiro.

Modos especiais

O comando chmod também é capaz de alterar as permissões adicionais ou modos especiais de um arquivo ou diretório. Os modos simbólicos usam 's' para representar os modos setuid e setgid, e 't' para representar o modo sticky. Os modos são aplicados apenas às classes apropriadas, independentemente se outras classes são ou não especificadas.

A maioria dos sistemas operacionais suportam a especificação de modos especiais usando modos octais, mas alguns não. Nesses sistemas, apenas os modos simbólicos podem ser usados.

Opções

Algumas opções extras estão disponíveis para o chmod se adicionarmos os seguintes parâmetros

-c, --changes             igual verbose, mas reporta apenas quando uma mudança é feita
    --no-preserve-root    não trata '/' especialmente (padrão)
    --preserve-root       falha ao operar recursivamente em '/'
-f, --silent, --quiet     suprimir a maior parte das mensagens de erro
-v, --verbose             mostrar um diagnóstico para cada arquivo processado
    --reference=ARQR      usa modo do arquivo ARQR em vez dos valores de MODO
-R, --recursive           muda arquivos e diretórios recursivamente
    --help                exibe esta ajuda e sai
    --version             mostra informação de versão e sai

As permissões em vigor podem ser conhecidas com o comando ls. Ex:

$ ls -l

Outros comandos relacionados com o chmod são chown, que muda o dono de arquivos e pastas (ficheiros), e chgrp, que muda o grupo a que pertence o ficheiro.

Referências

  1. «Quick Reference: Unix Commands» (em inglês). University of Washington. Consultado em 15 de Setembro de 2018 

Ligações externas

  • «Linux: Chmod + dicas». - Viva o Linux 
  • «chmod invocation» (em inglês). - GNU Coreutils 
  • «chmod» (em inglês). - FreeBSD Man Pages 
  • «Tutorial for chmod» (em inglês) 


  • v
  • d
  • e
Arquivos
  • cat
  • cd
    • popd
    • pushd
  • chattr
  • chmod
  • chown
  • chflags
  • chgrp
  • cksum
  • cp
  • cmp
  • curl
  • dd
  • du
  • df
  • file
  • fsck
  • less
  • ln
  • ls
  • lsof
  • mkdir
  • more
  • mv
  • pax
  • pwd
  • rm
  • rmdir
  • split
  • size
  • tee
  • touch
  • tree
  • type
  • umask
Processos e tarefas
  • anacron
  • at
  • bg
  • chroot
  • crontab
  • jobs
  • kill
  • killall
  • nice
  • fg
  • pgrep
  • pidof
  • pkill
  • ps
  • pstree
  • time
  • top
  • wait
Ambiente e usuários
  • clear
  • env
  • exit
  • finger
  • history
  • id
  • locale
  • logname
  • mesg
  • passwd
  • su
  • sudo
  • talk
  • tput
  • ulimit
  • uname
  • umask
  • uptime
  • w
  • wall
  • who
  • whoami
  • write
Processamento de texto
  • awk
  • banner
  • basename
  • comm
  • csplit
  • cut
  • diff
  • dirname
  • disown
  • ed
  • ex
  • fmt
  • fold
  • head
  • iconv
  • join
  • less
  • more
  • nl
  • paste
  • sed
  • sort
  • spell
  • strings
  • tail
  • tr
  • uniq
  • vi
  • wc
  • xargs
Shell
  • alias
  • bind
  • break
  • compgen
  • complete
  • continue
  • echo
  • expr
  • history
  • printf
  • read
  • sh
  • shopt
  • source
  • test
  • true
  • false
  • unset
  • wait
  • yes
Redes e comunicação
  • dig
  • ifconfig
  • inetd
  • netstat
  • nslookup
  • ping
  • rlogin
  • route
  • ssh
  • traceroute
Busca
  • find
  • grep
  • strings
  • locate
  • whatis
  • whereis
Documentação
  • apropos
  • help
  • man
Miscelâneas
  • bc
  • dc
  • cal
  • date
  • lp
  • lpr
  • od
Comandos geralmente implementados no interpretador.
Comando geralmente implementados, tanto como executáveis, como quanto no interpretador.