Automação de comandos SSH sem troca de chaves

Automação de comandos SSH

Para fazer a automação de comandos SSH para vários servidores de um cluster ao mesmo tempo sem usar troca de chaves, existe um programa chamado cssh (ou pelo menos ‘existia’). O problema é que ele usa o terrminal vt100 e abre uma lista de servidores cada um em uma janela; abre as janelas, depois as organiza e a partir de então digita-se os comandos em um inputbox, que envia a saída para todas as instâncias ao mesmo tempo. O curioso e estranho  é que às vezes a saída falha em algum(ns) do(s) terminais, e então se faz necessário rodar novamente o comando nessa janela.



Para agilizar, resolvi fazer um programinha em python, para envio de comandos, mas poderia ser usado para transferência de arquivos via scp e assim evita-se a necessidade de manter chaves, o que é um problema quando se troca máquinas de um cluster e se esquece a chave na antiga máquina.

Indo ao código:

#!/usr/bin/env python
#By: Djames Suhanko

#lista de servidores

sincroniza =["server1.domain","server2.domain", "server3.domain"]

import pexpect
import sys
from threading import Thread

#usuario e senha podem ser colocados em um arquivo.ini ou estaticamente nesse arquivo

#Testa a lista de parâmetros

try:
    if sys.argv[3]:
        pass
except:
    print&nbsp; "Uso: " + "script" + " <comando entre aspas> <usuario> <senha>"
    sys.exit()

#essa função inicia o envio dos comandos passados como argumentos.
def executor(comando,usuario,senha,servidor):
    a = 'ssh ' + usuario + '@' + servidor
    foo = pexpect.spawn(a)
    foo.expect('.*ssword:')
    foo.sendline(senha)
    foo.sendline('su')
    foo.expect('.*sword:')
    foo.sendline('senha_secreta')
    foo.sendline(comando + '&& exit')
    print "comando e saida para: " + servidor + "..........[OK]"
    foo.sendline('exit')
    foo.expect('.*osed.')
    foo.interact()

#cria uma lista...
tasks = []

#loop com thread da funcao executor
for i in sincroniza:
    t = Thread(target=executor,args=(sys.argv[1],sys.argv[2],sys.argv[3],i))
    t.start()
    tasks.append(t)

#aguarda a finalização de todas as tarefas.

for t in tasks:
    t.join()

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!

Agregador de Links - Loucuras da Net

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Um comentário em “Automação de comandos SSH sem troca de chaves

Deixe uma resposta