Pregunta:
Fecha: 14-06-2018 05:31:59
(En Español)
Gracias Votos: 2 - Respuestas: 6 - Vistas: 15 Compartir en: Google Facebook Twitter LinkedIn Link
Acceso remoto en PHP[No resuelta]
Hola a todos no se si me puedan ayudar sera que si hay como hacer en php y mysql para hacer tipo acceso remoto desde mi maquina a otra maquina , ocea la idea es mas omenos hacer algo tipo aula virtual que se registren los estudiantes y hacer tipo streeam y poderme conectar a otra maquina o compartir pantalla no se si me pueden ayudar.Gracias Votos: 2 - Respuestas: 6 - Vistas: 15 Compartir en: Google Facebook Twitter LinkedIn Link
Respuestas:
-
Fecha: 14-06-2018 07:42:29 Hola, Edwin. ¡Sin duda, una pregunta interesante!
Manipular el acceso remoto a un nodo interconectado en red, ya sea LAN (Local Area Network) o WAN (Wide Area Network, o bien, Internet), con PHP, puede resultar un tanto complicado, por las configuraciones que se tienen que hacer por debajo (puede sonar irónico, ya que PHP es Back-End).
De momento, no he encontrado una solución concreta con sólo PHP y que trabaje como un software RDP (Remote Desktop) o VNC (Virtual Network Computing).
0. Solución principal: Apache Guacamole
Se me ocurren un par de ideas:
1. Se puede iniciar instalando el servicio SSH (Secure Shell), para crear conexiones remotas, a posteriori? de haber instalado la librería correspondiente para la manipulación de SSH desde PHP. La puede descargar desde acá: libssh2.
Te adjunto un pequeño código; lo que hace es conectarse a un host remoto por medio de SSH desde PHP, para realizar alguna petición de información, en este caso llama algunos datos del sistema opertativo remoto, como: Hostname, NameOS, Versión, TypeMachine, Kernel.<?php class ConnectSSH { public $ip_host; private $username; private $password; public $connect; private $stream; private $errors = array(); //En este caso la estoy pensando para Linux, distros basadas en Debian private $local_path = "/var/www/html/MyProject/"; private $remote_path; private $filename; //Se realiza la conexion SSH desde PHP, utilizando la librería libssh2. function __construct($ip_host, $username, $password){ if (!function_exists("ssh2_connect")) array_push($this->errors, "La función ssh2_connect no existe"); if(!($this->connect = @ssh2_connect($ip_host, 22))){ $this->ip_host = $ip_host; array_push($this->errors, "No hay conexión con al dirección IP: " . $ip_host); } else { if(!ssh2_auth_password($this->connect, $username, $password)) { array_push($this->errors, "Autenticación invalida"); } else { $this->ip_host = $ip_host; $this->username = $username; $this->password = $password; $this->remote_path = "/home/"; } } } //Escribe un archivo con todas las instrucciones. public function writeFile($Instructions, $filename){ $inputfile = file_put_contents($this->local_path.$filename, implode("\n", $Instructions)); if ($inputfile === false) die("El script <b>".$filename."</b>, no se ha podido crear."); @chmod($this->local_path.$filename, 0777); return true; } //Envía el fichero por SCP, con todas las instrucciones a ejecutar en la máquina remota. public function sendFile($filename){ $scp = ssh2_scp_send($this->connect, $this->local_path.$filename, $this->remote_path.$filename, 0777); if (!$scp){ return false; } else { return true; } } // Ejecuta las líneas de instrucciones para el intérprete public function RunLines($RL){ if(!($this->stream = ssh2_exec($this->connect, $RL))) return "Falló: El comando no se ha podido ejecutar."; stream_set_blocking($this->stream, true); while ($buf = fread($this->stream, 4096)) $data .= $buf; if (fclose($this->stream)) return $data; } //Obtiene la información del OS, método de acción. public function getInfoOS(){ $filename = "getInfoOS.sh"; $ActionArray[] = "HostName=$(hostname)"; array_push($ActionArray, "NameOs=$(lsb_release -si)"); array_push($ActionArray, "Version=$(lsb_release -sr)"); array_push($ActionArray, "TypeMachine=$(uname -m)"); array_push($ActionArray, "Kernel=$(uname -r)"); array_push($ActionArray, 'echo "$HostName,$NameOs,$Version,$TypeMachine,$Kernel,"'); $RL[] = $this->remote_path.$filename; array_push($RL, "rm -rf ".$this->remote_path.$filename); if ($this->writeFile($ActionArray, $filename) && $this->sendFile($filename)) return $this->RunLines(implode("\n", $RL)); return getErrors(); } public function getErrors(){ return implode("<br/>", $this->errors); } } // Se le pasa la dirección IP del Host, el nombre de usuario y la contraseña. echo (new ConnectSSH("192.168.100.2", "network", "123"))->getInfoOS();
Si le interesa ver el código un poco más amplio, le comparto la fuente en GitHub, clase gn.ssh.class.php, claramente no tiene todas las formalidades de PHP, pero no deja de ser un código funcional.
A qué quiero llegar con esto, a que aunque no controle con una interfaz gráfica el host remoto, al menos tenga imágenes sobre ella; de este modo, para que obtenga capturas de pantalla con la conexión realizada con SSH. Luego con un tiempo establecido, haga capturas que las vaya mostrando como fotogramas, pero también hay que tomar el tiempo de conexión que hará PHP por SSH.
El detalle es que la configuración mencionada será grande, ya que tiene que instalar el servicio SSH en los demás ordenadores conectados en red, por otro lado, tendrá que adiestrar el Firewall para que no hayan restricciones para el puerto o protocolo correspondiente del servicio SSH, ya sea servidor o cliente; al final es una comunicación por sockets.
2. Toma una captura de pantalla de la pantalla completa.
Utilizando la biblioteca GD, para manipular la función imagegrabscreen.<?php $count = 0; while (1){ $im = imagegrabscreen(); imagepng($im, "my_screenshot".$count++.".png"); imagedestroy($im); }
Partiendo del código anterior, este tomará todas las capturas de pantalla posibles hasta que se cancele la carga del script PHP. Centrándome en la idea principal de la pregunta, habrá que mandar a ejecutar este script PHP a la máquina remota y retornar los ficheros obtenidos, claramente, cada cierto tiempo, como los fotogramas que mencionaba.
El problema con este script, es que habrá que realizar un cambio en la configuración de PHP, precisamente en la directiva del tiempo de ejecución máximo, para que por omisión no sean 30 segundos.
3. Otra idea, es utilizando software de terceros, pero que son los ideales para realizar tal acción.
Me refiero al RDP, ya sea para Linux o Windows. Normalmente tienen línea de comandos, por lo que se puede hacer una conexión desde PHP con las funciones: exec, shell_exec, passthru. Solo que dependiendo de esas herramientas.
Algunas herramientas: TigerVNC, RealVNC, TeamViewer, Remmina, NoMachine, Apache Guacamole (esta es la solución que busca), XRDP, FreeNX, Remote Utilities, UltraVNC, AeroAdmin, Windows Remote Desktop (Este lo puede hacer por línea de comandos), AnyDesk, RemotePC, Chrome Remote Desktop, LiteManager, [...], entre otros.
Espero le sirva de algo la información. Estaré viendo sus comentarios. ¡Saludos, Edwin! Votos: 3 - Link respuesta -
Fecha: 22-06-2018 06:29:41 He utilizado en moodle (que es PHP) openmeetings, permite justamente lo que dices y como servidor de media streaming usa RED5. Tal vez puedas ver como funciona y guiarte.
Saludos. Votos: 2 - Link respuesta -
Fecha: 22-06-2018 06:41:37 yo necesitaba implementar algo similar pero por cuestión de tiempo combinado con flojera termine usando google meet/hangouts usando la api de google calendar para crear una conferencia y obtener la url la cual ya muestro a los estudiantes inscritos en el mismo grupo. Es simple pero funciona bien.
Votos: 0 - Link respuesta
-
Fecha: 22-06-2018 14:30:58 Hola, Jorge.
Interesante su respuesta.
¿Funciona en una LAN?
¡Saludos! Votos: 0 - Link respuesta -
Fecha: 22-06-2018 15:31:16 Lo de openmeetings en moodle con red5 seguro q funciona en LAN, nomaj configurar bien los servicios. Lo de google meet/hangouts no. Votos: 1 - Link respuesta
-
Fecha: 23-06-2018 02:13:24 Ok. Gracias por el dato, Jorge. Investigaré un poco más al respecto.
¡Saludos! Votos: 0 - Link respuesta
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
