Copiar ficheros entre dos servers que no tienen acceso entre ellos

A veces necesitas copiar un fichero de un server a otro, no suele ser problema si se ha compartido claves SSH entre ellos. Pero eso no siempre es así, y es una buena práctica no compartir las claves SSH más de las estrictamente necesarias.

Para éste truco estaremos en un terminal que tenga acceso a ambos servidores, nuestro ordenador, un servidor intermedio, etc.

Pocos ficheros y pequeños

Si vamos a copiar pocos ficheros y son de pequeño tamaño lo más cómodo es lo siguiente:

scp -3 root@servidororigen.com:/rutadelfichero root@servidordestino.com/rutadestino/

El truco está en el “-3”. Según el man de “scp”:

Copies between two remote hosts are transferred through the local host. Without this option the data is copied directly between the two remote hosts. Note that this option disables the progress meter.

Para utilizar dicha opción el host donde se ejecuta debe tener acceso a ambos servidores.

Muchos ficheros y/o grandes

Ahora si lo que queremos copiar es de varios GB el método anterior no es el más efectivo, ya que transmite los datos sin comprimir, aunque se podría utilizar el parámetro “-C” del scp continúa no siendo ópimo del todo.

Una opción mejor es la siguiente:

ssh root@servidororigen.com "cd /ruta/origen/copiar && tar -cf - ." | ssh root@servidordestino.com "cd /ruta/destino/copiar && tar -xf -"

Lo que hace esa instrucción es crear un tunel entre ambos servidores utilizando “ssh”, en el servidor origen se hace un tar de los ficheros a copia con salida “stdout” y en el servidor detino se extrae el tar desde la entrada “stdin”

Nota: evidentemente, el usuario puede ser “root” o el que corresponda 😉