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.