• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

newbeen

[Python] Conectar por ssh usando windows

5 mensagens neste tópico

tinha uma dificuldade precisava de executar um script num servidor linux a partir de uma maquina Windows mas sem dar acesso há password mas nem o putty nem o SSH Secure Shell client me deixavam fazer isso depois de alguma pesquisa encontrei a biblioteca para python paramiko e cá vai...

ssh.py -> convém manter este nome no ficheiro porque a parte gráfica faz o import

import sys, socket, traceback, threading
import paramiko, ConfigParser

def get_data():
    data=ConfigParser.ConfigParser()
    data.read('config.ini')
    
    hostname = data.get("login", "host")
    username = data.get("login", "user")
    port = int(data.get("login", "port"))
    password = data.get("login","pass")

    log_file=data.get("config", "logfile")
    command="bin/fixx_axtty_old.sh" #comando que desejem executar aqui!!!!

    data={"host":hostname,
          "user":username,
          "port":port,
          "pass":password,
          "log_file":log_file,
          "command":command,}

    return data

def connect():

    configs=get_data()

    # now connect
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((configs["host"], configs["port"]))

    except Exception, e:
        print 'Connect failed: ' + str(e)
        traceback.print_exc()
        sys.exit(1)

    t = paramiko.Transport(sock)
    event = threading.Event()
    t.start_client(event)
    #print #para usar sem o interface grafico
    """
# --------------------------------------- #
# ---- Develop by Rui Gomes 10/09/08 ---- #
# --------------------------------------- #

###########################
# Start terminal executing #
###########################"""
    event.wait(25)

    if not t.is_active():
        sys.exit(1)

    t.auth_password(configs["user"], configs["pass"], event)

    event.clear()
    event.wait(35)

    if not t.is_authenticated():
        t.close()
        sys.exit(1)

    if not t.is_active():
        print "Channel is not active"
    else:
        chan = t.open_session()
        paramiko.util.log_to_file(configs["log_file"], 10)
        chan.exec_command(configs["command"])
        output="Try to unFreez %s please wait...!\n\n" %configs["host"]
        graboutput=[]
        while output!="":
            usrfile=file("frezz.log", "a")
            usrfile.write(output+"\n")
            graboutput.append(output)
            output=chan.recv(1024)
    
        usrfile.close()
        chan.close()
        t.close()

        #print graboutput #para desconmentar se usar sem o interface grafico
        return graboutput


o codigo a cima e a parte da conexao abaixo segue o ficheiro de configuracao...

config.ini -> convem guardar com este nome porque o ficheiro ssh.py faz o import

[login]

host=store3
user=root
port=22
pass=

[config]

logfile=axtty_unfreez.log

e por fim a parte gráfica sendo totalmente dispensável... :D

import wx, os, threading, ssh

class MainProg(wx.Frame):

    def OnClose(self, a=None):
        os._exit(0)

    def UnFreez(self):
        ssh.connect()
        self.msg=wx.MessageBox("Done now the terminal go restart", "Finish", wx.OK | wx.ICON_INFORMATION, self)
        self.OnClose()

    def OnClickStart(self, event):
        gounfreez=threading.Thread(target=self.UnFreez)
        
        if gounfreez.isAlive():
                wx.MessageBox("Please Wait!","Error", wx.OK | wx.ICON_ERROR, self)

        else:
            
            dlg = wx.TextEntryDialog(None, "Insert manager password:","Password input:", style=wx.TE_PASSWORD|wx.OK|wx.CANCEL)
            if dlg.ShowModal() == wx.ID_OK:
                response = dlg.GetValue()

                if response=="pizza":
                    self.count = 0
                    self.g2 = wx.Gauge(self.panel, -1, 50, (120, 10), (200, 25))
                    self.Bind(wx.EVT_TIMER, self.TimerHandler)
                    self.timer = wx.Timer(self)
                    self.timer.Start(100)
                    gounfreez.start()

                else:
                    wx.MessageBox("Wrong password!","Error", wx.OK | wx.ICON_ERROR, self)

        
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_TOOL_WINDOW, size=(350, 130))

        self.panel = wx.Panel(self)
    
        image = wx.Image('logo.png')
        temp = image.ConvertToBitmap()
        self.bmp = wx.StaticBitmap(self.panel, bitmap=temp, pos=(5,5))
        self.static = wx.StaticText(self.panel, wx.NewId(), "Dominos(r) Iceland\n unFreez Terminal", pos=(175, 65))
        self.button = wx.Button(self.panel, label="Start", pos=(190, 45), size=(50, 20))
        self.Bind(wx.EVT_BUTTON, self.OnClickStart, self.button)
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        self.Centre()
        self.Show(True)

    def TimerHandler(self, event):
        self.count = self.count + 1

        if self.count >= 50:
            self.count = 0
        self.g2.Pulse()   

app = wx.App()
MainProg(None, -1, 'Dominos Shell unFreez Developed by Rui Gomes')
app.MainLoop()


Espero que possa ajudar mais alguém com problema parecido...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não estou a perceberduas coisas:

Como é que te ligas por ssh sem password?

Esse script tem um campo para a password, ou está-me a falar alguma coisa?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Repara no ficheiro de configuração tens la um campo para por o user a password o host e a porta....  :hmm:

e usa essas configurações para se conectar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebo então... o que é que quiseste dizer com isto:

tinha uma dificuldade precisava de executar um script num servidor linux a partir de uma maquina Windows mas sem dar acesso há password
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque eu estou a gerar a password para meter no ficheiro de configuração assim:

password="ruiluis"
pass=password.encode('base64').enconde('hex')

#output='636e56706248567063773d3d0a'

e na parte que le a password tenho assim...


password = data.get("login","pass").decode('hex').decode('base64')

Sei que não e muito seguro mas para mim chega.... Não deixei isso no programa porque ia complicar tinha que esta a explicar como gerar a password para meter no ficheiro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora