Não tinha nada o que fazer e resolvi “tentar” adiantar meu próprio lado criando um pequeno shell script para conectar em um servidor em que, de vez em nunca, preciso restaurar ou copiar alguns arquivos de backups da rede ( … tipo naquelas… de uma vez por ano ou uma vez na vida e outra na morte… quando o chefe quer as “fotos da festa de mil novecentos e lá vai bolinha”… ) … sabe como é, existem momentos que ficamos “ociosos”!
Pois bem, o script é muito simples e pode ser útil para diversas outras opções além de “copiar” fotos para seu superior ou para aquela garota que sempre está “incomodando” o cara de T.I. ;-).
O ambiente é simples:
Tenho um servidor Windows 2000 Server, com algumas pastas compartilhadas no AD (com restrições de acesso, leitura e escrita, onde cada usuário possui permissões diferentes: login e senha).
O endereço do servidor é 192.168.0.100, e as pastas compartilhadas, digamos que sejam F, G, H, Informatica, X e Z.
Como não quero utilizar a interface gráfica para isto e quero utilizar um terminal, a “temida” linha de comando (escovando bits no CLI), a maneira mais chata, e a princípio, parecendo a mais rápida, seria fazer isto aqui:
mkdir /media/W2KServer && mkdir /media/W2kServer/F
mount -t cifs -o username=jeferson,password=minhasenhasecreta,gid=users,iocharset=utf8,rw,users,file_mode=0777,dir_mode=0777 //192.168.0.100/F /media/W2kServer/F
Sinceramente, esta não é uma boa ideia, ainda mais que meu usuário e senha, ficaram gravados nos históricos de comandos do bash, e se eu levantar da mesa por um minuto, chegar alguém e ficar por um tempinho em minha sessão aberta, logo poderá ter tais dados muito facilmente.
Ainda bem e para minha própria segurança, posso usar a opção credentials e indicar um arquivo que contém meu usuário e senha, e nisto, não fica a senha a Deus dará… vejam:
mount -t cifs -o credentials=/root/.smb-credents,gid=users,iocharset=utf8,rw,users,file_mode=0777,dir_mode=0777 //192.168.0.100/F /media/W2kServer/F
O ‘pulo do gato’ se dá na criação do arquivo /root/.smb-credents. E o conteúdo do arquivo ser semelhante a este modelo:
username=jeferson
password=minhasenhasecreta
Com isto, resolvo meu problema de segurança de informações pertinentes a meu usuário e senha, mas… Todas as vezes que eu precisar mapear apenas uma unidade na rede, terei que fazer estes passos de criação e montagem de diretórios?
Não é mais fácil colocar tudo no /etc/fstab e pronto?
E se eu ter mais diretórios para mapear, também terei que repetir todos estes comandos para cada unidade de rede presente no servidor que pretendo acessar?
Calma pequeno padawan… paciência é uma virtude!
Não quero ficar digitando estes comandos, toda as vezes que eu precisar acessar tais pastas e creio que você também não. Então, depois de criado o /root/.smb-credents, vamos criar nosso primeiro script para começarmos a automatizar o processo. Criei o arquivo /bin/map.sh, contendo os comandos para montar os diretórios do servidor “SMB“:
http://paste.archlinux-br.org/1351
Veja que não temos nenhum tipo de controle neste arquivo… não há verificação da existência de conexão com o servidor; não verifica a existência dos diretórios necessários a montagem das unidades (/media/W2kServer/?) e muito menos, se há automação de todos estes processos… então, pensei em melhorar isto com a criação de um último script, que se valerá do /bin/map.sh.
O batizei de mapping.sh e o que ele faz exatamente o que o título do post indica:
- Verifica se há conexão de rede e se o servidor com o qual quer se conectar, está ‘ouvindo’ (ou de ‘pé’, como preferir);
- Havendo conexão, ele criará a estrutura necessária para a conexão no diretório /media e por fim;
- Mapeará as pastas disponíveis no servidor, tornando-as acessíveis ao meu usuário.
Para isto, a primeira parte do script definirá uma Variável ( LREAD ):
LREAD=/tmp/lread.pid
LREAD, aponta para um arquivo que ainda não existe (/tmp/lread.pid) , mas que será essencial para o funcionamento de nosso pequeno notável.
Como sei o endereço IP de nosso servidor, e que este endereço nunca mudará, ou não mudará tão cedo até que eu decida que ele mude (forte isto.. neh? xD), utilizo o comando ping, verificando se tal host está visível na rede interna:
ping -c 1 192.168.0.100
O ping com a opção “-c 1“, irá enviar apenas uma requisição solicitando resposta de tal host. O servidor, respondendo, teremos uma saída de informação que se diferencia da saída de erro deste, e isto, nos traz a possibilidade de ‘moldar’ ações, conforme os resultados se apresentem.
Resolvi então, concatenar e “filtrar o resultado” analisando suas diferenças (o caso do comando ping, irá sempre mostrar em suas saídas a ‘palavra’ “icmp_seq=1“), conseguindo isto com ajuda do comando grep. Aproveitando, concateno mais uma vez o resultado, utilizando-se agora do do comando “cut“, veremos que na coluna (carácter) 27, temos números que se diferenciam, trazendo possibilidades, vejam:
O erro nos mostraria a seguinte mensagem:
From 192.168.0.2 icmp_seq=1 Destination Host Unreachable
Caso o servidor estiver funcionando e aceitando conexões, nos mostraria isto:
64 bytes from 192.168.0.100: icmp_seq=1 ttl=128 time=3.43 ms
Em meu caso específico, se houver erro, a coluna 27, me trará o valor 1 no campo ‘icmp_seq’, pelo simples motivo do endereço IP do host que uso, seu último octeto estar abaixo do decimal 10, tendo apenas hum (1) numeral: 192.168.0.2.
Já se houver conexão e resposta, por causa do IP “pingado” ser 192.168.0.100, a coluna 27 da saída do comando ping -c 1 192.168.0.100 | grep icmp_seq=1 | cut -c27 seria o caracter numérico 0, provindo do último octeto do número IP (100).
Então peguei o resultado disto (0 ou 1) e redirecionei para nossa variável LREAD (lembram-se dela, no começo de nossa história? Pois é…).
ping -c 1 192.168.0.100 | grep icmp_seq=1 | cut -c27 > $LREAD
Um passo importante…
Poderiamos utilizar-se do cat, mas neste caso, eu não precisaria declarar a variável LREAD, e prá deixar a coisa mais “bonita”, preferi utilizar-me do ’sobrenatural’ while read para ler o conteúdo do arquivo contido na primeira variável e transformá-lo em uma String lógica temporária. Para isto….
VRF=`while read LN; do echo $LN ; done < $LREAD`
Hehehe…condições… o restante é história, e em um shell script começa a mágica com o uso de if, then, else if, else, fi:
if [ $VRF == 1 ] ; then
Aqui, estou dizendo o seguinte: - Se a variável VRF for igual a 1, então faça…
echo Falha de Conexão com o Servidor
echo Verifique se há conectividade de rede local, ou se o servidor responde a conexões
else if [ -e /media/W2kServer/I ]; then
Caso a variável seja diferente de 1, temos a possibilidade de executar outros comandos e até mesmo buscar e aplicar outras soluções/comandos para potenciais problemas que possam ocorrer, e isto é o que o “else if” me permite ter. Reparem bem que o ‘[ -e /media/W2kServer/I] ‘,verificará se o diretório existe, existindo, ele executará uma ação:
sh /bin/map.sh
echo Unidades de Rede Mapeadas com sucesso
Caso não existir, executará outra ação (; then).
else if [ -e /media/W2kServer ]; then
Observando de perto, criamos inclusive, diretórios que não existem para que o mapeamento funcione corretamente, fechando o circulo perfeitamente (penso eu).
echo Recriando estrutura de diretórios
mkdir /media/W2kServer/{F,G,H,I,X,Z} && sh /bin/map.sh
echo Unidades de Rede Mapeadas com sucesso
E assim, vou testando as possibilidades até elas se findarem e o script se tornar um pequeno programa (quase perfeito), cobrindo todas as possibilidades existentes em meu ambiente.
Continuando… e finalizando!
else
echo Criando estrutura de diretórios
mkdir /media/W2kServer && mkdir /media/W2kServer/{F,G,H,I,X,Z} && sh /bin/map.sh
echo Estrutura recriada e unidades de redes mapeadas com sucesso
fi
fi
fi
Por fim, temos 3 arquivos essenciais (2 shell scripts, e 1 arquivo contendo as credenciais para acesso ao host).
Como escrevi a principio, estes arquivos para me conectar com tal servidor, me atendem perfeitamente, pois, não há a necessidade de que a conexão seja permanente, sendo executada a cada boot. Porém, ter que digitar vários comandos de criação ou verificar se os diretórios existem, e posteriormente, montar as pastas compartilhadas de servidor em tais diretórios, é algo muito massante com o tempo. O ideal, é ser adaptável e nunca tornar seu trabalho algo chato de se fazer, e com isto, ganho em tempo e agilidade, e também não fico “ocioso” com os meus neurônios. Fico feliz de poder compartilhar este pequeno script com todos vocês leitores.
Ahhh… quem ter uma solução melhor, ou ainda, me passar umas ideias, ou mesmo de como aperfeiçoar e diminuir o tamanho dos scripts eu ficarei grato e receberei com alegria tais colaborações.
Os scripts podem ser baixados e visualizados no paste.bin do Archlinux-br, segue os links:
http://paste.archlinux-br.org/1351
http://paste.archlinux-br.org/1353
E nunca se esqueçam do Guia Foca GNU/Linux.