Executar comando via SSH em Shell Script

1. Executar comando via SSH em Shell Script

Jhon Lucas Silva
s_jhon

(usa Red Hat)

Enviado em 19/10/2016 - 17:46h

Estou criando um shell script para verificar o espaço em disco de diversos servidores e enviar alertas no caso do disco estar lotado, porém estou com alguns problemas, pois preciso conectar via ssh em todos os servidores executar o comando para verificar o espaço em disco, gerar dentro do servidor que estou conectado via ssh um arquivo com o resultado do comando executado e então na mesma conexão ssh, percorrer o arquivo criado e verificar se há algum valor dentro do arquivo que é maior 95, caso seja, então criar um novo arquivo com uma determinada mensagem. Estou com dois problemas, o primeiro é que quando estou gerando o arquivo com o resultado do comando, ao invés de gerar o arquivo apenas com a coluna escolhida, ele está pegando a linha inteira do resultado do comando; o segundo problema é que quando vou percorrer o arquivo criado há um erro dizendo que o arquivo criado não existe, como se a conexão via ssh já tivesse sido finalizada (bem provável que seja isso), se puderem me ajudar ficarei grato.

Abaixo segue Shell Script criado até o momento:


#!/bin/bash

# Author: Jhon Lucas
# 19-Out-16

#Limpa o arquivo

#Set Variable
ECHO=/bin/echo
CAT=/bin/cat
WHOAMI=`/usr/bin/whoami`
SSH=/usr/bin/ssh
PATH=/scripts/lista_servidores.txt
CMD="df -h |grep -v 'Use'|awk '{print $5}'|sed "s/%//g" > /root/lista_percent.txt"

#Check if User is Root
if [ "${WHOAMI}" != 'root' ];
then
$echo 'Voce precisa ser root para executar este Shell Script'
exit 1
fi

for FILE1 in `$CAT ${PATH}`;
do
$ECHO 'Servidor '${FILE1}
$SSH -p 16 root@${FILE1} ${CMD}
LIST_PERCENT=/root/lista_percent.txt

for FILE2 in `$CAT ${LIST_PERCENT}`;
do
if [ "$FILE2" -gt "95" ]; then
$ECHO "Espaco em disco esta baixo, favor verificar!" > /root/verificar.txt
fi
done
done





  


2. Re: Executar comando via SSH em Shell Script

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/10/2016 - 17:59h

Por que você não faz via snmp utilizando um Nagios ou Zabbix da vida?




3. Re: Executar comando via SSH em Shell Script

Jhon Lucas Silva
s_jhon

(usa Red Hat)

Enviado em 19/10/2016 - 18:02h

amarildosertorio escreveu:

Por que você não faz via snmp utilizando um Nagios ou Zabbix da vida?


Como fazer via snmp utilizando o Nagios? Não tenho conhecimento sobre.

Utilizo a ferramento do Nagios, o Nagvis, seria possível incluir isso no Nagvis?

No aguardo.

Grato!


4. Re: Executar comando via SSH em Shell Script

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/10/2016 - 18:04h

s_jhon escreveu:

amarildosertorio escreveu:

Por que você não faz via snmp utilizando um Nagios ou Zabbix da vida?


Como fazer via snmp utilizando o Nagios? Não tenho conhecimento sobre.

Utilizo a ferramento do Nagios, o Nagvis, seria possível incluir isso no Nagvis?

No aguardo.

Grato!


Ex.:
$ /usr/local/nagios/libexec/check_snmp_storage.pl -H nabucodonosor -C public -2 -m / -r -w 80 -c 90
/: 12%used(3226MB/26219MB) (<80%) : OK 


É possível sim adicionar no NagVis.



5. Re: Executar comando via SSH em Shell Script

Carlos A. P. Cunha
Carlos_Cunha

(usa Linux Mint)

Enviado em 19/10/2016 - 19:35h

Passar comando por ssh via chave de confiança(que não pede senha)


ssh root@192.168.0.60 'comando'


Ou passando com senha(sem chave)

sshpass -p "SENHA " ssh root@192.168.0.60 'comando'


#-------------------------------------------------------------------------------------#

"Linux is cool"


6. Re: Executar comando via SSH em Shell Script

William Amaral de Souza
Williamm

(usa Linux Mint)

Enviado em 20/10/2016 - 00:13h

Opa, eu tenho um semelhante usando o sshpass para acessar e o SendEmail para enviar email, pode usar ele para terminar o teu ou usar ele assim mesmo que esta funcionando...


#!/bin/bash
LOG=/tmp/monitorHD_remoto.txt

function monitorar() {
USO=$(sshpass -p$SENHA ssh $USUARIO@$IP df -h $HD | tail -1 | awk '{print $5}'| sed "s/%//g")
if [ "$USO" -ge "$TMAX" ]; then
echo -e "Atencao...\n" > $LOG
echo -e "$HD "$MONT" ESTA COM "$USO"% DE USO!\n" >> $LOG
echo "VERIFICAR!!!" >> $LOG
alerta
fi
}

function alerta() {
EMAIL_DE="emailde@gmail.com"
EMAIL_PARA="emailpara@gmail.com"
SERVIDOR_SMTP="smtp.gmail.com:587"
SENHA="senha"
ASSUNTO="VERIFICAR HD $IP"
MENSAGEM="message-file=$LOG"
sendEmail -f $EMAIL_DE -t $EMAIL_PARA -u $ASSUNTO -o $MENSAGEM -s $SERVIDOR_SMTP -xu $EMAIL_DE -xp $SENHA -o tls=no > /tmp/alertamonitorHD_remoto.txt
}
#----------------------------------------------------------------------------------------------------------------------------------------------------
# Usuario do host remoto
USUARIO=usuario

# Senha do Host remoto
SENHA=senha

# IP do Host remoto
IP=192.168.0.1

# HD a monitorar
HD=/dev/sda1

# Tamanho maximo para alerta em GB
TMAX=10

# Executa funcao
monitorar

#----------------------------------------------------------------------------------------------------------------------------------------------------



7. Re: Executar comando via SSH em Shell Script

Jhon Lucas Silva
s_jhon

(usa Red Hat)

Enviado em 20/10/2016 - 08:33h

Obrigado senhores, vou testar as soluções aqui indicadas e posto o resultado.

Grato!


8. Re: Executar comando via SSH em Shell Script

William Amaral de Souza
Williamm

(usa Linux Mint)

Enviado em 23/10/2016 - 20:00h

Funcionou?


9. Re: Executar comando via SSH em Shell Script

Jhon Lucas Silva
s_jhon

(usa Red Hat)

Enviado em 31/10/2016 - 15:13h

Pessoal, consegui fazer aqui seguindo a orientação de todos que colaboraram, tive alguns problemas mas no fim conseguir criar um shell script que faz a verificação do disco em diversos servidores por conexão remota utilizando SSH e então encaminhando um e-mail caso tenha algum disco sem espaço.

Segue o código final:

#!/bin/bash

# Author: Jhon Lucas
# 21-Out-16

#Limpa o arquivo
echo '' > /root/check_disk.txt

#Set Variable
ECHO=/bin/echo
CAT=/bin/cat
WHOAMI=`/usr/bin/whoami`
SSH=/usr/bin/ssh
SEND='/scripts/sendEmail'
RM=/bin/rm
PATH=/scripts/list_servers_check.txt
GERA_LISTA_PARTICOES="df -h -P |grep -v 'Use' > /root/lista_percent.txt"
GERA_LISTA_PERCENT="cat /root/lista_percent.txt"


#Check if User is Root
if [ "${WHOAMI}" != 'root' ];
then
$echo 'Voce precisa ser root para executar este Shell Script'
exit 1
fi

#Conecta em todos servidores via ssh e cria um arquivo com percentual de disco
for FILE1 in `$CAT ${PATH}`;
do
if [ "$FILE1" == "10.62.3.47" ]; then
$SSH -p 31 root@${FILE1} ${GERA_LISTA_PARTICOES}
else
$SSH -p 16 root@${FILE1} ${GERA_LISTA_PARTICOES}
fi
done

for FILE2 in `$CAT ${PATH}`;
do
if [ "$FILE2" == "10.62.3.47" ]; then
$SSH -p 31 root@${FILE2} ${GERA_LISTA_PERCENT} > /root/temp.txt
$ECHO 'Servidor: '${FILE2} >> /root/check_disk.txt
LIST_PERCENT=/root/temp.txt
else
$SSH -p 16 root@${FILE2} ${GERA_LISTA_PERCENT} > /root/temp.txt
$ECHO 'Servidor: '${FILE2} >> /root/check_disk.txt
LIST_PERCENT=/root/temp.txt
fi

for FILE3 in `$CAT ${LIST_PERCENT} |/bin/awk '{print $5}' |/bin/sed "s/%//g"`;
do
if [ "$FILE3" -ge "95" ]; then
VAR="true"
break
else
VAR="false"
fi
done

if [ $VAR == "true" ]; then
$CAT /root/temp.txt >> /root/check_disk.txt
$ECHO "" >> /root/check_disk.txt
$RM -rf /root/temp.txt
else
$ECHO '' > /root/check_disk.txt
fi
done

ARQ=`$CAT /root/check_disk.txt`

if [ "${ARQ}" != " " ];
then
SUBJECT='Monitoramento de Servidores - Espaco em Disco'
MESSAGE='Segue em anexo relacao de servidores que estao com pouco espaco em disco, favor verificar.'
FILE='/root/check_disk.txt'
${SEND} -f "email" -t "email" -u "${SUBJECT}" -m $MESSAGE -a $FILE -s "IP servidor de E-mail" -xu desenvolvimento -xp genexus

else
$ECHO '' >> /dev/null
fi


Obrigado à todos que me orientaram.

Abraço!


10. Re: Executar comando via SSH em Shell Script

Perfil removido
removido

(usa Nenhuma)

Enviado em 31/10/2016 - 17:51h

Você falou que utiliza o Nagios. Você não está tirando proveito da ferramenta. Poderia monitorar via snmp ou nrpe, definir os thresholds e configurar o contexto de notificação.


11. Re: Executar comando via SSH em Shell Script

Vinicius Miqueloti
Miqueloti

(usa Lubuntu)

Enviado em 31/10/2016 - 19:53h

Pode utilizar o expect inline no seu shell script para cada ip a se conectar ou separar em outro e chamar quando preciso.


12. Re: Executar comando via SSH em Shell Script

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 01/11/2016 - 01:24h

s_jhon escreveu:

Pessoal, consegui fazer aqui seguindo a orientação de todos que colaboraram, tive alguns problemas mas no fim conseguir criar um shell script que faz a verificação do disco em diversos servidores por conexão remota utilizando SSH e então encaminhando um e-mail caso tenha algum disco sem espaço.

Segue o código final:

#!/bin/bash

# Author: Jhon Lucas
# 21-Out-16

#Limpa o arquivo
echo '' > /root/check_disk.txt

#Set Variable
ECHO=/bin/echo
CAT=/bin/cat
WHOAMI=`/usr/bin/whoami`
SSH=/usr/bin/ssh
SEND='/scripts/sendEmail'
RM=/bin/rm
PATH=/scripts/list_servers_check.txt
GERA_LISTA_PARTICOES="df -h -P |grep -v 'Use' > /root/lista_percent.txt"
GERA_LISTA_PERCENT="cat /root/lista_percent.txt"


#Check if User is Root
if [ "${WHOAMI}" != 'root' ];
then
$echo 'Voce precisa ser root para executar este Shell Script'
exit 1
fi

#Conecta em todos servidores via ssh e cria um arquivo com percentual de disco
for FILE1 in `$CAT ${PATH}`;
do
if [ "$FILE1" == "10.62.3.47" ]; then
$SSH -p 31 root@${FILE1} ${GERA_LISTA_PARTICOES}
else
$SSH -p 16 root@${FILE1} ${GERA_LISTA_PARTICOES}
fi
done

for FILE2 in `$CAT ${PATH}`;
do
if [ "$FILE2" == "10.62.3.47" ]; then
$SSH -p 31 root@${FILE2} ${GERA_LISTA_PERCENT} > /root/temp.txt
$ECHO 'Servidor: '${FILE2} >> /root/check_disk.txt
LIST_PERCENT=/root/temp.txt
else
$SSH -p 16 root@${FILE2} ${GERA_LISTA_PERCENT} > /root/temp.txt
$ECHO 'Servidor: '${FILE2} >> /root/check_disk.txt
LIST_PERCENT=/root/temp.txt
fi

for FILE3 in `$CAT ${LIST_PERCENT} |/bin/awk '{print $5}' |/bin/sed "s/%//g"`;
do
if [ "$FILE3" -ge "95" ]; then
VAR="true"
break
else
VAR="false"
fi
done

if [ $VAR == "true" ]; then
$CAT /root/temp.txt >> /root/check_disk.txt
$ECHO "" >> /root/check_disk.txt
$RM -rf /root/temp.txt
else
$ECHO '' > /root/check_disk.txt
fi
done

ARQ=`$CAT /root/check_disk.txt`

if [ "${ARQ}" != " " ];
then
SUBJECT='Monitoramento de Servidores - Espaco em Disco'
MESSAGE='Segue em anexo relacao de servidores que estao com pouco espaco em disco, favor verificar.'
FILE='/root/check_disk.txt'
${SEND} -f "email" -t "email" -u "${SUBJECT}" -m $MESSAGE -a $FILE -s "IP servidor de E-mail" -xu desenvolvimento -xp genexus

else
$ECHO '' >> /dev/null
fi


Obrigado à todos que me orientaram.
Abraço!

=======================================================================
Boa noite s_jhon.
Estava analisando seu script, e surgiu uma dúvida . . .
O SSH do SERVER com IP "10.62.3.47" responde na porta 31
e os OUTROS na PORTA 16, é isso?

Att.:
Marcelo OLiver




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts