Creando conexiones SSH con PHP

June 18, 2021

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.

Instalar libssh2-php

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

Nuestra primera conexión

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]

Nuestro primer comando

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]

Conectando al VPS con una llave pública

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.

Conclusión

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.

Extra: Librerías de conexión SSH

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:

  • phpseclib: Una librería creada en puro PHP que no requiere de librerías adicionales para crear conexiones SSH.
  • Net_SSH2: El conector de PEAR.