[gitec] Permissões especiais de shell

"Cristiano (CMTimóteo - MG)" cpd at camaradetimoteo.mg.gov.br
Wed Aug 30 14:57:47 BRT 2006


Bom gente, boa tarde!!!

Outro dia enviei a lista um email com uma duvida sobre permissões 
especiais. A questão era se alguem sabia que permissão deveria definir a 
um arquivo para que ele durante a execução tivesse poderes de outro 
usuário (root, por exemplo) e não o que estivesse executando. Bem, achei 
a solução e vou compartilhar com os amigos (para quem quiser ler mais 
detalhadamente esta no livro Programação Shell Script - Julio Cezar Neves).

Seguindo meu exemplo, as pastas de usuário (aqui na CMTimóteo) tem 
permissão de leitura/escrita/e execução apenas para o dono da pasta. 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:

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

Bem, eu criei uma rotina que se chama transfere e ao final executei

$ 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 a 
execução da rotina recebo como erro não ter acesso a pasta do usuário 
que desejo enviar um arquivo. Então segue como contornar o problema.

$ 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 esta rotina (e somente durante sua execução) o shell terá os 
poderes de dono alterados para o root (já que o dono do arquivo é 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:

1      Stick bit
2      Group-id bit
4      User-id bit

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 /usr/bin/transfere*

Por fim entenda que não são em todas as distros que aceitam tal recurso 
em shell's scripts. Para as distros que não aceitam tal recurso é 
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

-- 
[]'s

Cristiano Lage Campos
Analista - C.P.D.
CMTimóteo - MG
(31)3847-4093
(31)9304-0665

Mensageiro: cristiano 
Msn: cristiano_lc at msn.com
JABBER ID: clcampos at jabber.org



Mais detalhes sobre a lista de discussão Gitec