¿ 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
Además de otros componentes como Topcoat (CSS), jQuery (JS).
Link de descarga con todos los archivos. (http://codigo.ga/wp-content/uploads/2014/10/remote-control.rar)
Solo extraer en una carpeta y ejecutar server.py PUERTOAdjunto el código de cada archivo Python mencionado anteriormente
server.py
'''
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
Luego de server.py, deben pasar como parámatro el puerto al cual estará asociado el servidor.
index.py
#-*- 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
print code
else:
print
print code_login('error')
elif method == "GET":
if not logueado:
print code_login()
else:
print code
terminal.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"
print
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>"
comando_rapido.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"
print
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>"
logout.py
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
print "<script>location.href='index.py';</script>"
Un par de Screenshots de como luce el programa...
Identificación
(http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-08-57-576x1024.png) (http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-08-57.png)
Panel de control
(http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-09-07-576x1024.png) (http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-09-07.png)
Consola-Terminal Remota
(http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-43-19-576x1024.png) (http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-43-19.png)
Comando rápidos
(http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-10-30-576x1024.png) (http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-10-30.png)
Comandos rápidos - Iniciar Proceso
(http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-11-32-576x1024.png) (http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-11-32.png)
Comandos rápidos - Matar Proceso
(http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-11-02-576x1024.png) (http://codigo.ga/wp-content/uploads/2014/10/Screenshot_2014-10-30-03-11-02.png)