[SOURCE] "Shell Remota" con Python con GUI (Tkinter)

Iniciado por Shrick, 1 Enero 2009, 02:34 AM

0 Miembros y 1 Visitante están viendo este tema.

Shrick

Tras haber dejado un post sin ninguna respuesta  :-( , empece a buscar como un loco por Google haber como podia hacerlo y ya sabeis el dicho, si quieres, puedes, lo que he hecho esta vez, es crear un servidor socket hecho en python con algunas funciones que se ejecutaran según las ordenes que le demos, según parece, al crear un GUI con Tkinter y teniendo sockets, te ves en una encrucijada pues tenemos dos búcles el de los sockets, para mantener la comunicación y el de la ventana gráfica (root.mainloop()), asi que la solución obvia seria ejecutar una y después otra por cada ciclo, para ello es necesario el uso de thread, que he aprendido a nivel básico como funciona hace un rato :xD , del PDF, Python para todos, y como no tengo ni idea de clases en python lo he adaptado como he podido, y ello me ha obligado a tener que entenderlo.

Funcionamiento:

Simplemente es un servidor socket y un cliente GUI con socket que interactuan, desde el cliente vas mandando comandos y el servidor los ejecuta en la máquina en la que esta ejecutandose. Solo he puesto unos cuantos comando inútiles para ver si funcionaba, y si hace, bastante bien.

Los comandos en cuestión son:

mostrar_os -> Muestra el sistema operativo del servidor
cmd pause -> Pausa una consola en Windows
echo HolaM -> Muestra "Hola Mundo" en la consola.

Código Fuente:

server.py:
Código (python) [Seleccionar]
#!/usr/bin/python

import socket
import os

s = socket.socket()
s.bind(("localhost", 9999))
s.listen(30)

sc, addr = s.accept()

sc.send("Bienvenido!")

while True:
recibido = sc.recv(255)
print "Recibido:", recibido
if recibido == "quit":
break
if recibido == "mostrar_os":
recibido = os.name
if recibido == "cmd pause":
os.system("pause")
if recibido == "echo HolaM":
os.system("echo \"Hola Mundo\"")
sc.send(recibido)

print "adios"

sc.close()
s.close()


client.py:
Código (python) [Seleccionar]
#!/usr/bin/python

from Tkinter import *
import socket
import threading

class App:
def __init__(self, master):
Texto = ""
frame = Frame(master)
frame.pack()

self.texto_chat = Text(frame)
self.texto_envio = Entry(frame)
self.boton_enviar = Button(frame, text="Enviar!", command=self.evento)

self.texto_chat.grid(row=1, column=1)
self.texto_envio.grid(row=2, column=1)
self.boton_enviar.grid(row=2, column=2,)

def evento(self):
Texto = self.texto_envio.get()
s.send(Texto)
self.texto_chat.insert(END, "Cliente -> " + Texto + "\n", END)

root = Tk()
application = App(root)

class socket_thread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)

def run(self):
while True:
mensaje = s.recv(255)
print "Server -> " + mensaje
application.texto_chat.insert(END, "Server -> " + mensaje + "\n", END)
#time.sleep(2)
if mensaje == "quit":
self.salir

def salir():
print "Saliendo..."
s.close()

s = socket.socket()
s.connect(("localhost", 9999))

sock = socket_thread()
sock.start()

root.mainloop()


Espero que sirva de algo esto que hice ;)

Si me dejan ponerle licencia que sea zlib, para que pase a dominio público y no tengas que darme ni reconocimientos ni créditos, si lo usaras en tus aplicaciones tanto libres como comerciales.
Ubuntu User
Pascal (2008/2009)
C/C++ (2009/¿?)
8080 Assembler (2009/2010)
MIPS I Assembler (2010/¿?)

Todo lo que yo haga o diga esta bajo:



No pertenece ni a mi ni a nadie :P .

_carlos_

No tengo idea de python, pero se ve bastante bueno el código, gracias por compartirlo, lo archivaré para cuando tenga tiempo de aprender python.