Icono del sitio Un lugar en el mundo…

Transferencia de ficheros con netcat o ssh

Poneos en situación: estamos en un entorno corporativo con máquinas Linux y necesitamos transferir ficheros entre dos de ellas pero no disponemos de ningún protocolo de transferencia habitúal. No tenemos (o no queremos usar) el infame SMB/CIFS (Samba para los amigos), no hay NFS, no tenemos acceso FTP y por supuesto que no tenemos acceso físico a la máquina destino de las transferencias. Sólo disponemos de una conexión SSH con la misma ¿cómo lo hacemos?

La primera opción implica una cierta preparación previa: que la máquina destino (supondremos siempre que tenemos acceso local a la máquina origen) tenga una copia de netcat, esa llamada «navaja suiza» del TCP/IP. Para hacer la transferencia lo primero es poner en escucha una instancia de netcat en la máquina destino. Así:

jmmoralesv@barbara:/tmp$ netcat -v -l -p 6969 > googlemapsapi.pdf
listening on [any] 6969 ...

Inmediatamente después lanzamos la copia desde la máquina origen de esta forma:

jmmoralesv@eduardita:~> cat googlemapsapi.pdf | netcat barbara 6969

La máquina destino recibe correctamente el fichero y cierra la sesión:

connect to [xxx.xxx.xxx.xxx] from eduardita [xxx.xxx.xxx.xxx] 43900
googlemapsapi.pdf
jmmoralesv@barbara:/tmp$ ls -l
total 924
-rw-r--r--  1 jmmoralesv jmmoralesv 428445 2006-10-05 12:00 googlemapsapi.pdf

Evidentemente no tenemos que pasar los ficheros uno a uno ;-). Si queremos pasar un directorio completo la secuencia sería la siguiente: Primero levantamos de esta forma la escucha en la máquina destino:

jmmoralesv@barbara:/tmp$ netcat -v -l -p 6969 | tar xv
listening on [any] 6969 ...

Y luego lanzamos la copia desde el origen así:

jmmoralesv@eduardita:~> tar cf - pdfs | netcat barbara 6969

Ahora ‘recogemos’ los resultados:

connect to [xxx.xxx.xxx.xxx] from eduardita [xxx.xxx.xxx.xxx] 49810
pdfs/
pdfs/fungibles 8550.pdf
pdfs/googlemapsapi.pdf
pdfs/GuiaWebVersionDefinitiva.pdf
jmmoralesv@barbara:/tmp$ ls -lR
.:
total 4
drwxr-xr-x  2 jmmoralesv jmmoralesv   4096 2006-10-05 12:30 pdfs
./pdfs:
total 1904
-rw-r--r--  1 jmmoralesv jmmoralesv 860160 2006-10-05 12:22 fungibles 8550.pdf
-rw-r--r--  1 jmmoralesv jmmoralesv 428445 2006-10-05 12:00 googlemapsapi.pdf
-rw-r--r--  1 jmmoralesv jmmoralesv 644674 2006-08-03 10:48 GuiaWebVersionDefinitiva.pdf

La segunda opción que veremos no requiere más que de la conexión ssh con la máquina destino.

jmmoralesv@eduardita:~> tar czv googlemapsapi.pdf | ssh barbara tar xz -C /tmp
googlemapsapi.pdf
Password:

Igualmente podemos transferir un directorio completo:

jmmoralesv@eduardita:~> tar czv pdfs | ssh barbara tar xz -C /tmp
pdfs/
pdfs/fungibles 8550.pdf
pdfs/googlemapsapi.pdf
pdfs/GuiaWebVersionDefinitiva.pdf
Password:

O, incluso, invertir los términos y traernos uno o varios ficheros desde la máquina destino a la origen:

jmmoralesv@eduardita:~> ssh barbara tar cz /tmp/pdfs | tar xz -C .
Password:

La última opción consiste en montar directamente un directorio de la máquina destino sobre nuestro sistema de ficheros gracias a sshfs. En la máquina destino no necesitamos hacer ningún preparativo previo: sólo contar con el servicio SSH. En la máquina origen debemos de instalar previamente los paquetes fuse y sshfs. Una vez hecho esto levantamos el módulo de fuse y, sin mas, montamos el directorio que deseamos sobre nuestro sistema de la siguiente forma:

jmmoralesv@eduardita:~> sudo modprobe fuse
Contraseña:
jmmoralesv@eduardita:~> sshfs jmmoralesv@barbara:/tmp /mnt/barbara
Password:
jmmoralesv@eduardita:~> ls -l /mnt/barbara
total 424
-rw-r--r-- 1 jmmoralesv 1000 428445 2006-10-05 12:44 googlemapsapi.pdf
drwxr-xr-x 1 jmmoralesv 1000   4096 2006-10-05 12:36 pdfs
jmmoralesv@eduardita:~>

Por último, para desmontar la unidad:

jmmoralesv@eduardita:~> sudo umount /mnt/barbara
root's password:
jmmoralesv@eduardita:~> ls /mnt/barbara -l

Referencias y ampliaciones en:

Salir de la versión móvil