Tunel criptografado SSH para executar comandos em máquinas remotas com pipes

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

14 thoughts on “Tunel criptografado SSH para executar comandos em máquinas remotas com pipes

  1. 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!

  2. 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..

  3. 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!

  4. 😉

    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..

  5. 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

  6. 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,

  7. 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.

  8. 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

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *