[Resolvido] - Aplicativo para correr comandos via ssh para multiplas maquinas

Iniciado por slkslk, 01 de Julho de 2009, 06:44

tópico anterior - próximo tópico

slkslk

Precisava de um aplicativo (ou script) que permita correr comandos via ssh em várias máquinas, simultaneamente ou sequencialmente, sem ter de fazer "ssh x.x.x.x -l root, e passwd" em todas elas. Todas as máquinas têm os mesmos users e passwds. Se me permitisse detectar quais os ip's ligados dentro dum segmento (via ping, por ex.) também seria excelente. Alguém conhece algo que me possa fazer este trabalhinho?

Cumps
"Carpe diem, quam minimum credula postero."
(Aproveite o dia, acredite o mínimo possível no amanhã), Horácio, Odes I,11,8

gwarah

em todas as máquinas tu deves editar o arquivo /etc/hosts.equiv ou ~/.rhosts e adicionar os ips das máquinas que irão conversar (máquinas confiáveis).

dá uma olhada no comando "man hosts.equiv" ou http://www.mkssoftware.com/docs/man4/rhosts.4.asp

para ver a sintaxe do arquivo

Com estes arquivos editados, vamos ao script:

Vamos supor que existam 3 máquinas

1) ip=192.168.2.101
2) ip=192.168.2.102
3) ip=192.168.2.103

e tu vais rodar na máquina 1:

-----------------
#/bin/bash

export maquinas='192.168.2.102 192.168.2.103'
for ip in `echo ${maquinas}`
do
     # roda o comando ls nas estações
     rsh username@${ip} ls
done

# end

------------------

Tu podes substituir ls por outro comando ou script.
dá uma olhada em man rsh ou http://www.mkssoftware.com/docs/man1/rsh.1.asp para detalhes do rsh.

Acho que algo por aí...

boa sorte.
"Cantar a beleza de ser um eterno aprendiz" (Gonzaguinha)

slkslk

Acho que é mesmo o que eu andava à procura! Obrigado!  ;D Vou experimentar e depois posto o resultado.

Um abraço
"Carpe diem, quam minimum credula postero."
(Aproveite o dia, acredite o mínimo possível no amanhã), Horácio, Odes I,11,8

slkslk

Bem, foi uma epopeia conseguir resolver o meu problema... gwarah, obrigado pela sua ajuda mas depois de horas a tentar e não me pergunte porquê, não me parava de pedir a password, mesmo com o hosts.equiv preenchido e nunca consegui pôr o rsh a funcionar como suposto. No entanto o rsh levou-me a vários tópicos, nomeadamente este endereço

http://lists.freebsd.org/pipermail/freebsd-questions/2005-April/085390.html

onde está um script fantástico que permite sondar os ip's conectados à rede. Como trabalho por DHCP, foi logo uma pequena pérola que desejava à muito. Com isto, e instalando o openssh em todos com o mesmo sistema que tinha indicado para o rsh, consigo manualmente abrir várias consolas sem ter de pôr a password e executar o comando

/etc/init.d/firestarter stop && apt-get update && apt-get upgrade && /etc/init.d/firestarter start

o que me permite desactivar a firewall e dar assim acesso das máquinas à internet, fazer as actualizações e reactivar a firewall. Durante a minha luta encontrei um software que me pareceu soberbo, o tentakel

http://tentakel.biskalar.de/

e onde existe uma lista de uma boa dúzia de programas com vista a executar exactamente os tais comandos em multiplas máquinas. Contudo não o consegui pôr a funcionar, mas de qualquer modo prefiro esta abordagem mais manual da questão pois consigo executar outro tipo de comandos mais específicos a cada máquina para efectuar as minhas manutenções de rotina.

Cumps
"Carpe diem, quam minimum credula postero."
(Aproveite o dia, acredite o mínimo possível no amanhã), Horácio, Odes I,11,8

gwarah

legal estas dicas slkslk. O script q vc falou dá um broadcast na rede e descobre os ips locais.

teve 2 coisas que esqueci de te dizer: uma que tu podia bypassar a senha dispensando assim a necessidade da passwd, outra é que os comandos passados são das máquinas remotas e não locais.

O script fica melhor assim:

-----------------
#/bin/bash

export senha
export maquinas='192.168.2.102 192.168.2.103'
export file_result="result.txt"

echo "incio...." > $file_result.txt
for ip in `echo ${maquinas}`
do
     # roda o comando ls nas estações
     echo acessando ${ip}
     rsh username@${ip} <<!  >> $file_result.txt
# poste aqui o que vc quer rodar nas máquinas remotas
echo "hostname: " `hostname`
echo "diretórios: "
ls
!
    # separador
    echo "=================" >> $file_result.txt
done

echo resultados
more $file_result.txt

# end

------------------

pode-se melhora-lo colocando um broadcast com o exemplo q vc passou e bypassar senha.

abs,
"Cantar a beleza de ser um eterno aprendiz" (Gonzaguinha)

slkslk

Bem, depois de muito tentar, ficou resolvido assim:

Primeiro corro o script numa consola para detectar ip's conectados.


#!/bin/sh
IP=190
while [ $IP -le 253 ]
do
echo -e ".\c"
if ( arping -c 1 -q 192.168.0.$IP ) then
echo -e "\n192.168.0.$IP Online"
fi
IP=$(( $IP +1 ))
done
echo -e "\n"


Noutra consola ao lado corro o seguinte script (tem de se instalar o sshpass):


#!/bin/sh
echo "Qual o ip a actualizar?"
read line
ip=$line
sshpass -p 'aminhapasswd' ssh root@$ip '/etc/init.d/firestarter stop && apt-get update && apt-get upgrade && /etc/init.d/firestarter start && exit'
echo "Actualização Concluída no ip ... $ip ..."


E corre todos os comandos que quiser na máquina remota. No caso para a firewall, arranca os updates, arranca novamente a firewall (bloqueando o acesso à net) e fecha a consola remota.

Seria excelente ligar as duas rotinas para a segunda apanhar os ip's da primeira, e garantir os timeouts com um máx de 15 seg, pois nem todos os ip's são máquinas linux....

Se alguém tiver ideias...  :)
"Carpe diem, quam minimum credula postero."
(Aproveite o dia, acredite o mínimo possível no amanhã), Horácio, Odes I,11,8

gwarah

Vc pode fazer tudo em um unico console. Algo assim

#!/bin/sh
IP=190
while [ $IP -le 253 ]
do
   echo -e ".\c"
   if ( arping -c 1 -q 192.168.0.$IP ) then
     echo -e "\n192.168.0.$IP Online"
     echo "atualiza esta máquina (s/n)?"
     read resposta
     if [ "${resposta}" = "S" ] then
       sshpass -p 'aminhapasswd' ssh root@$IP '/etc/init.d/firestarter stop && apt-get update && apt-get upgrade && /etc/init.d/firestarter start && exit'
       echo "Actualização Concluída no ip ... $IP ..."
       echo "==========================="
     fi
   fi
   IP=$(( $IP +1 ))
done
echo -e "\n"

[]s
"Cantar a beleza de ser um eterno aprendiz" (Gonzaguinha)

slkslk

"Carpe diem, quam minimum credula postero."
(Aproveite o dia, acredite o mínimo possível no amanhã), Horácio, Odes I,11,8