Aproveitando o post do Franklin: “SSH: confiança entre servidores” e também o post anterior “Usando PIPEs no Linux: mknod p, mkfifo“, vamos compartilhar com a comunidade mais uma solução interessante usando os PIPES.. mas dessa vez não será preciso criar um FIFO com mknod ou mkfifo…
Dessa vez, vamos criar uma estrutura para poder digitar um comando uma vez só em um linux, e ele será replicado para várias máquinas linux, simultaneamente…
Antes de tudo, a máquina central onde você executará o comando, deve ter confiança para executar comandos SSH em outras máquinas sem a solicitação de senha (veja o post SSH: confiança entre servidores).
Então temos que definir algumas informações e os arquivos, em forma de variável para facilitar a utilização:
#!/bin/sh
IP1=”192.168.0.10″ # Endereço IP da maquina linux1
IP2=”192.168.0.20″ # Endereço IP da maquina linux2
TUN1=”/tmp/.tun2linux1″ # Tunnel ssh para a maquina linux1
BUF1=”/tmp/.buf2linux1″ # Arquivo de buffer para maquina linux1
TUN2=”/tmp/.tun2linux2″ # Tunnel ssh para a maquina linux2
BUF2=”/tmp/.buf2linux2″ # Arquivo de buffer para linux2
Explicação:
Os arquivos nomeados como TUN serão criados em seguida em forma simples arquivo em disco, e serão interceptados pelo “tail -f” e jogar tudo que receberem via ssh para os IPs definidos…
Já os arquivos nomeados como BUF serão criados em forma de simples arquivo em disco também, e servirão de buffer mesmo, onde toda a saída padrão do comando executado remotamente será armazenada… Por exemplo se você mandar o comando “ls -la /tmp”, cada arquivo BUF definido conterá o conteúdo do diretório “/tmp” respectivo de cada máquina da nossa solução..
Após isso, podemos então iniciar a criação dos túneis:
echo -n > $TUN1
echo -n > $TUN2
tail -f $TUN1 | ssh -T root@${IP1} >> $BUF1 &
tail -f $TUN2 | ssh -T root@${IP2} >> $BUF2 &
Pronto! Agora qualquer comando que você jogar com “echo” pra cima do $TUN1, será enviado via SSH para a máquina LINUX1 que você configurou, e o resultado (output) desse comando será armazenado no $BUF1. A mesma coisa acontece para o $TUN2, $BUF2, LINUX2.. e assim sucessivamente..
Exemplo de como usar:
linha1: comando=”ls -la /tmp”
linha2: echo -n > $BUF1
linha3: echo “$comando” >> $TUN1
linha4: while [ `cat $BUF1 | wc -l` -eq 0 ]
linha5: do
linha6: sleep 0.2s
linha7: done
linha8: cat $BUF1
Comentários:
linha1: definição de qual comando você vai querer executar nas máquinas remotas.
linha2: limpa o BUFFER, caso já tenha algum output de outro comando anterior
linha3: manda o comando configurado para dentro do tunnel $TUN1, nesse momento ele viaja pelo SSH até a shell na máquina remota com output para o buffer.. isso pode demorar alguns segundos..
linha4, 5, 6 e 7: laço de repetição.. enquanto o buffer BUF1 estiver vazio, aguarda 2 milésimos de segundo..
linha8: depois que detectou dados no buffer, joga na tela o conteúdo do buffer, ou seja, o output do seu comando.
Agora deixo pra você a parte de pensar o que mais você pode criar a partir disso… e contribuir ainda mais para a evolução da comunidade Linux no mundo.
No próximo POST, devo exemplificar melhor como fazer o seu shell solicitar pra você qual comando você deseja executar, e então usar um laço de repetição para cada máquina configurada e sair executando..
Por: Hudson Murilo dos Santos
Ótimo, estais desinterrando as melhores pérolas…
DAva para fazer o massive ssh versão 2 com este método né.. Hehehehe
Bem pensado!
Nao sei como ainda nao tinha tido essa idéia =)
Minha sugestao de utilizacao seria usar um tail -f em outro terminal virtual em cada um dos arquivos de buffer, assim, você digita o comando num terminal e ao mesmo tempo já consegue ver o retorno de cada uma das máquinas 😉
Abraços!
Thiago,
Boa também essa do tail -f no arquivo de buffer 😉 não tinha pensado ainda…
É uma imensidão de recursos que podem ser utilizados, as vezes da impressão que a limitação é nossa criatividade..
Obrigado pela leitura..
hehhe, isso me fez lembrar uma célebre frase de alguém muito conhecido, mas que agora nao consigo me lembrar o nome… hehehe, era assim:
“With a PC, I always felt limited by the software available.
On Unix, I am limited only by my knowledge.”
Keep up the good job!
😉
Muito boa frase Thiago!
“Com um computador, sempre me sinto limitado pelos softwares disponiveis. Em *nix, sou limitado apenas por meu conhecimento.”
É mais ou menos assim que acontece..
Não é mais fácil usar o SDI para isso? Ele faz um loop com tail -f
http://sdi.sf.net e ainda permite fazer uma espécie de cron e envia comandos em horários determinados, além de gerar pagina web com status.
Bom quando se tem várias máquinas
Russo,
Não conhecia essa ferramenta SDI.. legal.. vou passar a utilizá-la. Tentei achar screenshots da parte WEB do SDI, mas não encontrei no site sourceforge nem na wiki do projeto.
Por acaso você tem?
Grato,
Bom dia, uma outra opção é usar o comando abaixo
$ for i in $(seq -w 1 10); do echo c$i; ssh c$i “ls /tmp”; done
Nesse caso os nome das máquinas são c01, c02, c03 …. c10
Obs: Para funcionar as máquinas tem que se enxergar pelo nome, caso não tenha um DNS rodando, pode-se configurar o arquivo /etc/hosts
Espero ter ajudado, abraços.
Ótima dica WarLinux…
Obrigado pela visita ao blog..
Abraços..!
http://sdi.sourceforge.net/screens.html
WarLinux,
Muito boa utilização do laço for….
Economia de código! Gostei!
Acredito que o SDI é uma opção bem interresante.
Utilizo em alguns servidores, e não tenho reclamações.
A interface web ajuda muito além de ser bem elaborada.
Eles tem uma lista de email e tudo mais (parece que é desenvolvido na UFPR), bem bacana.
[]’s
Ouço falar bem do SDI.
Vou instalar qualquer dia desses.
Legal sua sugestão. Verifiquei o SDI tabém que foi comentado e achei muito bom. Uso nos laboratórios da empresa que trabalho.