Ajuda Shell Script [RESOLVIDO]

1. Ajuda Shell Script [RESOLVIDO]

Marcelo Ribeiro
marceloribeiro8

(usa Slackware)

Enviado em 10/04/2013 - 15:50h

Boa tarde pessoal, alguem poderia dar uma ajuda?
Seguinte, criei um script para jogar um outro script em várias estações, através de um arquivo TXT. Basicamente ele irá varrer o aquivo ips.txt, e a cada linha lida ele joga o script via scp, em seguida loga na estação cria uma entrada no crontab e executa o script. Tratando a sáida de sucesso/erro jogando o IP nos arquivos sucesso.txt e falha.txt.
Porém, no primeiro "sucesso" o script finaliza e não lê o próximo IP para continuar o processo. Segue abaixo o código:

#!/bin/bash
while read linha
do
scp /root/backup.sh root@$linha:/root/ && ssh root@$linha 'cp /root/backup.sh /usr/bin/ ; chmod +x /usr/bin/backup.sh ; echo "59 23 * * * root /usr/bin/backup.sh" >> /etc/crontab ; /usr/bin/backup.sh'
condicao=`echo $?`
if [ $condicao -eq 0 ]; then
echo $linha - `date +%H:%M' '%D` >> /root/logs_backup/sucesso.txt
else
echo $linha - `date +%H:%M' '%D` >> /root/logs_backup/falha.txt
fi
done < ips.txt


Obrigado!


  


2. Re: Ajuda Shell Script [RESOLVIDO]

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 10/04/2013 - 17:32h

Tente deixar desta forma:



#!/bin/bash

for linha in `cat ips.txt`
do

scp /root/backup.sh root@$linha:/root/ && ssh root@$linha 'cp /root/backup.sh /usr/bin/ ; chmod +x /usr/bin/backup.sh ; echo "59 23 * * * root /usr/bin/backup.sh" >> /etc/crontab ; /usr/bin/backup.sh &'
if [ $? -eq 0 ]; then

echo $linha - `date +%H:%M' '%D` >> /root/logs_backup/sucesso.txt
else

echo $linha - `date +%H:%M' '%D` >> /root/logs_backup/falha.txt
fi

done




3. Re: Ajuda Shell Script [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/04/2013 - 17:57h

O ssh está consumindo os dados da entrada padrão, que você redirecionou a partir de ips.txt para todo o loop.

Há duas soluções que eu indico. A mais geral, que vai resolver esse tipo de problema em qualquer caso, é redirecionar apenas a leitura do IP, como no exemplo abaixo.

exec 3< ips.txt
while read linha <&3; do
# Qualquer coisa aqui, podendo ate ler da entrada padrao, sem
# afetar a entrada do controle do loop, que esta no file descriptor 3.
done
exec 3<- # fecha o file descriptor 3


Note que o file descriptor 3 é associado ao arquivo ips.txt apenas uma vez, e as sucessivas leituras pelo loop, redirecionando apenas o comando read, leem linhas sucessivas do arquivo, até o seu final. Você não poderia colocar "while read linha <ips.txt", pois isso faria com que o arquivo fosse reaberto, do início, a cada iteração do loop.

A outra solução, afetando apenas o ssh, que é colocar a opção '-n', para indicar que ele não deve esperar coisa alguma na entrada padrão (outra forma de fazer poderia ser colocar um "</dev/null" no comando do ssh, mas isso seria mais dispendioso e menos elegante).

Como você não vai mesmo querer que o ssh consuma entrada alguma, você pode até combinar as duas soluções.

Mas, por falar em elegância, aquele «condicao=`echo $?`» é bem feinho, não? Você poderia fazer tão-somente «condicao=$?». Mas até isso seria demais. Você poderia fazer simplesmente algo como vai abaixo.

if
scp bla bla &&
ssh -n ble ble ble
then
echo "blo blo blo" >> sucesso.txt
else
echo "blu blu blu" >> falha.txt
fi


Ou, ainda, o seguinte.

scp bla bla    &&
ssh -n ble ble ble &&
echo "blo blo blo" >> sucesso.txt ||
echo "blu blu blu" >> falha.txt



4. Re: Ajuda Shell Script [RESOLVIDO]

Marcelo Ribeiro
marceloribeiro8

(usa Slackware)

Enviado em 11/04/2013 - 08:38h

Prezados,

Obrigado pelo apoio e dicas irei alterar o código agora, deixando-o mais clean.

Abraços!
Marcelo






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts