Shell Script para atualização remota em rede interna [RESOLVIDO]

1. Shell Script para atualização remota em rede interna [RESOLVIDO]

Renato Cesar Ribeiro Bonfim Jr
rbonfim

(usa elementary OS)

Enviado em 25/02/2015 - 22:37h

Boa noite, pessoal do VOL!

Estou iniciando o estudo do Shell Script e com isso surgiram várias dúvidas a cerca de sintaxe e uso do "if" e "for", escrevi neste interim um script que tem a função de conectar a uma estação via SSH e executar a atualização do sistema. A priori o script funciona, já foi testado também com o argumento "for IP in 10.0.0.{1..50}.

A dúvida é: apesar do funcionamento a sintaxe está correta? Alguém pode me dar sugestão de melhoras ou correções no script?

Segue o "danado":

#!/bin/bash
for IP in 192.168.0.17; do
echo "Conectando a $IP";
sleep 1;
sshpass -f /home/antimonitor/exemplo/passwd ssh root@$IP 'apt-get update';
if [ $? -eq 0 ]; then
echo "Cache do cliente $IP Atualizado";
sshpass -f /home/antimonitor/exemplo/passwd ssh root@$IP 'apt-get -y upgrade';
elif [ $? -eq 0 ]; then
echo "Cliente $IP Atualizado com sucesso";
else
echo "Falha na atualização"
fi
done

Agradeço a todos!
Forte abraço





  


2. Re: Shell Script para atualização remota em rede interna

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/02/2015 - 10:02h

Algumas sugestões:

- Remova o sleep.

- Em lugar de sshpass, considere usar autenticação por chave RSA.

- Passe os dois comandos numa só invocação ao SSH, economizando o tempo de autenticação.

- Você tem um block if/elif/else em que as condições do if e do elif são idênticas. Isso significa que a do elif nunca será avaliada.

O script abaixo é a minha versão, e presume acesso do SSH através de chave pública.

#!/bin/bash

# Conta de 1 a 254
for (( x=1; x<255; x++ )); do
ip="10.0.0.$x"
ssh root@$ip sh -c \''
host=`hostname`
if apt-get -q update; then
echo "Atualização do cache em $host bem-sucedida."
apt-get -q -y dist-upgrade &&
echo "Atualização do sistema em $host bem-sucedida." ||
echo "Erro na atualização do sistema em $host." >&2
else
echo "Erro na atualização do cache em $host." >&2
fi
'\'
done



3. Re: Shell Script para atualização remota em rede interna [RESOLVIDO]

Renato Cesar Ribeiro Bonfim Jr
rbonfim

(usa elementary OS)

Enviado em 26/02/2015 - 10:17h

Paulo, bom dia,

Valeu pelas dicas, agradeço!
Queria saber se podes me explicar as seguintes dúvidas:

1º O uso da contrabarra logo apos o login ssh.
2º. O uso do || seria uma expressão do tipor "or"?
3º. Como corrigir a estrutura do if e do Elif?

De toda forma já agradeço e usarei tua sugestão!


4. Re: Shell Script para atualização remota em rede interna

Renato Cesar Ribeiro Bonfim Jr
rbonfim

(usa elementary OS)

Enviado em 26/02/2015 - 23:38h

Paulo,

Ao executar teu script recebi a seguinte mensagem de erro:
./update.atual.sh: 4: ./update.atual.sh: Syntax error: Bad for loop variable



5. Re: Shell Script para atualização remota em rede interna

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/02/2015 - 13:20h

Erro meu! A construção de for aritmético funciona com o bash, mas não com o sh padrão. No mundo Red Hat/Fedora não dá problema porque o sh é igual ao bash, mas no mundo Debian/Ubuntu, além de outros sistemas UNIX-like, são shells completamente distintos.

Eu corrigi a listagem do post anterior para usar bash, em vez de sh. Para fazer a mesma coisa com sh comum, seria necessária uma construção diferente, dependente de comandos externos, como test (também chamado “[”) e expr.

#!/bin/sh

ip=1
while [ $ip -lt 255 ]; do
# comandos
i=`expr $i + 1`
done



6. Re: Shell Script para atualização remota em rede interna [RESOLVIDO]

Renato Cesar Ribeiro Bonfim Jr
rbonfim

(usa elementary OS)

Enviado em 27/02/2015 - 15:58h


Paulo, boa tarde,

Valeu mesmo! Sanou parte de minhas dúvidas agora é ler mais. Acabei remodelado o script baseando-se no teu:

#!/bin/sh
for IP in 192.168.0.110; do
host=`sshpass -f /passwd ssh root@$IP 'hostname'`
echo "***** Conectando a $host ($IP). *****";
if sshpass -f /passwd ssh root@$IP 'apt-get update'; then
echo "***** Atualização do cache em $host ($IP) realizada com sucesso. *****"
sshpass -f /passwd ssh root@$IP 'apt-get -y upgrade' &&
echo "***** Atualização do sistema em $host ($IP) realizada com sucesso. *****" ||
echo "***** Erro na atualização do sistema: $host ($IP) *****" >&2
else
echo "***** Erro na atualização do cache em $host ($IP). *****" >&2
fi
done


Ainda vou modifica-lo em relação a autentica via chave pública! Obrigado e forte abraço!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts