Las conexiones SSH son muy populares cuando se tienen VPS (Virtual Private Servers), todas las instalaciones y configuraciones de nuestros servidores se pueden realizar directamente desde la terminal con una conexión root.
Con PHP podemos realizar conexiones SSH a estos servidores y ejecutar comandos desde nuestra aplicación local o desde otro servidor, o podemos programar Cron Jobs para que ejecute una limpieza o descargue los respaldos del VPS a nuestra maquina.
Instalaremos soporte de SSH para PHP en Ubuntu 12.04 en adelante.
[prism:php]sudo apt-get install libssh2-1-dev libssh2-php[/prism:php]
Para verificar que está correctamente instalado:
[prism:php]php m |grep php[/prism:php]
Si todo está correcto, debe retornar: ssh2
Lo primero que debemos hacer es verificar que la conexión con ssh es posible desde php:
[prism:php]<?php if (!function_exists('ssh2_connect')) { die('No existe la funcion ssh2_connect.'); }[/prism:php]
Si la función existe, pasamos a verificar que pueda existir una conexión SSH al servidor:
[prism:php]<?php if (!($connection = ssh2_connect('mivps.server.com', 22))) { die('No se puede conectar con el servidor VPS.'); }[/prism:php]
Para este ejemplo, crearemos la conexión mediante usuario y clave, recordemos que de esta forma podríamos tener información sensitiva disponible dentro de nuestro código y eso es considerado un problema de seguridad:
[prism:php]<?php if (!ssh2_auth_password($connection, 'root', 'mypassword')) { die('No se puede autenticar con el usuario y clave suministrados.'); }[/prism:php]
Si la conexión es exitosa y ya estamos dentro de nuestro VPS, podemos ejecutar nuestro primer comando:
[prism:php]<?php if (!($exec = ssh_exec($connection, 'ls -l'))) { die('No se pudo ejecutar el comando.'); }[/prism:php]
Si todo está correcto, nuestro primer comando ya corrió en el servidor, pero, ¿Cómo sabemos que realmente funcionó?
Para ello, vamos primero a ver cómo podemos mostrar los mensajes de la consola del VPS en PHP:
[prism:php]<?php if (!($exec = ssh_exec($connection, 'ls -l'))) { die('No se pudo ejecutar el comando.'); } else { stream_set_blocking($exec, true); $data = ''; while ($fread = fread($exec, 4096)) { $data .= $fread; } fclose($exec); }[/prism:php]
En el código anterior utilizamos ssh_exec para ejecutar los comandos en la terminal del VPS, pero también podemos utilizar shel_exec:
[prism:php]<?php if (!$($shell_exec = ssh2_shell($connection, 'vt102', null, 80, 24, SSH2_TERM_UNIT_CHARS))) { die('No se pudo ejecutar el comando'); }[/prism:php]
Para hacer un poco más segura la conexión a nuestro VPS podemos utilizar una llave pública.
En la terminal de nuestro computador ejecutamos los siguientes comandos para crear un par de llaves (privada/publica): [prism:php]cd ~/.ssh ssh-keygen[/prism:php]
Dejamos todos los valores por defecto Una vez creadas nuestras llaves, agregamos un array como tercer parámetro a la conexión y sustituimos el comando ssh2_auth_password por el siguiente:
[prism:php]<?php $connection = ssh2_connect('mivps.server.com', 22, array('hostkey' => 'ssh-rsa'));
if (ssh2_auth_pubkey_file($connection, 'root', 'home/nombredeusuario/.ssh/id_rsa.pub', 'home/nombredeusuario/.ssh/id_rsa')) { die('No se pudo realizar la conexión con el servidor.') }[/prism:php] Con esto ya podemos ejecutar conexiones a nuestro VPS con llaves SSH desde PHP.
Podemos programar y ejecutar muchos comandos por medio de conexiones SSH para hacer mantenimiento a uno o más servidores desde una aplicación PHP ubicada en nuestro servidor local u otro VPS.
Con estos comandos podemos crear conexiones SSH directamente desde nuestro PHP, pero ya existen algunas librerías que aseguran o mejoran este tipo de conexiones:
Te recomendamos en video