File permissions and attributes (Português)
Sistemas de arquivos usam permissões e atributos para regular o nível de interação que processos de sistema podem ter com os arquivos e diretórios.
Visualizando permissões
Use a opção -l
do comando ls para visualizar as permissões (ou modo de arquivo) definidas para o conteúdo de um diretório, por exemplo:
$ ls -l /caminho/para/diretório
total 128 drwxr-xr-x 2 archie users 4096 Jul 5 21:03 'Área de trabalho' drwxr-xr-x 6 archie users 4096 Jul 5 17:37 Documentos drwxr-xr-x 2 archie users 4096 Jul 5 13:45 Downloads -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 clientes -rw-r--r-- 1 archie users 3339 Jun 27 08:28 tarefas -rwxr-xr-x 1 archie users 2048 Jul 6 12:56 meuscript.sh
A primeira coluna é o que devemos focar. Tomando um valor de exemplo de drwxrwxrwx +
, o significado de cada caractere é explicado nas seguintes tabelas:
d
|
rwx
|
rwx
|
rwx
|
+
|
O tipo de arquivo, tecnicamente não sendo parte de suas permissões. Veja info ls -n "What information is listed" para uma explicação dos valores possíveis.
|
As permissões que o proprietário tem sobre o arquivo, explicadas abaixo. | As permissões que o grupo tem sobre o arquivo, explicadas abaixo. | As permissões que outros usuários têm sobre o arquivo, explicadas abaixo. | Um único caractere que especifica se um método de acesso alternativo se aplica ao arquivo. Quando esse caractere é um espaço, não há método de acesso alternativo. Um caractere . indica um arquivo com um contexto de segurança, mas nenhum outro método de acesso alternativo. Um arquivo com qualquer outra combinação de métodos de acesso alternativo é marcado com um caractere + , por exemplo, no caso de Listas de Controle de Acesso.
|
Cada uma das três tríades de permissão (rwx
no exemplo acima) pode ser composta dos seguintes caracteres:
Caractere | Efeito nos arquivos | Efeito em diretórios | |
---|---|---|---|
Permissão de leitura (primeiro caractere) |
-
|
O arquivo não pode ser lido. | O conteúdo do diretório não pode ser mostrado. |
r
|
O arquivo pode ser lido. | O conteúdo do diretório pode ser mostrado. | |
Permissão de escrita (segundo caractere) |
-
|
O arquivo não pode ser modificado. | O conteúdo do diretório não pode ser modificado. |
w
|
O arquivo pode ser modificado. | O conteúdo do diretório pode ser modificado (criar novos arquivos ou pastas; renomear ou excluir arquivos ou pastas existentes); exige que a permissão de execução também esteja definida, do contrário essa permissão não tem efeito. | |
Permissão de execução (terceiro caractere) |
-
|
O arquivo não pode ser executado. | O diretório não pode ser acessado com cd. |
x
|
O arquivo pode ser executado. | O diretório pode ser acessado com cd; essa é o único bit de permissão que, na prática, pode ser considerado como "herdado" dos diretórios anteriores - na verdade, se qualquer pasta no caminho não tem o bit x definido, o arquivo ou pasta final também não pode ser acessado(a), independentemente de suas permissões; veja path_resolution(7) para mais informações.
|
|
s
|
O bit setuid quando encontrar-se na tríade de usuário; o bit setgid quando encontrar-se na tríade de grupo; ele não é encontrado na tríade de outros; isso também implica que x está definido.
|
||
S
|
Mesmo que s , mas x não está definido; raro em arquivos comuns e inútil em pastas.
|
||
t
|
O sticky bit (ou "bit pegajoso"); ele só pode ser encontrado na tríade de outros; isso também implica que x está definido.
|
||
T
|
Mesmo que t , mas x não está definido; raro em arquivos comuns e inútil em pastas.
|
Veja info Coreutils -n "Mode Structure"
e chmod(1) para mais detalhes.
namei -l caminho
.Exemplos
Vamos ver alguns exemplos para esclarecer:
drwx------ 6 archie users 4096 Jul 5 17:37 Documentos
Archie tem acesso total ao diretório Documentos. Ele pode listar, criar arquivos e renomear, excluir qualquer arquivo em Documentos, independentemente das permissões de arquivo. Sua capacidade de acessar um arquivo depende da permissão do arquivo.
dr-x------ 6 archie users 4096 Jul 5 17:37 Documentos
Archie tem acesso completo, exceto que ele não pode criar, renomear, excluir qualquer arquivo. Ele pode listar os arquivos e (se a permissão do arquivo permitir) acessar um arquivo existente em Documentos.
d-wx------ 6 archie users 4096 Jul 5 17:37 Documentos
Archie não pode fazer 'ls' em Documentos, mas se ele sabe o nome de um arquivo existente, ele pode listar, renomear, deletar ou (se a permissão do arquivo permitir) acessá-lo. Além disso, ele é capaz de criar novos arquivos.
d--x------ 6 archie users 4096 Jul 5 17:37 Documentos
Archie só é capaz de (se a permissão do arquivo o autorizar) acessar esses arquivos em Documentos que ele conhece. Ele não pode listar arquivos já existentes ou criar, renomear, excluir qualquer um deles.
Você deve ter em mente que elaboramos permissões de diretório e não tem nada a ver com as permissões de arquivos individuais. Quando você cria um novo arquivo, é o diretório que muda. É por isso que você precisa de permissão de gravação no diretório.
Vejamos outro exemplo, desta vez de um arquivo, não de um diretório:
-rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
Aqui podemos ver que a primeira letra não é d
mas -
. Então sabemos que é um arquivo, não um diretório. Em seguida, as permissões do proprietário são rw-
para que o proprietário tenha a capacidade de ler e escrever, mas não de executar. Isso pode parecer estranho que o proprietário não tenha todas as três permissões, mas a permissão x
não é necessária, pois é um arquivo de texto/dados, para ser lido por um editor de texto como Gedit, EMACS ou software como o R, e não um executável por si só (se contivesse algo como código de programação python, então muito bem poderia ser). As permissões do grupo são definidas para r--
, então o grupo tem a capacidade de ler o arquivo mas não de escrevê-lo/editá-lo de qualquer forma - é essencialmente como configurar algo para somente leitura. Podemos ver que as mesmas permissões se aplicam a todos os outros também.
Alterando permissões
chmod é um comando no Linux e em outros sistemas operacionais parecidos com Unix que permite alterar (change) as permissões (ou modo de acesso) de um arquivo ou diretório.
Método de texto
Para alterar as permissões - ou modo de acesso - de um arquivo, use o comando chmod em um terminal. Abaixo está a estrutura geral do comando:
chmod quem=permissões nome_do_arquivo
sendo quem
qualquer intervalo de letras, cada significando a quem está sendo dada a permissão. Eles são o que segue:
-
u
: o usuário proprietário do arquivo. -
g
: o grupo de usuários ao qual o arquivo pertence. -
o
: outros usuários, isto é, todos os demais. -
a
: todos (all) acima; use isso em vez de digitarugo
.
As permissões são as mesmas discutidas em #Visualizando permissões (r
, w
e x
).
Agora dê uma olhada em alguns exemplos usando este comando. Suponha que você tenha se tornado muito protetor do diretório Documentos e queira negar a todos menos a si mesmo, permissões para ler, escrever e executar (ou, neste caso, pesquisar/procurar) nele:
Antes: drwxr-xr-x 6 archie users 4096 Jul 5 17:37 Documentos
$ chmod g= Documentos $ chmod o= Documentos
Após: drwx------ 6 archie users 4096 Jul 6 17:32 Documentos
Aqui, porque você quer negar permissões, você não coloca nenhuma letra após o =
onde as permissões seriam inseridas. Agora você pode ver que apenas as permissões do proprietário são rwx
e todas as outras permissões são -
.
Isso pode ser revertido com:
Antes: drwx------ 6 archie users 4096 Jul 6 17:32 Documentos
$ chmod g=rx Documentos $ chmod o=rx Documentos
Após: drwxr-xr-x 6 archie users 4096 Jul 6 17:32 Documentos
No próximo exemplo, você deseja conceder permissões de leitura e execução ao grupo e a outros usuários, portanto, coloque as letras das permissões (r
e x
) após o =
, sem espaços.
Você pode simplificar isso para colocar mais de uma letra quem
no mesmo comando, por exemplo:
$ chmod go=rx Documentos
quem
ou as letras de permissão em um comando chmod
: você pode ter chmod go=rx arquivo
ou chmod og=xr arquivo
. É tudo a mesma coisa.Agora, vamos considerar um segundo exemplo, suponha que você queira alterar um arquivo foobar
para que tenha permissões de leitura e gravação e outros usuários do grupo users
que possam ser colegas trabalhando em foobar
, também pode ler e escrever para ele, mas outros usuários só podem lê-lo:
Antes: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod g=rw foobar
Após: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
Isso é exatamente como no primeiro exemplo, mas com um arquivo, não um diretório, e você concede permissão de gravação (apenas para dar um exemplo de concessão de todas as permissões).
Atalhos do método de texto
O comando chmod permite adicionar e subtrair permissões de um conjunto existente usando +
ou -
em vez de =
. Isso é diferente dos comandos acima, que essencialmente reescrevem as permissões (por exemplo, para alterar uma permissão de r--
para rw-
, você ainda precisa incluir r
assim como w
após o =
na invocação do comando chmod. Se você esquecesse r
, isso retiraria a permissão de r
, pois estão sendo re-escritas com o =
. Usar +
e -
evita isso adicionando ou afastando do conjunto atual de permissões).
Vamos tentar este método +
e -
com o exemplo anterior de adicionar permissões de escrita ao grupo:
Antes: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod g+w foobar
Após: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
Outro exemplo, negando permissões de escrita para todos (a):
Antes: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod a-w foobar
Após: -r--r--r-- 1 archie users 5120 Jun 27 08:28 foobar
Um atalho diferente é o modo especial X
: este não é um modo de arquivo real, mas é frequentemente usado em conjunto com a opção -R
para definir o bit executável somente para diretórios, e deixe-o inalterado para arquivos regulares, por exemplo:
$ chmod -R a+rX ./data/
Permissões de cópia
É possível dizer ao chmod para copiar as permissões de uma classe, digamos o proprietário, e dar as mesmas permissões para grupo ou até mesmo todos. Para fazer isso, ao invés de colocar r
, w
, ou x
depois do =
, coloque outra letra de quem. Por exemplo:
Antes: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod g=u foobar
Após: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
Este comando essencialmente se traduz a "altere as permissões do grupo (g=
) para ser a mesma que o usuário proprietário (=u
). Note que você não pode copiar um conjunto de permissões, bem como conceder novas, por exemplo:
$ chmod g=wu foobar
Neste caso, chmod exibe um erro.
Método numérico
O chmod também pode definir permissões usando números.
Usar números é outro método que permite editar as permissões de todos os três proprietário, grupo e outros ao mesmo tempo, bem como os bits setuid, setgid e sticky. Essa estrutura básica do código é esta:
$ chmod xxx nome_do_arquivo
sendo xxx
um número de 3 dígitos onde cada dígito pode ser qualquer coisa de 0 a 7. O primeiro dígito se aplica a permissões para proprietário, o segundo dígito se aplica a permissões para grupo e o terceiro dígito se aplica a permissões para todos os outros.
Nesta notação numérica, os valores r
, w
e x
possuem seu próprio valor numérico:
r=4 w=2 x=1
Para criar um número de 3 dígitos, é necessário considerar quais permissões você deseja que proprietário, grupo e todos os outros tenham e, em seguida, totalizar seus valores. Por exemplo, se você quiser conceder ao proprietário de um diretório permissões de leitura, escrita e execução, e quiser que o grupo e todos os demais tenham apenas permissões de leitura e execução, você obterá os valores numéricos da seguinte forma:
- Proprietário:
rwx
=4+2+1=7 - Grupo:
r-x
=4+0+1=5 - Outro:
r-x
=4+0+1=5
$ chmod 755 nome_do_arquivo
Isso é equivalente a usar o seguinte:
$ chmod u=rwx nome_do_arquivo $ chmod go=rx nome_do_arquivo
Para visualizar as permissões existentes de um arquivo ou diretório no formato numérico, use o comando stat(1):
$ stat -c %a nome_do_arquivo
sendo que a opção %a especifica a saída no formato numérico.
A maioria das pastas e diretórios é configurada para 755
para permitir leitura, escrita e execução para o proprietário, mas nega a escrita para todos os outros, e os arquivos são normalmente 644
para permitir leitura e escrita para o proprietário, mas apenas leitura para todos os outros; consulte a última nota sobre a falta de permissões x
com arquivos não executáveis: é a mesma coisa aqui.
Para ver isso em ação com exemplos, considere o exemplo anterior que foi usado, mas com este método numérico aplicado:
Antes: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod 664 foobar
Após: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
Se este fosse um executável, o número seria 774
se você quisesse conceder permissão executável ao proprietário e ao grupo. Alternativamente, se você quiser que todos tenham permissão de leitura, o número será 444
. Tratar r
como 4, w
como 2 e x
como 1 é provavelmente a maneira mais fácil de calcular os valores numéricos para usar chmod xxx nome_do_arquivo
, mas há também um método binário, em que cada permissão possui um número binário e, em seguida, isso é convertido em um número. É um pouco mais complicado, mas aqui incluído para ser completo.
Considere esse conjunto de permissões:
-rwxr-xr--
Se você colocar um 1 em cada permissão concedida e um 0 para cada um não concedido, o resultado seria algo assim:
-rwxrwxr-x 111111101
Você pode então converter esses números binários:
000=0 100=4 001=1 101=5 010=2 110=6 011=3 111=7
O valor do acima seria, portanto, 775.
Considere que queríamos remover a permissão gravável do grupo:
-rwxr-xr-x 111101101
O valor seria, portanto, 755 e você usaria o chmod 755 nome_do_arquivo
para remover a permissão de escrita. Você notará que obtém o mesmo número de três dígitos, independentemente do método usado. O uso de texto ou números dependerá da preferência pessoal e da velocidade de digitação. Quando você deseja restaurar um diretório ou arquivo para as permissões padrão, por exemplo, ler e escrever (e executar) permissão para o proprietário, mas negar permissão de gravação a todos os outros, pode ser mais rápido usar chmod 755/644 nome_do_arquivo
. No entanto, se você estiver alterando as permissões para algo fora da norma, poderá ser mais simples e rápido usar o método de texto, em vez de tentar convertê-lo em números, o que pode levar a um erro. Pode-se argumentar que não há diferença significativa real na velocidade de cada método para um usuário que só precisa usar chmod ocasionalmente.
Você também pode usar o método numérico para definir os bits setuid
, setgid
e sticky
usando quatro dígitos.
setuid=4 setgid=2 sticky=1
Por exemplo, chmod 2777 nome_do_arquivo
vai definir bits de leitura/escrita/execução para todos e também vai habilitar o bit setgid
.
chmod em lote
Geralmente, os diretórios e arquivos não devem ter as mesmas permissões. Se for necessário modificar em massa uma árvore de diretórios, use find para modificar seletivamente um ou o outro.
Para usar chmod para modificar permissões apenas de diretórios para 755:
$ find diretório -type d -exec chmod 755 {} +
Para usar chmod para modificar permissões apenas de arquivos para 644:
$ find diretório -type f -exec chmod 644 {} +
Alterando o proprietário
O chown altera o proprietário de um arquivo ou diretório, o que é mais rápido e mais fácil do que alterar as permissões em alguns casos.
Considere o exemplo a seguir, criando uma nova partição com GParted para dados de backup. O Gparted faz isso tudo como root, então tudo pertence à raiz por padrão. Tudo isso é bom, mas quando se trata de escrever dados na partição montada, a permissão é negada para usuários comuns.
brw-rw---- 1 root disk 8, 9 Jul 6 16:02 sda9 drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup
Como você pode ver, o dispositivo em /dev
pertence ao root, assim como o local de montagem (/media/Backup
). Para alterar o proprietário do local de montagem, é possível fazer o seguinte:
Antes: drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup
# chown archie /media/Backup
Após: drwxr-xr-x 5 archie root 4096 Jul 6 16:01 Backup
Agora a partição pode ter dados gravados pelo novo proprietário, archie, sem alterar as permissões (já que a tríade do proprietário já tinha permissões rwx
).
-
chown
sempre limpa os bits de setuid e setgid. - Além root, nenhum usuário pode usar
chown
para "dar" arquivos que lhe pertence para outro usuário.
Listas de Controle de Acesso
Listas de Controle de Acesso fornece um mecanismo de permissão adicional e mais flexível para sistemas de arquivos, permitindo definir permissões para qualquer usuário ou grupo para qualquer arquivo.
Umask
O utilitário umask é usado para controlar a máscara do modo de criação de arquivo, que determina o valor inicial dos bits de permissão de arquivo para arquivos recém-criados.
Atributos de arquivos
Além dos bits do modo de arquivo que controlam usuário e grupo permissões de leitura, gravação e execução, vários sistemas de arquivos suportam atributos de arquivo que permitem uma personalização adicional das operações de arquivo permitidas. Esta seção descreve alguns desses atributos e como trabalhar com eles.
chattr e lsattr
Para sistemas de arquivos ext2 e ext3, o pacote e2fsprogs contém os programas lsattr e chattr que listam e alteram os atributos de um arquivo, respectivamente. Embora alguns não sejam respeitados por todos os sistemas de arquivos, os atributos disponíveis são:
-
a
: anexar apenas -
c
: compactado -
d
: sem despejo -
e
: formato estendido -
i
: imutável -
j
: journalling de dados -
s
: exclusão segura -
t
: sem tail-merging -
u
: não excluível -
A
: sem atualizações atime -
C
: sem cópia ao escrever -
D
: atualizações de diretório síncronas -
S
: atualizações síncronas -
T
: topo da hierarquia de diretório
Por exemplo, se você deseja definir o bit imutável em alguns arquivos, use o seguinte comando:
# chattr +i /caminho/para/arquivo
Para remover um atributo em um arquivo, basta alterar +
para -
.
Atributos estendidos
Do xattr(7): "Atributos estendidos são pares nome:valor associados permanentemente a arquivos e diretórios". Existem quatro classes de atributos estendidos: segurança, sistema, confiável e usuário.
Atributos estendidos também são usados para definir Capacidades.
Atributos estendidos de usuário
Os atributos estendidos do usuário podem ser usados para armazenar informações arbitrárias sobre um arquivo. Para criar um:
$ setfattr -n user.checksum -v "3baf9ebce4c664ca8d9e5f6314fb47fb" foo.txt
Use getfattr para exibir atributos estendidos:
$ getfattr -d foo.txt
# file: foo.txt user.checksum="3baf9ebce4c664ca8d9e5f6314fb47fb"
Finalmente, para remover um atributo estendido:
$ setfattr -x user.checksum foo.txt
Preservando atributos estendidos
Comando | Sinalizador necessário |
---|---|
cp |
--preserve=mode,ownership,timestamps,xattr
|
mv |
preserva, por padrão1 |
tar |
--xattrs para criação e extração
|
bsdtar |
-p para extração
|
rsync |
--xattrs
|
- mv descarta silenciosamente atributos quando o sistema de arquivos alvo não tiver suporte a eles.
Para preservar atributos estendidos com editores de texto, você precisa configurá-los para truncar arquivos ao salvar em vez de usar rename(2).[1]
Dicas e truques
Preservar root
Use o sinalizador --preserve-root
para impedir que chmod
atue recursivamente em /
. Isso pode, por exemplo, impedir que um remova o bit executável em todo o sistema e, assim, quebre o sistema. Para usar esse sinalizador todas as vezes, defina-o em um alias. Veja também [2].
Veja também
- wikipedia:pt:Chattr
- Confusão nas Permissões de Arquivos no Linux
- Confusão nas Permissões de Arquivos no Linux parte 2
- wikipedia:Extended file attributes#Linux
- Atributos estendidos: o bom, o não tão bom, o mal.
- Faça backup e restaure permissões de arquivos no Linux
- Por que “chmod -R 777 /” é destrutivo?