Os nove primeiros bits são detalhados a seguir:
Para modificar os direitos de acesso dos arquivos, deve-se utilizar o comando shell chmod. Existem uma série de opções para esse comando, as quais podem ser visualizadas via man. Algumas opções mais usadas são as seguintes:
Exemplo:
Muitas vezes, durante a utilização de primitvas de I/O
(entrada/saída), às vezes é necessário indicar os direitos de acesso
associados ao arquivo, utilizando-se para isso um valor inteiro
associado obtido da conversão do valor binário em octal. Por exemplo,
para ter a autorização de leitura, escrita e execução pelo
proprietário e pelo grupo, e a autorização de leitura e execução pelos
outros, deve utilizar o seguinte código durante uma chamada da rotina
de criação do arquivo :
1111111101 em binário que é equivalente a 775 em octal
Nos 7 bits restantes do número usado pelo nó de indexação, dois são associados a modificação do ID do usuário (bit 11 set-uid), e a modificação da identificador do grupo (bit 10 set-gid). Quando o bit 11 (respectivamente 10) é posicionado em 1, o indicador de permissão de execução para o proprietário (respectivamente, grupo) visualizado pelo comando ls está em s (veja o próximo exemplo). Seja o exemplo de um programa tendo o bit s (s para set-uid-bit) colocado em 1 (setado para o proprietário. Na execução deste programa, o usuário efetivo é mudado para o proprietário do arquivo contendo o programa. Uma vez que o usuário efetivo que determina os direitos de acesso (ver 1.4.3), isto vai permitir ao usuário de liberar temporariamente o direitos de acesso de qualquer um outro. Este observação se aplica também aos identificadores de grupo. É este mecanismo que permite a todo o usuário de modificar o arquivo /etc/passwd, mesmo sendo o root é o proprietário, através do comando shell passwd(). O bit s é colocado em 1 para o arquivo de referência /bin/passwd contendo o programa realizando este comando.
A primitiva system() permite a execução de um comando shell dentro de um programa e será mais detalhada nos próximos capítulos.
Exemplo:
/* arquivo test_s.c */ #include <errno.h> #include <stdio.h> #include <stdlib.h> int main() { FILE * fp; system("echo Meu login e: $LOGNAME"); printf("Vou tentar abrir o arquivo /home/saibel/teste\n"); if((fp=fopen("/home/saibel/teste","w+")) == NULL ) perror("Error fopen()"); else printf ("O arquivo teste esta aberto\n"); exit(0); }
Resultado da execução:
Seja saibel o proprietário do arquivo test_s conectado à máquina euler. Um arquivo teste é criado através do programa test_s), sendo que par défaut no sistema usado, somente para o proprietário do arquivo são assegurados os direitos de leitura e escrita deste arquivo. Considere agora que existe um usuário usertest, conectado à máquina lyapunov, do mesmo grupo de trabalho de saibel, que tenta abrir o arquivo teste, utilizando o programa test_s, o qual não lhe pertence (note que não há obriagatoriedade que ambos os usuários estejam conectados sob diferentes máquinas para que o exemplo seja executado; isso foi feito nesse exemplo devido a forma de visualização do prompt utilizada par défaut no sistema).
euler:~> chmod g+w test_s euler:~> ls -la test_s -rwxrwxr-x 1 saibel prof 12333 Sep 25 10:08 test_s* euler:~> test_s Meu login e: saibel Vou tentar abrir o arquivo /home/saibel/teste O arquivo teste esta aberto euler:~> ls -la /home/saibel/teste -rw-r--r-- 1 saibel prof 0 Sep 25 10:16 /home/saibel/teste lyapunov:~> test_s Meu login e: usertest Error fopen(): Permission denied
Evidentemente a tentativa do usuário usertest irá fracassar, uma vez que ele não possui direito de acesso ao arquivo /home/saibel/teste.
Agora, saibel vai colocar em 1 o bit s do programa test_s, continuando entretanto, a deixar interditado o acesso ao arquivo teste aos outros usuários do grupo.
euler:~> chmod u+s test_s euler:~> ls -al test_s -rwsrwxr-x 1 saibel prof 12337 Sep 25 10:28 test_s* lyapunov:~> /home/saibel/test_s Meu login e: usertest Vou tentar abrir o arquivo /home/saibel/teste O arquivo teste esta aberto
O usuário usertest executando o programa /home/users/saibel/test_s, deverá conseguir desta vez abrir o arquivo teste. Na verdade, graças ao bit s, usertest foi assumiu a identidade do proprietário do arquivo test_s durante sua execução.
Observação: Em alguns sistemas (como no caso do Laboratório de Engenharia de Computação do LECA), a operação de mudança de identidade do usuário durante a execução de um programa (do qual ele não é proprietário) não é permitida por razões de segurança. Assim, a saída gerada em nosso sistema será:
lyapunov:~> /home/saibel/test_s /home/saibel/test_s: Operation not permitted.
Resumindo, pode-se dizer que um processo tem o direito de acesso a um arquivo se: