miércoles, febrero 11, 2009

Cómo realizar una transferencia via SFTP con Java

Este tema me surgió en el trabajo y, en principio parecía fácil… en principio. En mi caso, los requerimientos me decían que tenía que ser SFTP y, por requerimientos personales, debía ser una API libre. El problema es que no encontré información clara acerca de cómo realizar una transferencia de un fichero por un canal seguro y de forma sencilla. Las consultas a Google me llevaban siempre al proyecto VFS de Apache, pero el VFS y yo teníamos un problema de entendimiento, vamos que no entendía el procedimiento que hay que seguir para lograr hacer la transferencia. No podía ser todo tan complejo!

Al final claudique, venga, si ha de ser VFS, pues manos a la obra, vamos a ver los ejemplos del código fuente… y ahí lo vi. Parece ser que VFS usa las librerías JSch de JCraft distribuidas por el autor bajo licencia BSD. Esta API es muuuucho más sencilla y más adecuada a mis requerimientos. Pero vamos al tema:


JSch jsch = new JSch();

// Inciciamos el JSch con el usuario, host y puerto
Session session = jsch.getSession(ftpUserName, ftpHost, 22);

// Seteamos el password
session.setPassword(ftpPassword);

// El SFTP requiere un intercambio de claves
// con esta propiedad le decimos que acepte la clave
// sin pedir confirmación
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();

// Abrimos el canal de sftp y conectamos
ChannelSftp chan = (ChannelSftp) session.openChannel("sftp");
chan.connect();

// Convertimos el archivo a transferir en un InpusStream
InputStream is = new BufferedInputStream (new FileInputStream("c:\\TEMP\\annexe1.doc"));

// Iniciamos la transferencia
chan.put(is, "/annexe1.doc");

// Cerramos el canal y session
chan.disconnect();
session.disconnect();

Ale, transferencia realizada.

9 comentarios:

Anónimo dijo...

#ifndef chris
¡Qué chachi!
#endif /* chris */

Anónimo dijo...

Hola KareL81. He intentado, ejecutar tu codigo pero se me queda bloqueado en la linea session.connect(); El servidor es Filezilla Server, he activado el protocolo ssl y he creado un certificado.
Sabrias la razon de este problema?

Gracias.

Karel dijo...

Hola Anonymous.

Pues que te quede "bloqueado" es un poco abstracto, imagino que te daría un TimeOut. Obviamente la causa es debido a que no te consigue establecer la conexión, pero el por qué... Sinceramente no lo se, pero el mensaje entero puede aportar luz. De todas formas, los culpables míticos:

* Firewalls (tema de puertos abiertos y redirecciones).
* Permisos del Filezilla para ese user.

Mis pruebas se hicieron con FreeSSHd server para Win.

Suerte.

Anónimo dijo...

Hola KareL81.

El problema era mio, el tipo de seguridad que tenia activado en el servidor era ssl/tls mientras que intentaba conectarme mediante ssh. Ya está solucionado.

Muchas gracias.

Anónimo dijo...

Es la diferencia entre FTPS y SFTP
el primero usa ssl y el segundo ssh, me paso lo mismo XD.

Anónimo dijo...

No se como comenzar debo descargar el apache para poder realizar la transferencia?

Anónimo dijo...
Este comentario ha sido eliminado por un administrador del blog.
Fernando dijo...

Necesitaba realizar un ejemplo sftp y tu código me ha ahorrado más de un quebradero de cabeza. Muchas Gracias.

Anónimo dijo...

Muchas gracias, me ha servido bastante el codigo ademas es muy sencillo

Humberto Santos
PERU