Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Shrick en 1 Enero 2009, 02:34 am



Título: [SOURCE] "Shell Remota" con Python con GUI (Tkinter)
Publicado por: Shrick en 1 Enero 2009, 02:34 am
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
  1. #!/usr/bin/python
  2.  
  3. import socket
  4. import os
  5.  
  6. s = socket.socket()
  7. s.bind(("localhost", 9999))
  8. s.listen(30)
  9.  
  10. sc, addr = s.accept()
  11.  
  12. sc.send("Bienvenido!")
  13.  
  14. while True:
  15. recibido = sc.recv(255)
  16. print "Recibido:", recibido
  17. if recibido == "quit":
  18. break
  19. if recibido == "mostrar_os":
  20. recibido = os.name
  21. if recibido == "cmd pause":
  22. os.system("pause")
  23. if recibido == "echo HolaM":
  24. os.system("echo \"Hola Mundo\"")
  25. sc.send(recibido)
  26.  
  27. print "adios"
  28.  
  29. sc.close()
  30. s.close()

client.py:
Código
  1. #!/usr/bin/python
  2.  
  3. from Tkinter import *
  4. import socket
  5. import threading
  6.  
  7. class App:
  8. def __init__(self, master):
  9. Texto = ""
  10. frame = Frame(master)
  11. frame.pack()
  12.  
  13. self.texto_chat = Text(frame)
  14. self.texto_envio = Entry(frame)
  15. self.boton_enviar = Button(frame, text="Enviar!", command=self.evento)
  16.  
  17. self.texto_chat.grid(row=1, column=1)
  18. self.texto_envio.grid(row=2, column=1)
  19. self.boton_enviar.grid(row=2, column=2,)
  20.  
  21. def evento(self):
  22. Texto = self.texto_envio.get()
  23. s.send(Texto)
  24. self.texto_chat.insert(END, "Cliente -> " + Texto + "\n", END)
  25.  
  26. root = Tk()
  27. application = App(root)
  28.  
  29. class socket_thread(threading.Thread):
  30. def __init__(self):
  31. threading.Thread.__init__(self)
  32.  
  33. def run(self):
  34. while True:
  35. mensaje = s.recv(255)
  36. print "Server -> " + mensaje
  37. application.texto_chat.insert(END, "Server -> " + mensaje + "\n", END)
  38. #time.sleep(2)
  39. if mensaje == "quit":
  40. self.salir
  41.  
  42. def salir():
  43. print "Saliendo..."
  44. s.close()
  45.  
  46. s = socket.socket()
  47. s.connect(("localhost", 9999))
  48.  
  49. sock = socket_thread()
  50. sock.start()
  51.  
  52. 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.


Título: Re: [SOURCE] "Shell Remota" con Python con GUI (Tkinter)
Publicado por: _carlos_ en 2 Enero 2009, 02:43 am
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.