(Resolvido) Montar vários compartilhamentos samba através de script

Iniciado por brunoqkz, 20 de Junho de 2012, 17:54

tópico anterior - próximo tópico

brunoqkz

Boa tarde,

Estou com um probleminha para criar um script que monte diversos compartilhamentos em pastas que recebem o nome da máquina de origem. Eis o cenário: temos cerca de 350 computadores rodando windows na nossa rede e tenho acesso de administrador em todas. Preciso alterar a configuração (arquivo .cfg) de um programa  específico. Acontece que esse programa recebe um número por computador, o que torna inviável replicar esse arquivo. Através do sed (estou apaixonado por essa ferramenta  :D) eu consigo alterar a configuração em questão digitando sed -i 's/config_antiga/config_nova/g'.. em conjunto com o find, nem preciso navegar à do arquivo, ele mesmo faz essa tarefa: find . -type f -name arquivo.cfg -exec sed -i 's/config_antiga/config_nova/g' '{}' ';'
Então, montar e desmontar as pastas para acessar os computadores é ainda bastante trabalhoso, então eu escrevi esse script (devo frizar que não sou programador, não manjo absolutamente nada de nenhuma linguagem nem de lógica de programação, sou apenas curioso):

#!/bin/bash

# Executa o comando 'nmblookup' afim de encontrar o hostname das máquinas ligadas:



for ip in $(seq 25 254); do nmblookup -A 10.54.6.$ip | cut -d'<' -f1 | head -2 | sed -e 's/^[ \t]*//' | sed 1d | grep -v -i -e "no reply from" | grep ^SC; done > hostnames_ativos


# Cria uma lista de IPs com base nos hostnames:


for lista in `cat hostnames_ativos`; do ping -c 1 $lista | nawk -F'[()]' '/^PING/ {print $2;exit}'; done > ips_ativos



# Cria as pastas que serão utilizadas na montagem:



for pastas in `cat hostnames_ativos`; do mkdir $pastas; done


# Variáveis para utilização na montagem dos compartilhamentos:


USER="usuário"
DOMAIN="domínio"
PASSWORD="senha"
ORIGEM=`cat ips_ativos`
DESTINO=`cat hostnames_ativos`


# Comando para montar os compartilhamentos:


mount.cifs -o user=$USER,domain=$DOMAIN,password=$PASSWORD //$ORIGEM/c$ $DESTINO



Não tenho problemas em encontrar o hostname das máquinas e nem os ips, os arquivos de auxílio são gerados numa boa. No entanto se houver mais de uma entrada nesses arquivos, surge esse erro:

root@computador:~# ./montar.sh  
mount.cifs: illegal character 0x0a in mount entry


Com uma só entrada funciona direitinho!
Alguém tem uma luz?

irtigor

O mount.cifs deve esperar uma origem e um destino.


#!/bin/bash

# Variáveis para utilização na montagem dos compartilhamentos:
USER="usuário"
DOMAIN="domínio"
PASSWORD="senha"

# Executa o comando 'nmblookup' afim de encontrar o hostname das máquinas ligadas:
for ip in {25..254}; do
    nmblookup -A 10.54.6.$ip | cut -d'<' -f1 | head -2 | sed -e 's/^[ \t]*//' | sed 1d | grep -v -i -e "no reply from" | grep ^SC
done > hostnames_ativos

# Cria uma lista de IPs com base nos hostnames:
while IFS= read -r linha; do
    ping -c 1 "$linha" | nawk -F'[()]' '/^PING/ {print $2;exit}'
done < hostnames_ativos > ips_ativos

# Cria as pastas que serão utilizadas na montagem:
while IFS= read -r linha; do
    mkdir "$linha"
done < hostnames_ativos

# Monta dois vetores: origens e destinos
origens=()
while IFS= read -r linha; do
    origens+=("$linha")
done < ips_ativos

destinos=()
while IFS= read -r linha; do
    destinos+=("$linha")
done < hostnames_ativos

# Laço que monta tudo, assume que origens e destinos possuem o mesmo tamanho e estão ordenados.
n=${#origens[*]}
for ((i=0;i<n;i++)); do
    mount.cifs -o user="$USER",domain="$DOMAIN",password="$PASSWORD" //"${origens[i]}"/c$ "${destinos[i]}"
done


Não posso testar, mas a ideia é simples: criar dois vetores, onde cada elemento é uma linha dos arquivos, então iterar usando o laço para.

Olhe:
http://mywiki.wooledge.org/BashFAQ/001
http://mywiki.wooledge.org/BashFAQ/005
http://mywiki.wooledge.org/BashGuide/Arrays
http://wiki.bash-hackers.org/syntax/arrays

brunoqkz

#2
irtigor, muito obrigado pela sua resposta!
Devo ser sincero em dizer que não entendi o que você quis dizer com laços e tudo o mais, mas irei estudar o material que você indicou para me inteirar no assunto.
Amanhã pela manhã testarei esse código que você escreveu.
Novamente, obrigado!  :)



Funcionou perfeitamente!
Muito bacana ver uma idéia tomando forma assim. Graças a sua ajuda irtigor!
Horas de trabalho poupadas  ;D