Personalização Coorporativa do Ubuntu - Problema com Script

Iniciado por strikermdd, 03 de Julho de 2009, 11:55

tópico anterior - próximo tópico

strikermdd

Olá pessoal, bem, trabalho em um órgão do governo, compramos máquinas novas sem sistema operacional, e para tal, estamos personalizando uma distribuição do Ubuntu 9.04 para que se encaixe no trabalho que necessitamos. Mas estamos com alguns problemas

Depois da instalação rodamos um script que irá personalizar o ambiente da maneira que precisamos, e dentre uma de nossas necessidades está a de montar dois compartilhamentos de rede via Samba durante o logon do usuário, o primeiro é o compartilhamento do Setor do Usuário, o segundo é um compartilhamento contendo os sistemas.

Citar
Ex. :
//servidor/setor
//servidor/sistemas

O código do script que chegamos mais ou menos é esse :
# Compartilhamento do Setor
# Checa
if [ -f /etc/init.d/compart.sh ] then

echo "Arquivo compart.sh já existe."
else
echo "/etc/init.d/compart.sh" >> /etc/rc.local
fi

# OBS. : Senhas com Caracteres Especiais ( ex.: ,./{][], etc ... ) possivelmente terão problemas, portanto evite-as.
echo "--------------------------- Compartilhamento do Usuário $USER -------------------------------------------" >> /etc/init.d/compart.sh
echo "mount -t smbfs //10.50.80.2/$SETOR /home/$USER/$SETOR -o username=$USER,password=$PASSWD,uid=$USER" >> /etc/init.d/compart.sh
# Compartilhamento de Sistemas
echo "mount -t smbfs //10.50.80.2/sistemas /home/$USER/Sistemas -o username=$USER,password=$PASSWD,uid=$USER" >> /etc/init.d/compart.sh
echo "---------------------------------------------------------------------------------------------------------" >> /etc/init.d/compart.sh
echo >> /etc/init.d/compart.sh

chmod +x /etc/init.d/compart.sh


Só que temos dois problemas com isso, Primeiro : O usuário comum não possui permissão de acessar os comandos de montagem ( mount umount ) e Segundo que com isso, cada vez que adicionamos mais usuários, todos os compartilhamentos serão montados, e todos terão acesso a compartilhamentos que não são deles.

Alguém tem alguma maneira melhor de que via script, possamos montar esses dois compartilhamentos de maneira amigável, e sem carregar vários compartilhamentos ao mesmo tempo, apenas os que o usuário possui direito.

OBS. : Usamos um Ambiente com usuários autenticados em LDAP e Compartilhamentos no Samba em um Servidor Centos 5.3

Quem puder ajudar agradeço desde já.

Até mais.

raidicar

#1
Olá colega.
Seu primeiro problema, que é os usuários não poder realizar a montagem devido a falta de permissão.
No sudoers você pode liberar permissão para o usuário executar o comando "sudo mount" sem senha:
echo "usuário ALL=NOPASSWD: /bin/mount" >> /etc/sudoers
echo "usuário ALL=NOPASSWD: /bin/umount" >> /etc/sudoers

Agora que a senha não é solicitada para o comando sudo mount efetuado pelo usuário, o seu uso é adequado a um script.
Isso resolveria o seu proplema de permissão para montar o compartilhamento, não?

Quanto ao segundo problema, tá meio que uma salada isso o script.
O correto é montar o compartilhamento depois do login, mas seu script roda antes do login.
Por que não usa um arquivo que é executado depois do login para fazer o mapeamento ou chamar o script que faça isso?
Um desses arquivos é o .profile que existe dentro da pasta home de todos os usuários, (/home/raidicar/.profile).

Se optar por utilizar o .profile para para chamar o script que cria o mapeamento, os passos seriam:
1 - Abrir o arquivo .profile do usuário e adicionar nele o comando compart.sh, ou seja, quando o usuário logar no sistema, seu .profile é executado e o mesmo chamaria o script compart.sh que será criado a seguir.
2 - Agora é preciso criar o script. ( onde foi definida a vaviavel $SETOR no seu script ??? Como não enxerguei, vou tratar como um diretório, ok? )
#!/bin/bash
sudo mount -t smbfs //10.50.80.2/$SETOR /home/$USER/SETOR -o username=$USER,password=$PASSWD
sudo mount -t smbfs //10.50.80.2/sistemas /home/$USER/Sistemas -o username=$USER,password=$PASSWD

Bem mais simples, né, altere conforme a necessidade.
Agora é salvar o script em /usr/bin com o nome de compart.sh e dar o comando chmod +x /usr/bin/compart.sh para torna-lo executável.
Sempre que um usuário fizer login, o .profile será executado e ele, por sua vez, irá chamar o compart.sh que efetuará o compartilhamento utilizando o sudo, e o comando mount foi liberado para ser excutado sem senha no sudoers quando usado em conjunto com o comando sudo.

Creio que isso resolve o seu problema de permissão e de montar apenas o compartilhamento do usuário que acessa o sistema.

Agora, pra mim, a solução ideal seria um script que durante a inicialização faça:
1 - Checagem e armazenamento do nome dos usuários que existem no sistema em uma variável.
2 - Verifique quais desses usuários tem um diretório com o seu nome em /home.
Se o usuário exixtir no sistema e tiver um diretório, o script fará uma pesquisa no .profile do usuário e no sudoers.
Ele irá inserir uma linha no sudoers que permita ao usuário executar sem a necessidade de digitar senha o comando sudo mount. Irá também, inserir as linhas de comando sudo mount -t smbfs //10...  dentro do .profile do usuário para ser executado durante o login. Caso o sudoers e o .profile já estejam corretos, o script não fará nada.
É um processo relativamente simples de ser feito, abaixo segue um script que bolei agora, Ele realiza essas tarefas, você precisa apenas fazer apenas duas coisas nele:
1 - Fazer com que seja executado durante a inicialização, que é o que está fazendo acima em seu script.
2 - Alterar a parte em negrito das linhas 22 e 23 do script conforme sua necessidade, Essas são as linhas que criam o mapeamento.
echo "sudo mount -t smbfs //10.50.80.2/setor /home/$procura1/SETOR -o username=$procura1,password=$PASSWD" >> /home/$procura1/.profile
echo "sudo mount -t smbfs //10.50.80.2/sistemas /home/$procura1/Sistemas -o username=$procura1,password=$PASSWD" >> /home/$procura1/.profile
Cuidado para não alterar a variável $procura1, não mexa nela.
Segue abaixo o script:

#!/bin/bash
loop1=1
loop2=1
start=1
end=0
endloop2=`ls /home | wc -l`
endloop1=`getent passwd | cut -d \: -f1 | wc -l`
procura1=`getent passwd | cut -d \: -f1 | grep -n ^ | grep ^$loop1: | cut -d: -f2`
countloop=1
endloop1=`expr $endloop1 + $countloop`
until [ $start = $end ]; do
 procura1=`getent passwd | cut -d \: -f1 | grep -n ^ | grep ^$loop1: | cut -d: -f2`
 loop1=`expr $loop1 + $countloop`
 procura2=`ls /home | cut -d \: -f1 | grep -n ^ | grep ^$loop2: | cut -d: -f2`
   if [ $procura1 = $procura2 ]; then
     procsudo1=`grep "$procura1 ALL=NOPASSWD: /bin/mount" /etc/sudoers`
     procprof1=`grep "sudo mount" /home/$procura1/.profile`
       if [ ${#procsudo1} -lt 2 ]; then
         echo "$procura1 ALL=NOPASSWD: /bin/mount" >> /etc/sudoers
       fi
       if [ ${#procprof1} -lt 2 ]; then
         echo "sudo mount -t smbfs //10.50.80.2/setor /home/$procura1/SETOR -o username=$procura1[/color],password=$PASSWD" >> /home/$procura1/.profile
         echo "sudo mount -t smbfs //10.50.80.2/sistemas /home/$procura1/Sistemas -o username=$procura1,password=$PASSWD" >> /home/$procura1/.profile
       fi
   fi
 if [ $loop1 = $endloop1 ] && [ $loop2 = $endloop2 ]; then
   start=0
   end=0
 fi
 if [ $loop1 = $endloop1 ]; then
   loop1=1
   loop2=`expr $loop2 + $countloop`
 fi
done


ps: Apesar de ser um script simples de pouca complexabilidade, teste-o direito. pois eu só o testei superficialmente. Sempre faça backup dos arquivos importantes de altera-los, como o .profile e o sudoers.
Se estiver tudo certo, não deixe de inserir [RESOLVIDO] no título do tópico.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

rfadigas

Boa tarde Raidicar,

Desculpe o abuso nesse post gigante mas, estou com a mesma dúvida do strikermdd, peguei o seu codigo e testei-o antes de usá-lo na inicialização de um usuário. Ele apresentou erros que eu queria lhe apresentar aqui, e se possível, gostaria que você explicasse cada parâmetro usado em cada uma das linhas e o porquê deles serem usados. E, também, analisasse o resultado da execução do arquivo, de modo a sanar as minhas dúvidas. Lhe agradeço desde já.

OBS1: Na máquina de teste, só fiz logon com três usuários do AD. Todos com privilégios administrativos.

Aqui estão as mensagens de erro apresentados no terminal depois de vários minutos com o arquivo em execução.

/$ ./usr/bin/compart.sh
grep: /etc/sudoers: Permissão negada
./usr/bin/compart.sh: line 19: /etc/sudoers: Permissão negada
./usr/bin/compart.sh: line 22: /home/[usuario_teste1]/.profile: Arquivo ou diretório inexistente
./usr/bin/compart.sh: line 15: [: muitos argumentos
grep: /etc/sudoers: Permissão negada
./usr/bin/compart.sh: line 19: /etc/sudoers: Permissão negada
./usr/bin/compart.sh: line 15: [: muitos argumentos
grep: /etc/sudoers: Permissão negada
./usr/bin/compart.sh: line 19: /etc/sudoers: Permissão negada
./usr/bin/compart.sh: line 22: /home/[usuario_teste2]/.profile: Arquivo ou diretório inexistente
./usr/bin/compart.sh: line 15: [: muitos argumentos

Abaixo segue como está o meu arquivo compat.sh com as modificações e o porquê das modificações. (AS LINHAS FORAM NUMERADAS PARA FACILITAR O COMPARATIVO DO RESULTADO ACIMA COM O CÓDIGO EXECUTADO)

Modificações realizadas em relação ao código que disponibilizou no último post:

1°) Linhas 16 e 17, foi acrescentado o comando "sudo"  antes do "grep" devido ao erro acima mostrando "Permissão  negada" na linha 19. Supus que esse erro é referente às linhas citadas já que entendi que ambas escrevem dentro dos arquivos sudoers e ./profile;

2°) Estou fazendo autenticação no AD via Winbind, Samba e SSH, então é criado um diretório com o nome do meu domínio dentro do /home. Com isso, incluí o nome do domínio no código em cada linha onde o /home era citado.

3°) A última modificação foi na linha 22 onde deixei-a de acordo como deve ser aqui no meu ambiente. Apaguei a linha logo abaixo desta que seria a 23 porque só quero, inicialmente, mapear um compartilhamento. Se funcionar, incluirei os demais necessários.

1-)  #!/bin/bash
2-)  loop1=1
3-)  loop2=1
4-)  start=1
5-)  end=0
6-)  endloop2=`ls /home/DOMINIO | wc -l`
7-)  endloop1=`getent passwd | cut -d \: -f1 | wc -l`
8-)  procura1=`getent passwd | cut -d \: -f1 | grep -n ^ | grep ^$loop1: | cut -d: -f2`
9-)  countloop=1
10-) endloop1=`expr $endloop1 + $countloop`
11-) until [ $start = $end ]; do
12-)  procura1=`getent passwd | cut -d \: -f1 | grep -n ^ | grep ^$loop1: | cut -d: -f2`
13-)  loop1=`expr $loop1 + $countloop`
14-)  procura2=`ls /home/DOMINIO | cut -d \: -f1 | grep -n ^ | grep ^$loop2: | cut -d: -f2`
15-)    if [ $procura1 = $procura2 ]; then
16-)      procsudo1=`sudo grep "$procura1 ALL=NOPASSWD: /bin/mount" /etc/sudoers`
17-)      procprof1=`sudo grep "sudo mount" /home/DOMINIO/$procura1/.profile`
18-)        if [ ${#procsudo1} -lt 2 ]; then
19-)          echo "$procura1 ALL=NOPASSWD: /bin/mount" >> /etc/sudoers
20-)        fi
21-)        if [ ${#procprof1} -lt 2 ]; then
22-)          echo "sudo mount -t smbfs //SERVER/DIRETORIO /home/DOMINIO/$procura1/DIRETORIO -o username=$procura1[/color],password=$PASSWD" >> /home/$procura1/.profile
23-)        fi
24-)    fi
25-)  if [ $loop1 = $endloop1 ] && [ $loop2 = $endloop2 ]; then
26-)    start=0
27-)    end=0
28-)  fi
29-)  if [ $loop1 = $endloop1 ]; then
30-)    loop1=1
31-)    loop2=`expr $loop2 + $countloop`
32-)  fi
33-) done

PERGUNTAS:

1ª) Eu entendi alguns comentários feitos no post anterior a respeito do que o código deveria fazer, mas gostaria de entender, detalhadamente, o uso dos parâmetros, etc. Você poderia explicar as linhas 6, 7, 8, 10, 12, 16, 17 e 18?

2ª) Diante do resultado da execução do arquivo acima e considerando que o mesmo demorou muito para concluir a sua execução, pergunto: ele entrou em loop e não conseguiu sair ou meus dados de usuários no AD são muito extensos e por isso, a demora do mesmo já que o "getent" busca todos os usuários cadastrados no AD?

Mais uma vez agradeço, antecipadamente, a sua atenção e colaboração.

Rodrigo.
Analista de Suporte
Salvador-BA
71-9963-0855