Keepalive en SSH

Durante mucho tiempo, he tenido algunos problemas con ciertos ISP en aplicaciones que requieren conexiones permanentes para funcionar, pues después de un tiempo de inactividad simplemente las cierra. Esto puede pasar también con ciertos firewalls.

Mi problema particular es el siguiente: para mí es necesario tener más de una sesión SSH para poder administrar servidores rápidamente. El problema viene cuando después de algunos minutos de inactividad, la conexión SSH muere por la razón anterior.

Esto tiene varias soluciones:

En clientes Linux, es posible añadir una opción al archivo /etc/ssh/ssh_config:

ServerAliveInterval 1000

En ocasiones no tenemos acceso a ese archivo, porque la cuenta con que operamos no tiene permisos administrativos. Entonces, podemos añadir lo siguiente al archivo /home/user/.ssh/config

Host *
ServerAliveInterval 1000

Y esa sería una buena solución para cualquier caso. Lamentablemente, yo no siempre uso Linux 😀

Así que en Windows, entre los clientes SSH que existen, mi favorito es PuTTY. Dicho programa permite activar una opción similar. La desventaja es que hay que hacerlo para cada vez que se haga una conexión.

Bueno, pues en mi caso, tengo una máquina Linux que me sirve como intermediario para rutear conexiones a una red local. Y este es el caso común que va desde un pequeño ciber café hasta grandes redes en empresas. Entonces, ¿por qué no buscar una solución para toda la red local?

La solución es la siguiente:

echo 1000 > /proc/sys/net/ipv4/tcp_keepalive_time

Esto nos permite mandar un keep-alive para cualquier conexión TCP. Con esto, solucionamos el problema de SSH y de cualquier otro protocolo que utilice el stack TCP, así como lo soluciona para toda la red local.

Un valor que funciona para mí es 200, es decir, poco más de 3 minutos.

Migración de usuarios y passwords de un servidor MySQL

Ciertamente, debe haber muchos posts respecto a este asunto en otros blogs, foros o el foro oficial de MySQL, sin embargo en mi búsqueda no encontré una solución inmediata al problema.

Bien, pues como dice el título era necesario realizar una migración de las bases de datos de un servidor a otro. Bien, ciertamente había hecho volcados (dumps) de bases de datos para reinsertarlas en otro servidor. Hasta ahí todo bien. La pregunta es… ¿Y cómo copio los usuarios? Y es que una vez que lograra copiar todas las bases de datos, tendría que recrear a mano cada uno de los usuarios, lo cual no parece ser una buena solución.

Bueno, la herramienta típicamente utilizada para efectuar estas tareas es mysqldump

Y para copiar una base de datos a un archivo de texto, tenemos esto

mysqldump -u usuariodb -p basededatosacopiar > volcado.sql

Leyendo un poco la documentación, sabemos dos cosas para solucionar el problema con los usuarios:

  • Los privilegios y usuarios/passwords se guardan en la base de datos de nombre mysql.
  • El comando mysqldump provee una opción para dumpear todas las bases de datos llamada –all-databases

Así que me animé a hacer mis pruebas:

mysqldump -u root -p --all-databases > dump.sql

SCP al otro servidor, y ahi dentro…

mysql -u root -p < dump.sql

Termina la copia, salgo, entro en un shell MySQL, todo bien… Ok, reiniciemos el servidor MySQL:

service mysql restart

Stopping MySQL database server: mysqld failed!
Starting MySQL database server: mysqld already running.
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'

Wow! ¿Y eso qué onda!?!? En debian, existe un usuario denominado debian-sys-maint, que se encarga de realizar algunas tareas de mantenimiento al iniciar y detener el servidor MySQL, y algunas tareas con los logs del servicio.
Así que buscando un poco, hay un archivo /etc/mysql/debian.cnf similar al .my.cnf que se puede crear en nuestro home para acceder automáticamente a un servidor determinado, sin preguntar usuario, host, o incluso el password.
Comparando ambos archivos, en el servidor anterior y el nuevo, tenían passwords diferentes. El archivo tiene una estructura así:

# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = passdedebiansysmaint
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user     = debian-sys-maint
password =  passdedebiansysmaint
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr

Y como dice do not touch, mejor le hacemos caso 😛
Así que hay que decidí seguir el procedimiento para cambiar el password de un usuario en MySQL:
update user set password=PASSWORD("passdedebiansysmaint") where User='debian-sys-maint';
Y finalmente hacemos un:
flush privileges;
Y listo! El servidor reinicia normalmente:
service mysql restart

Stopping MySQL database server: mysqld.
Starting MySQL database server: mysqld.
Checking for corrupt, not cleanly closed and upgrade needing tables..

Espero les sirva =)

SCP: sobre archivos incompletos, pausar y resumir (rsync)

Cuando queremos transferir archivos entre computadoras, utilizamos algún tipo de protocolo como puede ser HTTP (al descargar un archivo de la web) o FTP.
Cuando queremos transferir archivos de forma SEGURA, utilizamos el protocolo SCP, que está basado en SSH y permite utilizar criptografía de llave pública para mantener seguras las conexiones.

Uno de los problemas típicos, es cuando la conexión entre las dos computadoras se corta, y las transferencias quedan interrumpidas. La cuestión es, ¿qué tal que era un archivo enorme de 10GB y se quedo a la mitad del camino, o peor aún, estaba por terminar? Pues con scp no hay modo de reanudar la transferencia y se tiene que reiniciar

El problema empeora cuando intentamos hacer una copia de un directorio con múltiples archivos (y posiblemente más directorios) y entonces la conexión se interrumpe.

#Caso 1: copiando un directorio con todo su contenido
scp -r midirectorio usuario@servidor:~/
#Caso 2: copiando sólo los archivos de un directorio dado
scp midirectorio/* usuario@servidor:~/destino/

En ambos casos, si la conexión se interrumpe, e intentamos repetir el comando, la copia comienza desde cero otra vez. Algunos pensaremos… “pues verifico que cosas se copiaron y que cosas no, y entonces repito el comando sólo para lo que no se copió”. Bueno, ¿y si el directorio tenía 10000 fotografías y otros 100 subdirectorios con más contenido? ¿Voy a seleccionar uno por uno? Creo que no es la mejor opción.

Una derivación de este último caso, es cuando tenemos un directorio que deseamos copiar digamos cada semana. Por ejemplo, hacer una copia de seguridad de un sitio web cada semana en otra computadora. Si lo hacemos con scp, cada semana hay que copiar el directorio COMPLETO. ¿Por qué desperdiciar todo ese ancho de banda?

Un caso similar, es cuando hacemos una copia de un archivo muy grande y por algún motivo DEBEMOS interrumpir la copia. Tenemos que empezar nuevamente si usamos scp. Esto no es conveniente.

Bueno, la solución está en el comando rsync que nos permite realizar copias incrementales y reanudar transferencias. No hasta hace mucho lo conocí en persona, a pesar de que ya había escuchado de él y muchas veces me encontré con los problemas mencionados.

El comando que utilizo es el siguiente:

rsync -avzP midirectorio usuario@servidor:~/directoriodestino

A grandes rasgos, cada flag significa los siguiente:

  • -a : Básicamente hará una copia recursiva del directorio preservando lso atributos de cada archivo.
  • -v : El famoso flag “verbose” para ver con mayor detalle lo que está ocurriendo durante la ejecución.
  • -z : Usar compresión. Muy útil para cuando el ancho de banda es escaso y se transmiten archivos de texto.
  • -P : Es la combinación de dos flags –progress y –partial. La primera, es para mostrar el progreso de la transferencia, y la segunda, y más importante, permite reanudar la transferencia desde un archivo “parcial” o incompleto si es que existe. Esto lo hace verificando el tamaño y la fecha de modificación de ambos archivos.

Hagan sus pruebas, y espero les sirva de algo este pequeño artículo. Cualquier error, háganmelo saber.

Gource – Software Version Control Visualization Tool

Y siguiendo con otro video muy relacionado, pero esta vez tiene que отчет ver con los sistemas exhibition de control Primer de versiones.

Otra bella pieza de software para el administrador de sistemas que gusta de tomarse 5 minutos de relajación.

Para los que no conozcan del tema, un sistema de control de versiones se utiliza para tener un repositorio Panels? en el cual se registren todos los cambios que se van haciendo de Running un proyecto cheap nfl jerseys de desarrollo de software, cuya función principal en que mi opinión es que se puedan identificar rápidamente los momentos en que algún wholesale nfl jerseys cambio ocasionó un cheap jerseys error y poder revertirlos.

Entre cheap mlb jerseys los sistemas de control cheap nba jerseys de versiones más populares tenemos a CVS, SVN, Mercurial y Git, por mencionar algunos.