ssh no host e executando o script de verificação de serviço

1

Eu preciso de ssh e executar verificação de serviço em vários hosts

say Lista de hosts: host1 host2 host3

Eu escrevi o script da seguinte maneira, mas ele está ficando preso apenas no ssh

#!/bin/bash

service=splunk

for host in $(</tmp/tstuf.txt);
do
  ssh $host;
  if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
  then
    echo "$service is running"
  else
    echo "$service is not running"
  fi
done

durante a execução do script, ele está executando o ssh e passando para o host1 do host atual e preso nele. Ele não está executando a verificação de serviço. Alguém pode por favor sugerir

    
por user227863 14.02.2018 / 20:11

1 resposta

0

Seu script é "ficar preso apenas no ssh" porque você não está dando um comando para executar. O ssh $host apenas estabelece uma sessão ssh interativa com $host , que então espera que você comece a interagir com ela.

Quando você exit do host remoto, seu script continuará e executará if (( $(ps ....) > 0 )); then .......... fi em seu sistema LOCAL. E continue o loop for com o próximo host na lista (ficando "preso" novamente até você sair).

#!/bin/bash

service=splunk

for host in $(</tmp/tstuf.txt); do
  ssh $host "if (( \$(ps -ef | grep -v grep | grep $service | wc -l) > 0 )); then
               echo $service is running
             else
               echo $service is not running
             fi"
done

ou, como sugerido por @DopeGhoti, uma alternativa muito mais simples e melhor é:

#!/bin/sh

service=splunk

for host in $(</tmp/tstuf.txt); do
  # echo -n "$host:"  # optional. uncomment the echo if wanted.
  ssh "$host" service "$service" status
done

Uma alternativa ainda melhor é instalar algo como o Parallel Distributed Shell da LLNL, também conhecido como pdsh , (depois de configurar o arquivo da lista de hosts /etc/genders ) você pode apenas executar comandos como:

pdsh -g all service splunk status

que executa service splunk status no grupo de hosts definido pela tag "all".

pdsh executa os comandos em vários hosts ao mesmo tempo (daí o nome "shell distribuído paralelo"), em vez de um por vez. Cada linha de saída do sistema remoto é prefixada por seu nome de host.

por exemplo. na minha pequena rede doméstica:

$ pdsh -g all uptime
kali:  12:09:03 up 3 days, 23:26,  2 users,  load average: 0.08, 0.05, 0.06
hanuman:  12:09:03 up 12 days, 13:09,  2 users,  load average: 0.00, 0.00, 0.00
indra:  12:09:03 up 12 days, 13:05,  2 users,  load average: 0.07, 0.12, 0.09
ganesh:  12:09:03 up 34 days, 23:34, 19 users,  load average: 1.86, 1.48, 1.40

BTW, a saída de linha única, como o exemplo uptime acima, pode ser formatada em colunas nítidas, canalizando para, por exemplo, column -t . a saída de várias linhas pode ser agrupada por nome de host pelo piping no utilitário pdsh dshbak .

Se você não quer estar digitando senhas o tempo todo, requer que a autenticação baseada em chave ssh seja configurada em cada host remoto ... assim como o loop for ou qualquer outra coisa que se conecte via ssh.

pdsh é empacotado para o debian e a maioria das outras distribuições do Linux.

    
por 15.02.2018 / 02:05