Permissões Especiais para para Arquivos e Diretórios no Linux

Outro dia eu necessitava, através de uma rotina, gravar arquivos em diretórios em que não tinham poder para tanto. Para isto, eu necessitava de algum recurso que mudasse minhas atribuições de usuário, somente durante a execução do shell script, para poder realizar a gravação. Eu já tinha realizado tarefas semelhantes (a muitos anos atraz), e sabia que seria através do comando chmod que teria esta possibilidade, mas não me lembrava como. Lendo o livro Programação Shell Script - Júlio Cezar Neves - Pag. 274 encontrei o que buscava, portanto tentarei repassar aqui o que li lá.

Seguirei, como exemplo, meu problema para tentar na prática explicar o recurso. A estrutura de pastas aqui na Câmara Municipal de Timóteo - MG (conforme já citado em outro tópico aqui) permite leitura/escrita/e execução apenas para o dono da pasta, e restrição total aos outros usuários. E se alguém quiser copiar um arquivo diretamente para este usuário? De forma normal não seria possível, já que a pasta teria a seguinte permissão como exemplo:

$ ls -ld /home/cristiano/
drwx------  52 cristiano cpd 4096 2006-08-30 14:38 /home/cristiano/

Bem, confeccionamos uma rotina que se chama transfere, que faria as consistências de existência do arquivo, existência de pasta de destino, entre outras tantas consistências e ao final executamos:

$ chmod 755 transfere
$ ls -l transfere
-rwxr-xr-x  1 root root 10458 2006-08-30 17:34 transfere

Só que (apesar da rotina ser executável por qualquer usuário) durante sua execução recebo a seguinte mensagem de erro:

bash-2.05b$ transfere

Informe o nome (com percurso) do arquivo de origem: /home/cristiano/teste

Informe o diretório de destino do arquivo: /home/luciano

Deseja mudar DONO e GRUPO do arquivo (S/n)? n

Favor informar:


1 - Para copiar o arquivo
2 - Para mover o arquivo

Informe sua opção - 1

cp: impossível fazer stat em `/home/luciano/transfere': Permissão negada
bash-2.05b$

Para solucionar o problema vamos usar novamente o chmod desta vez de forma correta:

$ chmod 4744 transfere             # Observe que o chmod tem 4 algarismos para determinar permissão
$ ls -l transfere
-rwsr-xr-x  1 root root 10458 2006-08-30 17:34 transfere  #agora observa a permissão do arquivo.

Ao executar a rotina agora (e somente durante sua execução) o shell estará com os poderes de dono alterados para o root (já que o dono do arquivo em questão é o root) podendo então transferir um arquivo da minha pasta para a pasta de qualquer usuário.

Vale lembrar que o número adicional no chmod segue as seguintes regras:

bit Função Exemplo
1 Stick bit chmod 1??? /caminho/arquivo
2 Group-id bit chmod 2??? /caminho/arquivo
4 User-id bit chmod 4??? /caminho/arquivo

Onde: ??? é qualquer combinação normal usado no chmod

Quando um programa esta com o Stick bit ligado, ele não sai da memória, nem faz paginação, devendo ser usado com parcimónia e somente em rotinas frequentemente usadas por muitos usuário simultaneamente.

O Group-id bit comporta-se da mesma forma do User-id bit , exceto que o usuário, durante a execução de um programa com o bit em questão ligado, passa ter todos os direitos do grupo ao qual pertence este arquivo de programa.

E, obviamente, podemos ligar mais de um destes bits simultaneamente obedecendo exatamente a mesma regra para o chmod normal, sendo:

$ chmod 6755 transfere  # composição do primeiro bit = 4 (User-id bit) + 2 (Group-id bit)
$ ls -l transfere
-rwsr-sr-x  1 root root 10458 2006-08-30 17:34 transfere*

Dica:

  • Por fim entenda que não são todas as distros que aceitam tal recurso em shell's scripts.
  • Para as distros que não aceitam é necessário fazer um programa em C que chamará a rotina que deseja-se executar passando-lhe os parametros devidos, e aplicar o chmod no programa em C.



Por:

Cristiano L. Campos
Analista
CMTimóteo - MG

Última modificação 13 anos atrás Última modificação em 31/08/2006 14:35:34
 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.