Jump to content
newbeen

[Python] Conectar por ssh usando windows

Recommended Posts

newbeen

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


RHCE - 120-062-534

Share this post


Link to post
Share on other sites
pedrotuga

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?

Share this post


Link to post
Share on other sites
newbeen

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

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


RHCE - 120-062-534

Share this post


Link to post
Share on other sites
pedrotuga

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

Share this post


Link to post
Share on other sites
newbeen

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


RHCE - 120-062-534

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.