¿ Qué es PC Control Remoto ?
PC Control Remoto es un programa/web desarrollado bajo el lenguaje de programación Python en conjunto con su librería CGI, la cuál nos permitirá montar un servidor CGI y poder llevar acabo nuestro cometido.
Este programa nos permitirá acceder a nuestro computador forma remota, con tu Navegador favorito, conectado vía LAN o a Internet (configuración aparte), desde cualquier navegador. Las funciones que nos brinda son las siguiente:
- Consola - Terminal remota: Puedes ejecutar cualquier comando y obtener su salida desde tu navegador.
- Comándos rápidos: Entre estos comándos rápidos tenemos las posibilidad de:
- Apagar PC. (60 segundos).
- Reiniciar PC. (60 segundos).
- Cancelar Apagado/Reinicio.
- Matar un proceso.
- Iniciar un proceso.
[/list]
El programa en general se compone de:
- Server.py - Programa encargado de crear el servidor bajo el puerto que queramos.
- Index.py - Login e inicio del Panel de Control.
- Terminal.py - Consola remota.
- Comando_rapido.py - Comandos rápidos.
- Logout.py - Cerrar sesión
Solo extraer en una carpeta y ejecutar server.py PUERTO
Adjunto el código de cada archivo Python mencionado anteriormente
server.py
Código
Luego de server.py, deben pasar como parámatro el puerto al cual estará asociado el servidor.
''' Autor: JaAViEr Twitter: @javieresteban__ Website: http://codigo.ga ''' from CGIHTTPServer import CGIHTTPRequestHandler from BaseHTTPServer import HTTPServer import socket import sys try: port = int(sys.argv[1]) if port: ip_interna = socket.gethostbyname(socket.gethostname()) print "Panel de control: http://%s:%s/cgi-bin/index.py" % (ip_interna, port) server_address=('', port) httpd = HTTPServer(server_address, CGIHTTPRequestHandler) httpd.serve_forever() except: print "-"*40 print "Uso:" print sys.argv[0], "PUERTO" print "-"*40 print "Ejemplo de uso:" print sys.argv[0], "5050" print "-"*40
index.py
Código
#-*- encoding:utf-8 -*- ''' Autor: JaAViEr Twitter: @javieresteban__ Website: http://codigo.ga ''' import cgi import os import Cookie import md5 lista_usuarios = ["admin", "JaAViEr"] #Usuarios lista_passwords = ["root", "toor"] # Contraseñas method = os.environ.get("REQUEST_METHOD") logueado = False contenido_cookies = os.environ.get('HTTP_COOKIE') tag_head = ''' <meta charset="UTF-8"> <link rel="stylesheet" type="text/css" href="/topcoat/css/topcoat-mobile-dark.min.css" class="uib-framework-theme"> <link rel="stylesheet" type="text/css" href="/css/index_main.less.css" class="main-less"> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0"> <style type="text/css"> /* Prevent copy paste for all elements except text fields */ * { -webkit-user-select:none; -webkit-tap-highlight-color:rgba(255, 255, 255, 0); } input, textarea { -webkit-user-select:text; } </style> <script type="application/javascript" src="/js/jquery.min.js"></script> <script type="application/javascript" src="/js/index_user_scripts.js"></script>''' def code_login(accion=False): if accion == 'error': mensaje_error = ''' <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="topcoat/nav" data-ver="0"> <div class="topcoat-navigation-bar__item center full"> <h1 class="topcoat-navigation-bar__title">Verifica tus credenciales por favor[/size][/center] </div> </div> ''' else: mensaje_error = '' return ''' <!DOCTYPE html> <html> <head> ''' + tag_head + ''' <title>Indetifícate en el sistema</title> </head> <body> <div class="uwrap"> <div class="upage" id="mainpage"> <div class="upage-outer"> <div class="upage-content" id="mainsub"> <div class="grid grid-pad urow uib_row_2 row-height-2" data-uib="layout/row" data-ver="0"> <div class="col uib_col_2 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="topcoat/nav" data-ver="0"> <div class="topcoat-navigation-bar__item center full"> <h1 class="topcoat-navigation-bar__title">Indentifícate[/size][/center] </div> </div> <span class="uib_shim"></span> </div> </div> <span class="uib_shim"></span> </div> <div class="grid grid-pad urow uib_row_3 row-height-3" data-uib="layout/row" data-ver="0"> <form action="" method="POST"> <div class="col uib_col_3 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <div class="table-thing widget uib_w_2 d-margins" data-uib="topcoat/input" data-ver="0"> <label class="narrow-control label-top-left">Usuario</label> <input class="wide-control topcoat-text-input" type="text" placeholder="Usuario" name="usuario"> </div> <div class="table-thing widget d-margins" data-uib="topcoat/input" data-ver="0"> <label class="narrow-control label-top-left">Contraseña</label> <input class="wide-control topcoat-text-input" type="password" placeholder="Contraseña" name="password"> </div> <button class="widget d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0">Ingresar</button><span class="uib_shim"></span> </div> ''' +mensaje_error+ ''' </form> </div> <span class="uib_shim"></span> </div> </div> <!-- /upage-content --> </div> <!-- /upage-outer --> </div> <!-- /upage --> </div> <!-- /uwrap --> </body> </html>''' code = '''<!DOCTYPE html> <!--HTML5 doctype--> <html> <head> ''' + tag_head + ''' <title>Control Remoto :: 2014</title> </head> <body> <!-- content goes here--> <div class="uwrap"> <div class="upage" id="mainpage"> <div class="upage-outer"> <div class="upage-content" id="mainsub"> <div class="grid grid-pad urow uib_row_1 row-height-1" data-uib="layout/row" data-ver="0"> <div class="col uib_col_2 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <div class="topcoat-navigation-bar widget uib_w_2 d-margins" data-uib="/topcoat/nav" data-ver="0"> <div class="topcoat-navigation-bar__item center full"> <h1 class="topcoat-navigation-bar__title">Panel de Control Remoto[/size][/center] </div> </div> <button class="widget uib_w_4 d-margins topcoat-button--large--cta" data-uib="/topcoat/button" data-ver="0">Consola - Terminal</button> <button class="widget uib_w_3 d-margins topcoat-button--large--cta" data-uib="/topcoat/button" data-ver="0">Enviar comando rápido</button> <button class="widget uib_w_5 d-margins topcoat-button--large" onclick='location.href="logout.py"' data-uib="/topcoat/button" data-ver="0">Salir</button> <span class="uib_shim"></span> </div> </div> <span class="uib_shim"></span> </div> </div> <!-- /upage-content --> </div> <!-- /upage-outer --> </div> <div class="upage hidden" id="uib_page_3"> <div class="upage-outer"> <div id="uib_page_3sub" class="upage-content "> </div> </div> <!-- /upage-outer --> te </div> <div class="upage hidden" id="uib_page_2"> <div class="upage-outer"> <div id="uib_page_2sub" class="upage-content "> </div> </div> <!-- /upage-outer --> </div> <div class="upage hidden" id="uib_page_1"> <div class="upage-outer"> <div id="uib_page_1sub" class="upage-content "> </div> </div> <!-- /upage-outer --> </div> <!-- /upage --> </div> <!-- /uwrap --> </body> </html>''' def verificar_login(u, p): if u in lista_usuarios and p in lista_passwords: session = u + p session = md5.md5(session).hexdigest() return True else: return False if contenido_cookies: #Si hay cookies... valores_cookie = Cookie.SimpleCookie(contenido_cookies) session_actual = valores_cookie['sess'].value # session_actual = cookie "sess" if session_actual == "false": # No logueado logueado = False else: # Verifica login for a, b in zip(lista_usuarios, lista_passwords): session_temporal = a + b session_temporal = md5.md5(session_temporal).hexdigest() if session_actual == session_temporal: logueado = True # Login coincide break else: pass else: #No logueado, sess = false print "Set-Cookie:sess=false" print "Content-Type: text/html" if method == "POST": form = cgi.FieldStorage() usuario = form.getvalue('usuario') password = form.getvalue('password') if verificar_login(usuario, password): session = usuario + password session = md5.md5(session).hexdigest() print "Set-Cookie:sess=%s" % session print code else: print code_login('error') elif method == "GET": if not logueado: print code_login() else: print code
terminal.py
Código
comando_rapido.py
#-*- encoding:utf-8 -*- ''' Autor: JaAViEr Twitter: @javieresteban__ Website: http://codigo.ga ''' import cgi import os import Cookie import md5 print "Content-Type: text/html" code_terminal = ''' <!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="/topcoat/css/topcoat-mobile-dark.min.css" class="uib-framework-theme"> <link rel="stylesheet" type="text/css" href="/css/terminal_main.less.css" class="main-less"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0"> <title>Terminal</title> <script src="/js/jquery.min.js"></script> </head> <body> <div class="uwrap"> <div class="upage" id="mainpage"> <div class="upage-outer"> <div class="upage-content" id="mainsub"> <div class="grid grid-pad urow uib_row_1 row-height-1" data-uib="layout/row" data-ver="0"> <div class="col uib_col_1 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="/topcoat/nav" data-ver="0"> <div class="topcoat-navigation-bar__item center full"> <h1 class="topcoat-navigation-bar__title">Consola - Terminal[/size][/center] </div> </div> <div class="table-thing widget uib_w_2 d-margins" data-uib="/topcoat/textarea" data-ver="0"> <label class="narrow-control label-inline"></label> <textarea class="wide-control topcoat-textarea" type="text" placeholder="Comandos" name="comando"></textarea> </div> <button class="widget uib_w_2 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick='execute();'>¡Ejecutar!</button> <button class="widget uib_w_2 d-margins topcoat-button" data-uib="topcoat/button" data-ver="0" onclick='location.href="index.py"'>Volver</button> <hr> Salida: <span id="loader"></span> <span class="uib_shim"></span> </div> </div> <span class="uib_shim"></span> </div> </div> <!-- /upage-content --> </div> <!-- /upage-outer --> </div> <!-- /upage --> </div> <!-- /uwrap --> <script language="javascript"> function execute(){ comando = $("textarea[name=comando]").val(); $("#loader").load("terminal.py", {"comando":comando}); } </script> </body> </html>''' logueado = False lista_usuarios = ["admin", "JaAViEr"] #Usuarios lista_passwords = ["root", "toor"] # Contraseñas method = os.environ['REQUEST_METHOD'] lectura_cookies = os.environ.get('HTTP_COOKIE') if lectura_cookies: valores_cookie = Cookie.SimpleCookie(lectura_cookies) session_actual = valores_cookie['sess'].value # session_actual = cookie "sess" if session_actual != "false": for a, b in zip(lista_usuarios, lista_passwords): session_temporal = a + b session_temporal = md5.md5(session_temporal).hexdigest() if session_actual == session_temporal: logueado = True # Login coincide break else: pass else: pass if logueado: if method == "GET": print code_terminal elif method == "POST": form = cgi.FieldStorage() comando = form.getvalue("comando") lineas = comando.split("\n") print ''' <span style="font-family:Trebuchet Ms; color: #fff;" class="wide-control"> <br /> ''' for l in lineas: try: run = os.popen(l, "r") run_content = run.read() run_content = run_content.replace("\n", "<br>") run_content = run_content.replace(" ", " ") print run_content run.close() except: print "Error al ejecutar comando %s" % (l) print "</span>" else: print "<script>location.href='index.py';</script>"
Código
logout.py
#-*- encoding:utf-8 -*- ''' Autor: JaAViEr Twitter: @javieresteban__ Website: http://codigo.ga ''' import cgi import os import subprocess import Cookie import md5 print "Content-Type: text/html" code_terminal = ''' <!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="/topcoat/css/topcoat-mobile-dark.min.css" class="uib-framework-theme"> <link rel="stylesheet" type="text/css" href="/css/terminal_main.less.css" class="main-less"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0"> <title>Comandos rápidos</title> <script src="/js/jquery.min.js"></script> </head> <body> <div class="uwrap"> <div class="upage" id="mainpage"> <div class="upage-outer"> <div class="upage-content" id="mainsub"> <div class="grid grid-pad urow uib_row_3 row-height-3" data-uib="layout/row" data-ver="0"> <div class="col uib_col_3 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="topcoat/nav" data-ver="0"> <div class="topcoat-navigation-bar__item center full"> <h1 class="topcoat-navigation-bar__title">Comandos rápidos[/size][/center] </div> </div> <span class="uib_shim"></span> </div> </div> <span class="uib_shim"></span> </div> <div class="grid grid-pad urow uib_row_4 row-height-4" data-uib="layout/row" data-ver="0"> <div class="col uib_col_4 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <button class="widget uib_w_2 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="comando('apagar'); return false;">Apagar</button> <button class="widget uib_w_3 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="comando('reiniciar'); return false;">Reiniciar</button> <button class="widget uib_w_4 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="comando('cancelar salida'); return false;">Cancelar Apagado/Rein.</button> <button class="widget uib_w_5 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="matar_proceso('mostrar'); return false;">Matar proceso</button> <span id="matar_proceso" style="display:none"> <hr> <input class="wide-control topcoat-text-input" type="text" placeholder="proceso.ext" name="proceso"> <button class="widget uib_w_6 d-margins topcoat-button wide-control" data-uib="topcoat/button" data-ver="0" onclick="matar_proceso('kill'); return false;">¡Matar ahora!</button> <hr> </span> <button class="widget uib_w_6 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="iniciar_proceso('mostrar'); return false;">Iniciar proceso</button> <span id="iniciar_proceso" style="display:none"> <hr> <input class="wide-control topcoat-text-input" type="text" placeholder="proceso.ext" name="iniciar_proceso"> <button class="widget uib_w_6 d-margins topcoat-button wide-control" data-uib="topcoat/button" data-ver="0" onclick="iniciar_proceso('iniciar'); return false;">¡Iniciar ahora!</button> <hr> </span> <button class="widget uib_w_2 d-margins topcoat-button" data-uib="topcoat/button" data-ver="0" onclick='location.href="index.py"'>Volver</button> <span class="uib_shim"></span> </div> </div> <span class="uib_shim"></span> </div> </div> <!-- /upage-content --> </div> <!-- /upage-outer --> </div> <!-- /upage --> </div> <!-- /uwrap --> </body> <span id="loader" style="display:none;"></span> <script language="javascript"> function comando(cmd){ $("#loader").load("comando_rapido.py", {"comando":cmd}); } function matar_proceso(param){ if(param == 'mostrar'){ $("#matar_proceso").fadeIn(); $("#iniciar_proceso").fadeOut(); }else if(param == 'kill'){ proceso = $("input[name=proceso]").val(); $("#loader").load("comando_rapido.py", {"kill": proceso}); $("#matar_proceso").fadeOut(); $("input[name=proceso]").val(""); } } function iniciar_proceso(accion){ if (accion == "mostrar"){ $("#matar_proceso").fadeOut(); $("#iniciar_proceso").fadeIn(); }else if(accion == "iniciar"){ nuevo_proceso = $("input[name=iniciar_proceso]").val(); $("#loader").load("comando_rapido.py", {"correr": nuevo_proceso}); $("#iniciar_proceso").fadeOut(); $("input[name=iniciar_procesoproceso]").val(""); } } </script> </html>''' logueado = False lista_usuarios = ["admin", "JaAViEr"] #Usuarios lista_passwords = ["root", "toor"] # Contraseñas method = os.environ['REQUEST_METHOD'] lectura_cookies = os.environ.get('HTTP_COOKIE') if lectura_cookies: valores_cookie = Cookie.SimpleCookie(lectura_cookies) session_actual = valores_cookie['sess'].value # session_actual = cookie "sess" if session_actual != "false": for a, b in zip(lista_usuarios, lista_passwords): session_temporal = a + b session_temporal = md5.md5(session_temporal).hexdigest() if session_actual == session_temporal: logueado = True # Login coincide break else: pass else: pass if logueado: if os.name == "nt": so = "windows" else: so = "unix" if method == "GET": print code_terminal elif method == "POST": form = cgi.FieldStorage() comando = form.getvalue("comando") kill = form.getvalue("kill") correr = form.getvalue("correr") iniciar_proceso = "" matador = "" try: if correr: if so == "windows": iniciar_proceso = "start %s" % (correr) elif so == "unix": iniciar_proceso = "%s" % (correr) subprocess.call(iniciar_proceso) if kill: if so == "windows": matador = "taskkill /F /IM %s" % (kill) elif so == "unix": matador = "pkill -9 %s" % (kill) kill = subprocess.call(matador) kill.close() if comando == "apagar": if so == "windows": accion = "shutdown /S /T 60" elif so == "unix": accion = "sudo poweroff" elif comando == "reiniciar": if so == "windows": accion = "shutdown /R /T 60" elif so == "unix": accion = "sudo reboot" #accion = "" elif comando == "cancelar salida": if so == "windows": accion = "shutdown /A" elif so == "unix": accion = "" #accion = "" action = subprocess.call(accion) action.close() except: pass else: print "<script>location.href='index.py';</script>"
Código
import cgi ''' Autor: JaAViEr Twitter: @javieresteban__ Website: http://codigo.ga ''' print "Content-Type: text/html" print "Set-Cookie: sess=false" print "Location:index.py" print "<script>location.href='index.py';</script>"
Un par de Screenshots de como luce el programa...