Muchas veces me he visto pasando datos de un servidor remoto a otro, ya sea moviendo un sitio web, un dump de base de datos o un maildir con correos. Generalmente utilizo scp (Secure Copy) o rsync sobre ssh para conectar server_origen con server_destino.
Pero qué pasa si un server no se ve con otro; o solo quiero ejecutar comandos en mi host local. En esos casos, descargo los datos a mi host local y los subo al servidor de destino. Pero lo ideal sería conectar a ambos servidores y que el comando ejecute de una sola vez. Sería como (que no funciona para estos casos):
$ scp server_origen:archivo.tgz server_destino:archivo.tgz
El problema radica en que la copia se quiere iniciar (obviamente) desde server_origen y éste no tiene la configuración requerida para conectarse a server_destino. Puede verse claramente invocando con -v el scp:
$ scp -v server_origen:archivo.tgz server_destino: ... Executing: program /usr/bin/ssh host server_destino, user (unspecified), command scp -v -d -t -- ...
A veces, con un poco de configuración se puede salvar este problema y lograr el propósito deseado: que los archivos de server_origen lleguen a server_destino, pero no quiero hacer esas configuraciones, quiero algo que esté disponible para mi linea de comando en mi host local de la forma más simple posible.
1. stdOUT – stdIN
Entonces ejecutar una salida estándar en server_orgien que se guarda en un archivo en server_destino, es una solución simple que lo hace:
$ ssh server_origen 'cat archivo.tgz' | ssh server_destino 'cat > archivo.tgz'
los datos terminan pasando dos veces por el ancho de banda al host local, pero no se ocupa el disco local.
2. SCP con parámetros
Claro que si se se puede conectar un servidor con otro, se pude ejecutar pasando los parámetros necesarios para el scp entre uno y otro:
$ ssh server_origen 'scp -Ppuerto archivo.tgz usuario@server_destino:'
3. Túnel para aplicaciones
Llegado al caso raro que un servidor remoto no se vea con otro, o que se levante un servicio en 127.0.0.1 de server_destino (mysql o rsync) se puede armar un túnel a través del host local para pasar los datos:
$ ssh -R 5001:127.0.0.1:5002 server_origen $ ssh -L 5002:127.0.0.1:3306 server_remoto
y en este ejemplo, ejecutar directamente el comando mysql en server_origen para que conecte con el mysql del server destino:
$ ssh server_origen 'mysql -P5001 -uroot -p base-datos-server_destino < base-datos-server_origen.sql'
En los comandos que se ejecutan en el host local permiten a través del puerto 5001 abierto en server_origen conectar con 127.0.0.1:3306 de server_remoto y cargar el dump de la base de datos.
Pingback: Bitacoras.com