Fórum Ubuntu Linux - PT
Suporte Técnico => Aplicativos => Tópico iniciado por: slkslk em 01 de Julho de 2009, 06:44
-
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
-
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.
-
Acho que é mesmo o que eu andava à procura! Obrigado! ;D Vou experimentar e depois posto o resultado.
Um abraço
-
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
-
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,
-
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... :)
-
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
-
Ficou perfeito!!! ;D Obrigado gwarah, era mesmo o que pretendia!