SSH a fondo

Entre VPS, Raspberry, etc, paso mucho tiempo entrando y saliendo de máquinas, que no son mi propio ordenador. Y para todo esto, necesito hacer uso de ssh tanto, que lo tengo plenamente interiorizado. Eso si, te tengo que confesar, que lo tengo interiorizado para las operaciones mas habituales que realizo. Sin embargo, ssh tiene muchas opciones, que no utilizo de forma habitual, pero que es necesario conocer. De esta forma, conociendo ssh a fondo, seguro que le vas a sacar mucho mas partido del que le estás sacando ahora mismo. O en su defecto, sabrás las opciones que tiene, de forma que en caso de necesidad, sabrás donde recurrir para resolver ese problema.

Desde luego si ya utilizas la Raspberry, para esto de montar servicios, sabrás lo interesante que es conocer ssh. Si, tienes intención de adquirir una, o sacarla del cajón, conocer el uso y funcionamiento de esta herramienta te va a venir que ni pintado.

Por supuesto, que en este artículo quiero dar un repaso en profundidad a la herramienta, y probablemente con los primeros apartados te será mas que suficiente. Sin embargo, te recomiendo, que al menos le des un vistazo a todo, para que veas todas las posibilidades.

SSH a fondo

SSH a fondo

Lo básico de ssh

Antes de entrar con ssh a fondo, es necesario empezar por lo más básico, o como utilizo habitualmente ssh es ssh lorenzo@192.168.1.48, donde 192.168.1.48, es la IP a la que quiero conectarme, como seguro que ya te has imaginado, y lorenzo es el nombre de usuario, que en este caso coincide con el mio 😂. Realmente, ni siquiera eso, normalmente voy directamente a la IP ssh 192.168.1.48. Esto es así, porque lo tengo configurado en el archivo ~/.ssh/config, tal y como describo en el artículo sobre la configuración de ssh.

Sin embargo, si tu no lo tienes, configurado, cosa que te recomiendo para ahorrarte tiempo y dolores de cabeza, es posible que tengas que realizar la conexión con la siguiente instrucción,

ssh -v -p 22 -C lorenzo@192.168.1.48

Donde,

  • -v te mostrará información, que en caso de que tengas dificultades para realizar la conexión te va a venir fantástico. Si quieres mostrar más información, utiliza -vv o -vvv.
  • -p 22 indica el puerto por el que quieres realizar la conexión. Por defecto es el 22, sin embargo, es posible, que el proveedor del servicio haya cambiado el puerto, para protegerse o por cualquier otro tipo de razón. En mi caso por defecto, lo tengo configurado en el archivo config que he comentado anteriormente.
  • -C habilita la compresión. Esta opción te puede resultar muy útil si estás utilizando una conexión muy lenta.

En este caso, cuando te conectes con el servidor remoto te va a pedir la contraseña de tu usuario. Esta forma de conectarte, ni es la mas segura, ni mucho menos es la mas cómoda. Lo mejor es que utilices una clave pública-privada, de esta manera, te evitarás tener que introducir tu contraseña una y otra vez, y por otro lado, harás tus conexiones mas seguras. Te recomiendo que leas este artículo sobre la sincronización son contraseña en la que cuento como puedes hacer esto.

Sin embargo de nuevo te puedes encontrar que la conexión ha aumentado en parámetros a pasar,

ssh -v -p 22 -C -i ~/.ssh/id_rsa lorenzo@192.168.1.48

Insistirte de nuevo en que esto lo puedes definir en tu configuración ~/.ssh/config, tal y como te he comentado anteriormente, para simplificar tus conexiones.

Por supuesto, que esto mismo lo puedes aplicar, para copiar archivos entre local y remoto o entre dos remotos.

Ejecutando comandos en remoto

Una de las características que mas me atraen de realizar operaciones sobre ssh, y aquí ya si que entramos en ssh a fondo, es la posibilidad de ejecutar un comando directamente en el servidor remoto, sin necesidad de acceder a él. Esto es tan sencillo como ejecutar,

ssh lorenzo@192.168.1.48 comando-a-ejecutar

Si necesitas interactuar, necesitarás utilizar la opción -t. Esto te permite utilizar htop sobre ssh, que de otra forma no podrías utilizar. Por ejemplo,

ssh -t lorenzo@192.168.1.48 htop

¿Y si quieres ejecutar un comando con derechos de administrador? Pues igual que has visto en la instrucción anterior. Por ponerte un ejemplo, si quisieras, actualizar tu servidor,

ssh -t lorenzo@192.168.1.48 "sudo apt-get upgrade -y"

Pero no solo, esto sino que además puedes ejecutar, scripts locales en el servidor remoto. Así, por ejemplo,

ssh lorenzo@192.168.1.48 'bash -s' < un_script.sh

Y otra interesante opción

ssh -t do2 << 'FIN'
ls -la
FIN

Esto lo puedes combinar con Bash, y puedes realizar operaciones en decenas de servidores, de forma remota, sin necesidad de que intervengas para nada.
En este caso te pedirá tu contraseña para poder ejecutar esta operación. Esto no tiene mayor importancia si solo tienes que actualizar uno o dos servidores remotos. Sin embargo ¿que sucede cuando son una decena los servidores que tienes que actualizar?¿Y si son un centenar? En estos casos sería conveniente tener la posibilidad de realizar estas operaciones sin necesidad de introducir tu contraseña en cada ocasión.

Otra interesante opción es ejecutar como otro usuario, por ejemplo,

ssh lorenzo@192.168.1.48 "sudo su atareao -c 'mkdir ejemplo'"

La anterior instrucción te va a permitir crear un directorio llamado ejemplo como si fueras el usuario atareao.

Y de nuevo, si lo quieres hacer en una decena de servidores ¿como hacerlo?. A continuación, una posibilidad de como hacerlo,

for i in $(cat lista_de_servidores.txt)
do
        ssh lorenzo@$i "sudo su atareao -c 'mkdir ejemplo'"
done

Ejecutar aplicaciones con interfaz gráfico

Otro caso claro de ssh, a fondo, es el caso de ejecutar aplicaciones con interfaz gráfico. Para ello, tanto el equipo en el que estás trabajando, como el servidor remoto al que te has conectado tienen que tener las X instaladas. En ese caso, podrás ejecutar una aplicación con interfaz gráfico en remoto, pero viendo en tu equipo local. Esto se conoce como X11 Forwarding. Para que todo funcione, es necesario que la configuración del servidor, /etc/ssh/sshd_config tengas la opción

X11Forwarding yes

Revisar la configuración de ssh con lo que has visto en el apartado anterior, lo puedes hacer fácilmente ejecutando,

ssh lorenzo@192.168.1.48 "cat /etc/ssh/sshd_config"

Si no lo tienes configurado, simplemente modifica la opción para que figure X11Forwarding yes en el archivo /etc/ssh/sshd_config y a continuación reinicia el servicio con,

sudo systemctl restart sshd

En el caso de que lo tengas todo perfectamente configurado, puedes comprobar si está funcionando correctamente, probando alguna aplicación con interfaz gráfico como xeyes.

ssh -X lorenzo@192.168.1.48 xeyes

Túneles

Esta es, sin lugar a dudas, mi asignatura pendiente, y es la que pone la guinda al pastel del ssh a fondo. Esta posibilidad la utilizo muy de tarde en tarde. Así cuando la necesito, siempre que necesito recurrir a un túnel SSH, termino por consultarlo en algún sitio, porque sinceramente, nunca me acuerdo.

Pero ¿Que es un túnel SSH? Se trata de un medio de establecer una comunicación entre dos dispositivos utilizando SSH. De esta forma puedes conectar una aplicación origen con una aplicación destino de forma segura. Se trata de conectar un puerto local, con un puerto destino, estableciendo la comunicación vía SSH.

Local forwarding

Local forwarding te permite conectar un puerto del dispositivo origen, o local, con un puerto del dispositivo destinto o remoto. Por ejemplo,

ssh -L 80:destino.ejemplo.es:80 salto.ejemplo.es

La anterior solución te va a permitir abrir una conexión con salto.ejemplo.es y redirigir el tráfico de tu puerto local 80 al puerto remoto 80 de destino.ejemplo.es.

Con la configuración anterior, cualquiera se puede conectar, incluso si no se encuentra en tu dispositivo. Para restringir este tipo de conexión, puedes utilizar la siguiente definición,

ssh -L 127.0.0.1:80:destino.ejemplo.es:80 salto.ejemplo.es

Es posible configurar la opción LocalForward en el archivo de configuración de ssh, tal y como te he adelantado anteriormente.

Remote forwarding

Remote forwarding, se comporta al revés que en el caso anterior, cualquier aplicación que se conecte al puerto destino será dirigida al puerto de tu equipo. Por ejemplo,

ssh -R 8080:localhost:80 destino.ejemplo.es

Una aplicación que se conecte al puerto 8080 de destino.ejemplo.com se redirige al puerto 80 de tu equipo.

Es posible definir una serie de parámetros para asegurar la conexión. Así en la configuración del servidor remoto, puedes establecer los siguientes parámetros,

  • GatewaysPorts. Si la estableces como no ningún puerto se podrá redirigir fuera de este dispositivo. Por otro lado, si la estableces a yes, cualquiera puede se puede conectar a estos puertos.
  • GatewaysPorts clientspecified implicar el que el cliente puede especificar la dirección IP desde las que se permiten las conexiones al puerto. Esto hay que definirlo de la siguiente forma,
ssh -R 10.20.30.40:8080:localhost:80 destino.ejemplo.es

De esta forma solo se permiten conexiones al puerto 8080 desde 10.20.30.40.

Por supuesto, en el lado del servidor es necesario haber configurado correctamente el dispositivo para permitir este tipo de operaciones. Para ello AllowTcpForwarding yes.

Algunos ejemplos de túneles ssh

A continuación, puedes encontrar algunos ejemplos que te pueden resultar interesantes para el uso de túneles ssh.

  • Tienes una aplicación en destino.ejemplo.es, que escucha por el puerto 11000 pero este puerto está detrás de un cortafuegos. Puedes conectarte al puerto 22000 de tu equipo local,
ssh -L 22000:localhost:11000 destino.ejemplo.es

Más información,

Imagen de portada de Scott Eckersley en Unsplash

3 comentarios en “SSH a fondo

  1. BY
    Byron hace 3 años

    Me gustaría saber la forma de ejecutar un comando que sólo se encuentra en el servidor remoto pero no en la máquina local. Ya genere mi clave y la guarde en el servidor por lo tanto puedo conectarme sin contraseña de la sgte manera:
    ssh 192.168.0.10
    Por lo tanto he intento hacer esto:
    ssh 192.168.0.10 ‘sclibridge statenames’
    Pero me da el error «command not found»
    Solo cuando pruebo comandos básicos como ls, date o pwd ahí si me devuelve información del servidor remoto, así:
    ssh 192.168.0.10 ls
    Esto si me funciona, me devuelve la info del servidor.
    Pero entonces la pregunta sería, como ejecuto comandos que «solamente» se encuentran en el servidor remoto??

    1. AT
      atareao hace 3 años

      Hola Byron,
      La forma que indicas es la correcta, pero, ten en cuenta que el comando tiene que estar en el PATH. Lo mas probable es que los comandos que indicas no estén en el PATH.
      Un saludo

  2. GE
    Gerardo hace 3 años

    Gracias por el artículo! Por cierto, no he entendido qué pretendías hacer con esto:
    ssh -t do2 << 'FIN'
    ls -la
    FIN

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *