Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior |
unix:permissoes_em_arquivos [2023/11/16 17:30] – [O comando chmod] maziero | unix:permissoes_em_arquivos [2023/11/16 17:33] (atual) – [Exercícios] maziero |
---|
| ====== UNIX: Permissões de acesso em arquivos ====== |
| |
| ===== Definições básicas ===== |
| |
| O UNIX possui um sistema de controle de acesso ao sistema de arquivos seguindo o paradigma de Listas de Controle de Acesso (ACL - //Access Control Lists//). A cada arquivo ou diretório são associados: |
| |
| * Um **usuário** proprietário (//owner//). Normalmente é quem criou o arquivo. |
| * Um **grupo** proprietário. Normalmente é o grupo primário de quem criou o arquivo, mas este pode mudá-lo para outro grupo do qual ele também faça parte. |
| * **Permissões de acesso** definidas para o **usuário**, o **grupo** e **outros** usuários (terceiros). |
| |
| As permissões definidas para os **arquivos** são: |
| |
| * **Leitura**, permitindo acesso ao conteúdo do arquivo. |
| * **Escrita**, permitindo modificar o conteúdo do arquivo. |
| * **Execução**, permitindo executar o arquivo (caso seja um executável ou script). |
| |
| As permissões definidas para os **diretórios** são similares: |
| |
| * **Leitura**, permitindo acesso ao conteúdo do diretório (listar os arquivos presentes). |
| * **Escrita**, permitindo modificar o conteúdo do diretório (criar ou apagar arquivos). |
| * **Execução**, permitindo entrar no diretório, ou atravessá-lo. |
| |
| Pode-se afirmar que um arquivo é protegido contra leituras ou modificações por suas próprias permissões, e contra apagamentos ou renomeações pelas permissões do diretório onde ele se encontra. |
| |
| ===== Consultando permissões ===== |
| |
| As permissões de acesso a arquivos e diretórios podem ser consultadas através de uma listagem de diretório longa, usando o comando ''ls -l'' (ou seu alias ''ll''). Uma listagem típica seria: |
| |
| <code> |
| -rw-r--r-- 1 maziero users 4068 mar 26 21:09 02.html |
| drwx------ 5 maziero users 1024 set 5 1998 Desktop/ |
| drwx------ 4 maziero users 1024 jan 26 1998 administ/ |
| drwxr-xr-x 2 maziero users 1024 set 13 1998 axhome/ |
| drwx------ 2 maziero users 1024 set 7 1998 bin/ |
| -rw-r----- 1 maziero users 4956 mar 26 20:34 descricao.html |
| drwx------ 11 maziero users 1024 jan 14 10:52 diversos/ |
| drwx------ 2 maziero users 1024 jan 26 1998 ensino/ |
| drwx------ 2 maziero users 1024 jan 26 1998 extensao/ |
| drwx------ 3 maziero users 1024 mar 8 1998 formacao/ |
| drwx------ 4 maziero users 13312 fev 23 20:49 icons/ |
| drwx------ 2 maziero users 1024 ago 5 1998 mail/ |
| drwx------ 2 maziero users 1024 jul 3 1998 nsmail/ |
| drwx------ 2 maziero users 1024 out 13 19:22 pesquisa/ |
| drwx------ 8 maziero users 1024 nov 24 1997 public_html/ |
| drwx------ 10 maziero users 1024 mar 25 21:28 raytrace/ |
| drwx------ 3 maziero users 1024 set 28 23:03 sistema/ |
| drwxr-xr-x 3 maziero users 1024 mar 26 21:07 testes/ |
| drwx------ 5 maziero users 1024 out 17 1997 tex/ |
| -rw------- 1 maziero users 9718 ago 2 1998 wood.gif |
| </code> |
| |
| Vamos analisar melhor os caracteres das colunas iniciais da listagem de diretório apresentada acima. |
| |
| As entradas de diretório em um sistema UNIX têm seu tipo indicado pelo **primeiro caractere** da listagem de diretório longa. Os tipos de entradas mais frequentes são: |
| |
| * ''-'' : arquivo normal |
| * ''d'' : diretório |
| * ''l'' : link simbólico (atalho) |
| * ''b'' : dispositivo (mapeado em ''/dev/'') orientado a blocos (como os discos rígidos) |
| * ''c'' : dispositivo (mapeado em ''/dev/'') orientado a caracteres (como modems e portas seriais) |
| * ''s'' : socket mapeado em arquivo (para comunicação entre processos) |
| * ''p'' : FIFO ou //Named Pipe// (outro meio de comunicação entre processos) |
| |
| Os demais caracteres representam os direitos de acesso do usuário (//user//), do grupo (//group//) e de terceiros (//others//), em grupos de três caracteres: |
| |
| * ''r'' : permissão de leitura (//read//). |
| * ''w'' : permissão de escrita (//write//). |
| * ''x'' : permissão de execução (//eXecute//). |
| * ''-'' : indica que o respectivo direito está negado. |
| * ''s'' : bits SUID e SGID setados (veremos mais tarde). |
| |
| Vejamos um exemplo: |
| |
| <code> |
| -rw-r----- 1 maziero users 4956 mar 26 20:34 descricao.html |
| </code> |
| |
| A linha de listagem acima indica que: |
| |
| * A entrada corresponde a um arquivo normal (o primeiro caractere é ''-''). |
| * O proprietário do arquivo ''descricao.html'' é o usuário ''maziero''. |
| * O proprietário possui direito de leitura e escrita sobre o arquivo, mas não de execução. |
| * O arquivo também pertence ao grupo ''users''. |
| * O grupo possui apenas direito de leitura sobre o arquivo. |
| * Outros usuários (terceiros) não possuem nenhum direito de acesso ao arquivo. |
| |
| ===== O comando chmod ===== |
| |
| Este comando permite alterar as permissões dos arquivos e diretórios. Somente o proprietário de um arquivo pode alterar suas permissões, mesmo que o grupo ou outros possuam direitos de escrita sobre o arquivo. O comando chmod tem a seguinte sintaxe: |
| |
| > ''chmod'' [//opções//] //permissões arquivo(s)// |
| |
| A definição das permissões pode ser feita de forma **simbólica** ou **octal**. A forma simbólica é a mais simples e por isso a mais usada por debutantes. A forma octal é no entanto mais empregada, sobretudo em scripts antigos. Neste texto vamos nos restringir à forma simbólica. As permissões na forma simbólica têm a seguinte sintaxe: |
| |
| > ''[u g o a] [+ - =] [r w x u g o X]'' |
| |
| As letras do primeiro grupo indicam de quem as permissões devem ser alteradas: |
| |
| * ''u'' : o usuário, proprietário do arquivo. |
| * ''g'' : o grupo proprietário do arquivo. |
| * ''o'' : outros (terceiros) |
| * ''a'' : todos (//all//) |
| |
| Os símbolos do segundo grupo indicam como os direitos devem ser alterados: |
| |
| * ''+'' : os direitos indicados devem ser adicionados |
| * ''-'' : os direitos indicados devem ser suprimidos |
| * ''='' : os direitos devem ser ajustados ao valor indicado |
| |
| Finalmente, as letras do terceiro grupo indicam que permissões devem ser alteradas: |
| |
| * ''r'' : permissão de leitura |
| * ''w'' : permissão de escrita |
| * ''x'' : permissão de execução (ou acesso ao diretório) |
| * ''X'' : permissão de execução, caso algum membro (''u'', ''g'', ''o'') já a possua |
| * ''u'' : usar as permissões já atribuídas ao usuário proprietário |
| * ''g'' : usar as permissões já atribuídas ao grupo proprietário |
| * ''o'' : usar as permissões já atribuídas a outros |
| |
| Vejamos alguns exemplos: |
| |
| * ''chmod o-w *.c'' : retira de terceiros a permissão de escrita sobre todos os arquivos C no diretório corrente. |
| |
| <code> |
| $ ls -l |
| -rw-rw-rw- 1 maziero prof 523 Mar 27 08:51 main.c |
| -rwxrwxrwx 1 maziero prof 2321 Mar 25 09:37 funct.c |
| |
| $ chmod o-w *.c |
| |
| $ ls -l |
| -rw-rw-r-- 1 maziero prof 523 Mar 27 08:51 main.c |
| -rwxrwxr-x 1 maziero prof 2321 Mar 25 09:37 funct.c |
| </code> |
| |
| * ''chmod go-rwx ~/*'' : retira do grupo e de terceiros todas as permissões (leitura, escrita, execução) sobre todos os arquivos do diretório ''home''. |
| |
| <code> |
| $ ls -l |
| -rw-rw-rw- 1 maziero prof 523 Mar 27 08:51 main.c |
| -rwxrwxrwx 1 maziero prof 2321 Mar 25 09:37 funct.c |
| -rw-r--r-- 1 maziero prof 75643 Mar 27 08:56 main.o |
| |
| $ chmod go-rwx ~/* |
| |
| $ ls -l |
| -rw------- 1 maziero prof 523 Mar 27 08:51 main.c |
| -rwx------ 1 maziero prof 2321 Mar 25 09:37 funct.c |
| -rw------- 1 maziero prof 75643 Mar 27 08:56 main.o |
| </code> |
| |
| * ''chmod u+w,go=r *.txt'' : dá ao usuário permissão de escrita e ajusta ao grupo e outros somente permissão de leitura sobre os arquivos ''*.txt'' do diretório corrente. Observe que as permissões podem ser agrupadas usando vírgulas: |
| |
| <code> |
| $ ls -l |
| -r--rw-rw- 1 maziero prof 2386 Mar 27 08:51 readme.txt |
| -rwxrwxrw- 1 maziero prof 12875 Mar 25 09:37 instal.txt |
| |
| $ chmod u+w,go=r *.txt |
| |
| $ ls -l |
| -rw-r--r-- 1 maziero prof 2386 Mar 27 08:51 readme.txt |
| -rwxr--r-- 1 maziero prof 12875 Mar 25 09:37 instal.txt |
| </code> |
| |
| O comando ''chmod'' possui uma opção interessante (''-R''), que permite atribuir permissões de maneira //recursiva//, ou seja, nos conteúdos dos subdiretórios. Assim, a melhor maneira de proteger seu diretório ''home'' dos olhares indiscretos de membros do seu grupo e de terceiros é executar o seguinte comando: |
| |
| <code> |
| chmod -R go-rwx ~ |
| </code> |
| |
| O uso do comando ''chmod'' em modo octal é similar ao modo simbólico, embora mais difícil. As expressões de permissão são substituídas por valores octais representando as permissões desejadas. Assim, se desejarmos atribuir as permissões ''<nowiki>rwxr-x---</nowiki>'' a um arquivo ''teste.c'', devemos considerar que ''<nowiki>rwxr-x---</nowiki>'' -> ''rwx'' ''r-x'' ''<nowiki>---</nowiki>'' -> 111 101 000 (binário) -> 7 5 0 (octal) -> 750. Desta forma, o comando a executar é: |
| |
| <code> |
| chmod 750 teste.c |
| </code> |
| |
| A definição de permissões em modo octal é bem menos flexível que a notação simbólica, mas ainda muito usada, por ser aceita em todos os sistemas Unix, mesmo os mais antigos. Além disso, sua compreensão é importante para o uso do comando ''umask''. |
| |
| ===== O comando umask ===== |
| |
| O comando ''umask'' permite definir uma //máscara padrão de permissões// para a criação de novos arquivos e diretórios. A sintaxe desse comando usa a notação octal, para definir as permissões a suprimir nos novos arquivos e diretórios, a partir das permissões máximas. Vejamos um exemplo: |
| |
| > ''r w x r - x - - -'' -> permissões desejadas para os novos arquivos |
| > ''- - - - w - r w x'' -> permissões a suprimir |
| > ''0 0 0 0 1 0 1 1 1'' -> permissões a suprimir, em binário (000, 010 e 111) |
| > '' 0 2 7 '' -> máscara de permissões, em octal |
| |
| Assim, o comando ''umask 027'' permite definir a máscara desejada (''<nowiki>rwxr-x---</nowiki>''). Normalmente esse comando é usado nos arquivos de configuração do shell, e nos scripts de instalação de aplicações. |
| |
| ===== Os comandos chown e chgrp ===== |
| |
| O comando ''chown'' permite a mudança do usuário proprietário de um arquivo. Somente o superusuário pode fazê-lo. O comando ''chgrp'' permite a permite a mudança do grupo proprietário de um arquivo. Somente o superusuário (//root//) e o usuário proprietário do arquivo podem fazê-lo. O proprietário só pode mudá-lo para um grupo ao qual ele também pertença. |
| |
| Exemplos: |
| |
| <code> |
| $ ls -l |
| drw------- 2 maziero prof 0 Mar 27 08:51 dir1 |
| |
| $ chown joao dir1 |
| |
| $ ls -l |
| drw------- 2 joao prof 0 Mar 27 08:51 dir1 |
| |
| $ chgrp labin dir1 |
| |
| $ ls -l |
| drw------- 2 joao labin 0 Mar 27 08:51 dir1 |
| </code> |
| |
| ===== O comando newgrp ===== |
| |
| Permite ao usuário mudar seu grupo principal para outro grupo ao qual ele também pertença. Todos os arquivos e diretórios criados a partir dessa mudança pertencerão ao novo grupo, e não mais ao grupo primário do usuário. Por exemplo: |
| |
| <code> |
| $ mkdir dir1 |
| |
| $ ls -l |
| drw------- 2 maziero prof 0 Mar 27 08:51 dir1 |
| |
| $ newgrp larsis |
| |
| $ mkdir dir2 |
| |
| $ ls -l |
| drw------- 2 maziero prof 0 Mar 27 08:51 dir1 |
| drw------- 2 maziero larsis 0 Mar 27 08:52 dir2 |
| </code> |
| |
| Para voltar ao grupo primário basta executar ''exit''. Para saber a quais os grupos primário e secundários do usuário basta executar o comando ''id''. |
| |
| ===== Exercícios ===== |
| |
| - Crie a seguinte estrutura de diretórios na sua area HOME: <code> |
| ~/infraComp/aula01 |
| |__ /aula02 |
| |__ /exercicios |
| |__ /aula03 |
| |__ /aula04 |
| |__ /aula05 |
| </code> |
| - Em cada diretório acima crie um arquivo chamado DATA, utilizando o comando ''touch''. |
| - Altere as permissões de acesso de seu diretório HOME para que somente você e os usuários do seu grupo tenham acesso de leitura e execução, e você tenha acesso de leitura, escrita e execução. |
| - Crie um diretório ''$HOME/mydir'' e ajuste suas permissões de forma que seus colegas consigam criar um arquivo nele. Crie um arquivo com seu nome no diretório correspondente do seu vizinho. |
| - Qual a diferença no resultado da execução dos dois comandos abaixo? <code> |
| cp teste teste.bak |
| mv teste teste.bak |
| </code> |
| - Qual a diferença entre executar e ler um diretório (permissões r e x)? |
| - Qual a diferença entre executar e ler um arquivo (permissões r e x)? |
| - Você conseguiria mudar o nome de seu próprio diretório //home//? Por que? |
| - Crie um arquivo ''teste'' com os direitos de acesso ''rw-rw-rw-'', e indique como usar o comando ''chmod'' para alterar seus direitos de acesso para: |
| * ''rw-rw-r--'' |
| * ''r-xr-xr-x'' |
| * ''rw-r--r--'' |
| * ''<nowiki>r--------</nowiki>'' |
| - Execute o comando ''umask'' para que novos arquivos criados no sistema tenham as permissões de acesso definidas a seguir, e teste as máscaras definidas criando novos arquivos (comando ''touch'') e diretórios (comando ''mkdir''). Finalmente, explique por que razão as permissões dos arquivos não coincidem com as esperadas, mas as dos diretórios sim. |
| * ''rw-rw-r--'' |
| * ''r-xr-xr-x'' |
| * ''rw-r--r--'' |
| * ''<nowiki>r--------</nowiki>'' |
| - Crie dois diretórios ''d1'' e ''d2'', com permissões respectivas ''<nowiki>r--r--r--</nowiki>'' e ''r-xr-xr-x'', e compare as possibilidades de acesso em ambos. É possível listar o conteúdo de ambos, estando fora deles? É possível entrar em ambos? |
| |