Cómo mandar comandos remotos en Bash por SSH

Bueno, bastaría con hacer login en la máquina remota que tengamos que administrar y empezar a operar desde terminal. Pero si ese día te pilla mal, simplemente estás vago o quieres optimizar tu tiempo debes saber que puedes enviar comandos Bash remotamente que además te pueden ayudar en tus tareas administrativas más rutinarias.

La primera recomendación para poder enviar comandos bash remotamente sería configurar la autenticación SSH sin contraseña. Si no lo quieres hacer tampoco pasa nada, pero por cada conexión remota tendrás que volver a introducir la contraseña y se puede hacer algo tedioso… Vamos a ello:

  • Genera el par de claves pública y privada:
    ssh-keygen -r rsa
  • Copia la clave pública desde mi máquina a la remota, con el usuario que posteriormente ejecutará los comandos remotamente. Recalco esto último ya que la clave pública que estamos copiando al otro servidor es exclusiva para cada usuario, por lo que si luego intentas ejecutar comandos con otro, tendrás que introducir la contraseña. En mi caso copio la clave pública que he generado en mi máquina con el usuario jota al servidor remoto 192.168.2.102 con la utilidad ssh-copy-id:
    ssh-copy-id 192.168.2.102

Una vez realizados estos sencillos pasos, supongamos que ahora quisiera saber la carga del servidor remoto (192.168.2.102) con el usuario jota, que es el que he utilizado para configurar la autenticación con clave pública sin contraseña. Bastaría con hacer:

ssh jota@192.168.2.102 uptime

Y así con todo. Para ver el contenido del home del usuario jota en 192.168.2.102:

ssh jota@192.168.2.102 ls -l /home/jota

Esto que parece una tontería y trivialidad tiene aplicaciones muy útiles para los administradores de sistemas. Pongamos por ejemplo que administramos los servidores del rango 192.168.2.102 al 140. Con un sencillo bucle for que recorriera todas esas máquinas haciendo un uptime remoto, tendríamos un sencillo resumen del estado de nuestro entorno, pudiendo ver de una pasada qué servidores tienen más carga de trabajo:

for ((i=102;i>=140;++i)); do

IP=192.168.2.$i
ssh jota@$IP uptime

done

Y donde digo carga de servidor con uptime, también podemos comprobar si determinados servicios están activos, espacio en disco, programar apagados de máquinas remotas con un cron local…