Manteniéndonos sincronizados con rsync
Hay buenas herramientas en el mundo unix, y rsync es una de ellas.
Bueno primero entendemos un poco que es Rsync y que mejor explicación que la de la wikipedia:
rsync es una aplicación de software para sistemas de tipo Unix que ofrece transmisión eficiente de datos incrementales comprimidos y cifrados. Mediante una técnica de delta encoding, permite sincronizar archivos y directorios entre dos máquinas de una red o entre dos ubicaciones en una misma máquina, minimizando el volumen de datos transferidos. Una característica importante de rsync no encontrada en la mayoría de programas o protocolos es que la copia toma lugar con sólo una transmisión en cada dirección. rsync puede copiar o mostrar directorios contenidos y copia de archivos, opcionalmente usando compresión y recursión.
La ventaja de rsyn contra cualquier otro método de copiado de archivos es que rsync no copia lo que no debe, solo copiara lo que está descatualizado en su destino, con opciones de borrar lo que no está en el origen, omitir archivos, seguir enlaces y demas...
El uso es muy muy simple, tanto en caso local:
rsync -a --delete /home /mnt/backup
como remoto:
rsync -a --delete ./pagina usuario@server.com:/var/www/htdocs
De este modo se puede tener un directorio sincronizado en otra computadora.
¿En que nos puede servir?
Si sos programador web es una herramienta muy copada para subir cambios de una web a su servidor, si se sigue el modo de trabajo "server de prueba"==="server final", jeje, y está todo absolutamente testeado, se puede subir la copia exacta del arbol de directorios, borrar los archivos que ya no se usen y asegurarnos de no subir nada de mas y con la seguridad de hacerlo mediante ssh, encriptado desde que sale hasta que llega, y así evitar sniffers, o spoofings y etc.
Para hacer una sincronización a un server se necesita:
- Rsync instalado en el cliente y en el server (preferentemente la misma versión)
- Servidor ssh (sshd) del lado del servidor
Entonces, solo tenemos que hacer un rsync del modo:
rsync -a --delete /path/del/site usuario@server:/path&remoto
Donde -a es un parametro que agrupa una serie de opciones para copiar archivos y --delete borra cualquier archivo que esté en el servidor y no en nuestra copia, un ejemplo real podria ser:
rsync -a --delete /home/exos/alpha/mipagina/www exos@exodica.com.ar:/var/www/htdocs
Tuneles SSH
He aqui una de mis cosas favoritas del OpenSSH, o simplemente SSH
(Secure SHell).
Bueno capas que muchos tiene un consepto.. no errado pero si muy pobre de los que es el ssh, muchos creen que solo es una especie de entrada a usar una PC remota por una consola
, y que si o si siempre tiene ejecutar un bash apenas nos conectamos xD
Pero sabiendo el verdadero significado de shell: (concha, xD), una shell es una capa entre el sistema operativo y algo, eso puede ser un humano o un programa.
Si bien ssh trabaja con los usuarios del sistema, no es solo para editar un virtual en un server en produccion, puede ser util para muchas cosas, y la ventaja de este que es seguro (SECURE shell), usando juegos de llaves DSA y RSA para certificar y encriptar los datos.
Se pueden hacer tuneles TCP/IP, esto es, crear un tunel desde una PC con un cliente ssh (ssh, putty, etc) y un equipo con sshd (ssh-server), este tunel es manejado por esta SHELL (capa o interfaz/interface), pero para la conexion esto es transparente... osea..
[MAQUINA LOCAL puerto 300:-ssh]---------------------
le decimos que el ssh habra un puerto local (300) y haga un puente con el 300 de la maquina remota, esta se conectara al sshd remoto (puerto 22) y le dira al sshd que se conecte al puerto 300. Alla hay un cliente local conectandose al puerto 300, y aca hay un servicio abriendo un puerto local, para la aplicacion que trabaja con esto es totalmente transparente, pero para la comunicacion no, hay una encriptacion de los datos en vivo.
Supongamos que un programa le manda un HOLA a otro:
[PC 1 HOLA ] -----------> HOLA -----------> [PC 2]
la informacion viaja en plano y la comunicacion puede ser sniffeada o spoffeada falsificando conexiones, paquetes y etc... Ahora el puente
[PC1 HOLA --> () SSH ) ---------~jEoi8SaiO-------> [() SSHD ) -> HOLA PC 2]
La clave DSA sertifica por medio de una firma digital que ese HOLA vino de PC 1, y aparte encripta los datos para que otra PC no pueda ver que se envia, a [PC 3] por ejemplo ~jEoi8SaiO no le va a servir de nada si no tiene la llave privada para desencriptarlo (RSA).
Ahora al asunto practico, abrimos un puerto ssh y lo redirigimos... (con ssh)
ssh -N -L 300:127.0.0.1:300 server.com
aca creariamos abririamos un puerto local (300) el cual ssh tunealearia* al sshd de server.com y este a la vez al puerto 300 local.
Pero supongamos que tenemos un server WEB y un server Mysql, solo el web tiene salida a internet,asi que seria algo asi:
[PC] ------------------------------
190.54.233.176
no nos podemos conectar al server de mysql directo, pero el servidor web si, asi que se lo pedimos:
ssh -N -L 5000:192.168.1.2:3306 server.com
eso lo que le dice al sshd (server.com) es que nos concete al 3306 (mysql) de 192.168.1.2 (la ip interna del server mysql), de esa forma no solo nos sirve para asegurara la cominicacion, sino que tambien sirve paraconectarnos a maquinas que esten en el la red interna y no con acceso directo a nosotros, saltandonos firewalls, y demas.
Con el cliente de MySql no conecteriamos
mysql -u usuario -h localhost -P 5000 -p
Y es como conectarnos de alla (usuario@localhost).
Obviamente si deseamos que nuestros usuarios creen tuneles hay opciones, en /etc/ssh/sshd_config (en linux, en otros SO unix no sé)
AllowTcpForwarding yes
#X11Forwarding no
Con eso se puede desabilitar/habilitar el fordwardeo de puertos y el de interface gráfica (X11).
Hilo de discucion en GeeX: http://groups.google.com/group/unigeex/browse_thread/thread/cfe8b71f0483b1a4