SSH: La navaja suiza del administrador de sistemas

Secure SHell (SSH) es un intérprete de ordenes remoto. Su principal uso es para la administración de sistemas remotos. Reemplaza al antiguo e inseguro “rlogin” mediante el uso de TLS (lo que añade cifrado de datos y evita el man-in-the-middle attack).

El uso habitual de SSH es:


ssh <usuario-remoto>@<host>

Si conecta con el equipo remoto, sólo nos basta introducir la contraseña y estaremos dentro.

Si sólo queremos ejecutar una orden o un script determinado, añadimos el comando al final. Un ejemplo habitual es reiniciar una máquina.


ssh root@server1.dominio.com reboot

Visto su uso habitual veamos otros ejemplos muy útiles para llevar mejor el día a día del administrador de sistemas.

Túnel proxy

Si no estamos muy seguros de que nuestra navegación web pase por un canal seguro (sin fisgones), podemos hacer un canal seguro entre nuestro equipo y nuestro servidor de confianza (si no teneis uno, podeis lanzar una micro-instancia de Amazon EC2, tendréis un buen proxy server por $0,02 por hora).

El tunel se establece así:


ssh  -D 8080 <user>@<host>

La opción -D 8080, indica que queremos hacer un túnel asociado al puerto local 8080. Sólo nos quedaría configurar nuestro navegador web para usar como proxy SOCKS el equipo “localhost” en el puerto 8080.

SSH con interfaz gráfica

Si no os sentís cómodos con la línea de comandos, o bien necesitáis correr una aplicación gráfica, SSH tambíen tiene una opción para ayudaros. Sólo necesitais estar ejecutando un servidor X Window (normalmente Xorg Server) en vuestra máquina y redireccionar el tráfico X11 hacia ella.


ssh  -Y <user>@<host>

El argumento “-Y” hará todo el trabajo de redirección por nosotros. Sólo nos queda ejecutar nuestra aplicación gráfica (Ej. netbeans).

Tunel proxy estático

Es una variante del túnel anterior pero con la particularidad de poder especificar el puerto de destino en el host remoto. Se ve mejor con un ejemplo.

Suponed que habéis desarrollado una aplicación servidor que recibe un mensaje y lo redistribuye vía Twitter a una cuenta especificada (vale cualquier otra aplicación imaginable). Esta aplicación escucha los mensajes en el puerto 1234.  Como ibais justo de tiempo (algo demasiado habitual) habéis optado por no usar TLS para cifrar la comunicación y utilizar en su lugar un canal SSH.

La solución es sencilla. El cliente tiene que asociar un puerto del equipo local al puerto de aplicación del servidor mediante la siguiente sintaxis.


ssh  -L <puerto-local>:<host-server>:1234 <user>:<remote-server>

Hay que especificar que <host-server> no tiene porqué ser igual a <remote-server>. Si tanto el equipo donde corre el servidor SSH como el que corre la aplicación servidor, son el mismo, la sintaxis sería:


ssh  -L <puerto-local>:localhost:1234 <user>:<remote-server>

Si no coinciden lo que ocurre es que habría una comunicación no segura entre <remote-server> y <host-server>.

Bueno, estas son algunas de las utilidades más importantes de SSH. Existen otras como “scp” (para copiar archivos) o “sftp” (ssh ftp).

Sólo deciros que si sois usuarios de Windows, podéis usar PuTTY.

Translate to:English
MenefanteMenéame TwitterTwitter

[Tip]: Liberar espacio en GNU/Linux

Os traigo un “mini” tip.

Posiblemente alguna vez os habéis encontrado en la situación de tener poco espacio libre en disco. Aquellos users que venga de Windows XP (o “superior”) saben que había una utilidad que permite liberar espacio.

En GNU/Linux como tal no existe utilidad parecida. Algunas distros si tienen aplicaciones para tal tarea pero no se han convertido en estándar de facto. Además, en la mayoria de los casos requiere instalar uno o varios paquetes, lo cual choca con el hecho de querer liberar espacio.

Hay una solución más sencilla y que no requiere de más búsquedas y/o instalaciones: find.

Esta utilidad es muy útil porque puede buscar ficheros según muchos criterios. En el caso que nos ocupa, yo suelo especificar una búsqueda de ficheros “grandes”  (más de 50 megas) y posteriormente paso a su eliminación (si procede).

Os dejo con la sintaxis, ¡que aproveche! 🙂

 find ~ -size "+50M" 

Translate to:English
MenefanteMenéame TwitterTwitter

Twitter trends desde la shell

Twiter Trend desde Bash

Twiter Trend desde Bash

Se acabaron las vacaciones. El primer post de este año trata sobre un script que hice estas navidades.

La shell de GNU/Linux es muy potente. Hace tiempo vi una opción de la shell bash (por defecto en casi todas las distribuciones) que permite hacer conexiones TCP/IP de una forma sencilla y elegante.

Para demostrar su uso he decidido hacer un pequeño script bash que vaya mostrando el Top-Ten de las tendencias en Twitter. Una tendencia (trend) es una palabra que se usa masivamente en los tweets de todo el mundo. En fin de año, el hashtag #HappyNewYear fue un trend.

El script lo he desarrollado sobre la shell bash de Ubuntu. Por motivos de seguridad, la gente de Canonical deshabilita la opción de conexiones TCP/IP para bash, así que es necesario recompilar bash sin dicha restricción.

  1. Obtenemos el fuente:
    
    apt-get source bash
    cd bash-3.2/
    
    
  2. Editamos el archivo debian/rules y eliminamos la línea “--disable-net-redirections \
  3. Generamos el paquete:
            dkpg-buildpackage -rfakeroot
            

    Es posible que necesites instalar algunos paquetes necesarios para la generación. En mi caso fue sharutils.

  4. Instalamos nuestra “nueva” bash.
    sudo apt-get install ../bash-3.2*deb
    

Este es el código del script:


#!/bin/bash

GREEN='\e[0;32m'
BLUE='\e[0;34m'
RED='\e[0;31m'

NONE='\e[0m'

while [ 1 ]; do

exec 3<>/dev/tcp/search.twitter.com/80
echo -e "GET /trends/current.json\n\n" >&3
text=`cat <&3`

clear
echo -e $GREEN "Twitter current trends\n\n" $NONE
ind=1
while [ 1 ]; do
       textp=${text#*\"name\":\"}
       if [ "$textp" = "$text" ]; then
	       break
       else
           text="$textp"
       fi

       end=`expr index "$text" \"`
       trend=${text:0:(($end-1))}
       text=${text:$end}
       echo -e $ind. $BLUE $trend $NONE
       let ind++

done
sleep 10
echo -e $RED "\nupdating..." $NONE
done

Voy a explicar un poco el código (al pasar el salto)

Leer más de esta entrada