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:
Hola, estoy intentando instalar SSH en un debian 4 y el problema es que se instala perfectamente, puedo acceder con el SSH pero al intentar abrir el fpt del icono de la carpeta para tranferir fichero no puedo
Si alguien sabría que debería hacer agradecería respuesta.
Saludos
Aporto tambien la opcion de copia incremental con el agregado de –newer-mtime ‘fecha’
Por ejemplo, si se desean copiar solo archivos MODIFICADOS EN SU CONTENIDO(mtime) posteriores a 2 de septiembre de 2007, entonces la opcion será
tar -zcvp –newer-mtime ‘2007-09-02’ /directorio/a/copiar | ssh host tar -xzp -C /directorio/remoto/de/destino
No olvidarse de preservar permisos con la opcion -p de tar en el acto de descompresion (tar zxp)
hmm.. ingenioso
Pero más facil todavia es usando el comando scp.. es como el comando cp pero usando ssh.
Se puede hacer desde la PC de destino..
jmmoralesv@eduardita:~> scp jmmoralesv@barbara:googlemapsapi.pdf .
O bien desde el origen..
jmmoralesv@barbara:~> scp googlemapsapi.pdf jmmoralesv@eduardita:.
Sugiero una tercera forma, acceder por sftp.
Generalmente, en los *nix que he trabajado era la configuración por defecto, los servidores ssh (OpenSSH) también proporcionan un servicio de ftp seguro y sobre el mismo puerto que el ssh. De forma que se si se accede por ssh se puede acceder por sftp.
Para ver si está configurado el servidor hay que mirar en el /etc/ssh/sshd_config (SuSe) y ver si tiene esta línea: Subsystem sftp /usr/lib/ssh/sftp-server
Para invocarlo: sftp usuario@servidor