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.