CI066 - Oficina de Programação
Notas de Aula # 03

Prof. Armando Luiz N. Delgado

1 Manipulação de Arquivos e diretórios

1.1 Usuários e Segurança em Arquivos

Usuários em um sistema UNIX possuem uma identificação numérica única denominada UID (User IDentification) e um nome simbólico único conhecido como Login ou Username.

Também são definidos em um sistema UNIX os chamados grupos. Cada grupo representa um conjunto de usuários que por alguma razão possuem uma função ou atividades em comum (por exemplo, usuários que são alunos de graduação, usuários que são professores, etc.).

Cada grupo em um sistema UNIX possui também uma identificação numérica única denominada GID (Group IDentification) e um nome simbólico único conhecido como Group name ou simplesmente Grupo.

Estes conceitos são importantes para entender como um sistema UNIX controla a forma com que arquivos podem ser acessados e o que se pode se fazer com eles uma vez acessados. Você pode, por exemplo, desejar que o conteúdo de um determinado arquivo possa ser alterado apenas por você que o criou. Por outro lado você pode fazer com que um outro arquivo tenha seu conteúdo lido por qualquer usuário no sistema.

O comando id(1) pode ser usado para se determinar a identificação completa de um usuário: seu UID e GID.

1.2 Permissões de acesso

Quando um arquivo qualquer é criado em UNIX, ele é dito ter um Proprietário e um Grupo. O Proprietário do arquivo (também referenciado como owner ou user) corresponde ao Login do usuário que criou o arquivo. O Grupo do arquivo corresponde ao Grupo ao qual pertence o usuário que o criou. Por exemplo, se o usuário ci066, registrado como sendo do grupo especial cria um arquivo, dizemos que este pertence ao Proprietário ci066 e ao Grupo especial.

O acesso a arquivos UNIX é definido através de 3 conjuntos de permissões: um conjunto para Proprietário do arquivo, um conjunto para Grupo do arquivo e um conjunto para Outros usuários.

Cada conjunto pode assumir as permissões de Leitura (representada pela letra r), Escrita (representada pela letra w) e Execução ou Navegação (representada pela letra x).

Em se tratando de um arquivo regular, a permissão de Leitura significa que se pode ler o conteúdo do arquivo, a permissão de Escrita significa que se pode alterar (editar) o conteúdo do arquivo, e a permissão de Execução significa que este arquivo contém um programa ou um script shell, podendo ser executado como um comando.

Em se tratando de um diretório, a permissão de Leitura significa que se pode ler o conteúdo do diretório (por exemplo com ls(1)), a permissão de Escrita significa que se pode criar ou remover arquivos do diretório, e a permissão de Execução significa que este diretório é navegável, isto é, pode-se navegar para ele ou através dele com comandos como cd, pushd, popd ou find(1).

NOTA:

Em UNIX, QUALQUER RECURSO EXTERNO É TRATADO COMO UM ARQUIVO. Existem assim diferentes tipos de arquivos: regulares, diretórios, links simbólicos, arquivos associados a recursos de arquivos associados a recursos de comunicação entre programas (sockets, pipes e fifos), e arquivos associados a recursos de hardware (tais como disco, interface de rede, teclado e terminal, etc.). Assim, a permissão de Escrita em um diretório significa alterar o arquivo que representa um diretório, o que significa efetivamente criar e remover arquivos.

As permissões de acesso podem ser definidas a qualquer hora por chmod(1) e podem ser visualizadas através de ls(1) usando-se a opção -l. Seja, por exemplo:

                ci066@talisker $ ls -l teste.c
                -rw-r--r-- 1 ci066 especial  2331 Mai 30 11:36 teste.c
                ci066@talisker $ ls -l a.out
                -rw-r-x--- 1 ci066 especial  2331 Mai 30 11:36 a.out
                ci066@talisker $ ls -ld LabNum2
                drwxr-xr-- 1 ci066 especial  2331 Mai 30 11:36 LabNum2

No exemplo acima, o arquivo teste.c possui permissão de Leitura e Escrita para o Proprietário do arquivo (usuário ci066), apenas permissão de Leitura para usuários do Grupo do arquivo (grupo especial), e apenas permissão de Leitura para Outros usuários.

Ainda no exemplo acima, o arquivo a.out possui permissão de Leitura e Execução para Proprietário e Grupo, Escrita apenas para Proprietário, e NENHUMA permissão para Outros usuários. Assim, a.out pode ser executado como um comando apenas pelo usuário ci066 e por usuários do grupo especial.

Finalmente, todos os usuários tem permissão para listar o conteúdo do diretório LabNum2. Por outro lado, apenas o usuário ci066 e os usuários do grupo especial tem permissão para navegar para ou através deste diretório. Somente o usuário ci066 tem permissão para criar arquivos dentro do diretório.

1.3 Permissões de acesso: Notação octal

As permissões de acesso de um arquivo podem ser representadas de uma forma mais compacta, usando uma notação de 3 DÍGITOS OCTAIS. Esta forma compacta de representar as permissões é referenciada em UNIX como FILE MODE (modo do arquivo ou simplesmente MODO).

Em um MODO, cada dígito corresponde a um grupo de permissões: O primeiro dígito corresponde às permissões do Proprietário, o segundo dígito corresponde às permissões para o Grupo e o terceiro dígito corresponde às permissões para Outros Usuários.

Cada dígito octal do modo é definido pela soma dos valores octais abaixo:

                4 = permissão de Leitura
                2 = permissão de Escrita
                1 = permissão de Execução/Navegação

Assim, a permissão r-xr--wx pode ser representada pelo Modo 543:

                5 ( = 4 + 1) representa permissão  de Leitura e Execução para Proprietário;
                4 representa unicamente a permissão de Leitura para Grupo;
                3 ( =  2 + 1) representa permissão de Escrita  e Execução para Outros.

1.4 Alterando as permissões de um arquivo: chmod(1)

Para alterar as permissões com chmod(1) pode ser usado um Modo (notação octal) ou notação simbólica ([augo][+-=][rwx]) para especificar a mudança de permissões:

                chmod 754 teste.c  (equiv. a chmod u=rwx,g=rx,o=r teste.c)
                chmod 664 teste.c  (equiv. a chmod ug=rw,o=r teste.c)
                chmod u+r,go+r,go-wx teste.c

1.5 Permissão padrão com umask(1)

Em UNIX, quando um arquivo é criado, ele inicia com as seguintes permissões:

666 ( rw-rw-rw )
para arquivos regulares não-executáveis (por exemplo, arquivos criados com gedit(1));
777 ( rwxrwxrwx )
para arquivos regulares executáveis (por exemplo, programas gerados por um compilador PASCAL ou C);
777 ( rwxrwxrwx )
para diretórios.

Deste estado inicial de permissões, UNIX subtrai o valor da MÁSCARA DE PERMISSÕES DO USUÁRIO. Esta máscara é um MODO (permissões em notação octal) no qual você indica quais permissões devem ser negadas ou restringidas.

Para definir esta máscara de permissões usa-se o comando umask (bash(1)). A sintaxe do comando é:

             umask modo
     ou
             umask simbol
     ou
             umask
onde modo (notação octal) e simbol (notação simbólica como em chmod(1)) indicam quais as permissões que se quer restringir ou negar. Sem argumentos, umask(1) mostra qual a máscara de permissões que está válida no momento. No caso da notação simbólica, o usuário indica as permissões que ele deseja manter, acrescentar ou retirar.

Como exemplo, suponha que você tenha definido a máscara 023 usando umask, e que você tenha criado o programa fonte em linguagem PASCAL (arquivo regular) prog.p com um editor de texto.

As permissões finais deste arquivo serão resultado da permissão 666 (que UNIX tenta atribuir por default a arquivos regulares não-executáveis) com restrição nas permissões indicadas na máscara (no exemplo, 023 = - - - -w- -wx). O resultado final será que o arquivo prog.p terá a permissão 644 ( rw-r- -r- - ).

Ainda neste exemplo, ao se compilar o programa fonte que está em prog.p, será gerado um arquivo chamado prog que é o programa executável. As permissões finais deste arquivo serão resultado da permissão 777 (que UNIX tenta atribuir por default a arquivos regulares executáveis) com restrição nas permissões indicadas na máscara (no exemplo, 023). O resultado final será que o arquivo prog.p terá a permissão 754 ( rwxr-xr- - ).

ATENÇÃO:

umask não muda permissões de arquivos já existentes. A alteração da máscara afeta APENAS os arquivos criados APÓS a execução de umask. Para alterar permissões de arquivos já existentes, use chmod(1).

2 Encontrando arquivos: find(1)

SINTAXE:     find rota_de_diretório critério_de_procura ação

Procura em um conjunto de arquivos e/ou diretórios (rota_de_diretório) por arquivos que tenham características definidas por um critério de procura, e executa uma ação para cada arquivo encontrado.

Exemplo 1:

ci066@dupond:~find ~ci066 -name jan83 -print
/home/esp/ci066/LabNum4/docs/jan83

Neste exemplo:

rota_de_diretório: ~ci066

critério de procura: -name jan83

ação: -print

Exemplo 2:

ci066@dupond:~find ~ci066 ~ -perm -033 -atime -2 -exec chmod go-rwx {} $\backslash$;
ci066@dupond:~ 

Neste exemplo:

rota_de_diretório: ~ci066 e ~

critério de procura: -perm -033 -atime -2 (arquivos acessados nos últimos 2 dias E que tenham permissão de Escrita E Execução para Grupo e Outros)

ação: -exec chmod go-rwx {} $\backslash$; muda a permissão dos arquivos que correspondem ao critério de procura.

Observe o uso de {} para representar em find(1) os arquivos selecionados pelo critério de procura.

Exemplo 3:

ci066@dupond:~find ~ci066 $\backslash$( -name '*-8' -o -name '*~' -o -name 'jan[0-9]*' $\backslash$) -exec rm {} $\backslash$;
/home/esp/ci066/LabNum4/docs/jan83

Neste exemplo:

rota_de_diretório: ~ci066

critério de procura: . Este critério indica que os nomes dos arquivos que devem ser encontrados devem terminar com -8 OU ~ OU começar com jan seguido de um dígito de 0 a 9.

Observe que:

ação: -rm {} $\backslash$; remove cada arquivo selecionado pelos critérios de procura.

Observe o uso de {} para representar em find(1) os arquivos selecionados pelo critério de procura, e de $\backslash$; para indicar o final da opção -exec.

Bibliografia

urlstyle



Armando Luiz Nicolini Delgado
2008-07-11