post icon

Transferir ficheros por SFTP con Java

No es muy común que nuestras aplicaciones necesiten hacer descargas o subidas de ficheros a otras máquinas, pero si llegamos a necesitarlo, podemos usar el protocolo SFTP (Secure File Transfer Protocol). Con este protocolo agregamos un nivel de seguridad comparado con el típico FTP.

Para lograr esto con Java, necesitamos de una librería externa que no viene incluido en el JDK, que nos proveerá JSch (Java Secure Channel). Pueden descargar la última versión de fichero aquí, luego tenemos que agregar con librería .jar externa en nuestro IDE, ya sea eclipse o NetBeans. JSch es utilizado en varias famosas aplicaciones como eclipse y NetBeans mismos, Jakarta, Ant, y otros.

Los imports necesarios son los siguientes:

1
2
3
4
5
6
7
8
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Properties;
 
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

El método es el siguiente, sólo muestro como hacer la descarga de los ficheros, para subirlos tan sólo hay que usar un poco de ingenio cambiando el metodo get por el set y usar un FileInput..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
	public static void DescargarPorSFTP(String pUser, String pPass,
			String pHost, int pPort, String pOutputStream, String pPathFile)
			throws Exception {
		JSch sftp = new JSch();
		// Instancio el objeto session para la transferencia
		Session session = null;
		// instancio el canal sftp
		ChannelSftp channelSftp = null;
		try {
			// Inciciamos el JSch con el usuario, host y puerto
			session = sftp.getSession(pUser, pHost, pPort);
			// Seteamos el password
			session.setPassword(pPass);
			// 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 = (ChannelSftp) session.openChannel("sftp");
			channelSftp.connect();
			// Convertimos el archivo a transferir en un OutputStream
			OutputStream os = new BufferedOutputStream(new FileOutputStream(
					pOutputStream));
			// Iniciamos la transferencia
			channelSftp.get(pPathFile, os);
		} catch (Exception e) {
			throw new Exception(e);
		} finally {
			// Cerramos el canal y session
			if (channelSftp.isConnected())
				channelSftp.disconnect();
			if (session.isConnected())
				session.disconnect();
		}// end try
	}// end DescargarPorSFTP
 
	public static void main(String[] args){
		try {
                        // El ejemplo es de una ejecucion Cliente Windows y Servidor Linux aunque esto no es relevante
			DescargarPorSFTP("miusuario", "clavesupersecreta", "192.168.1.100", 22, "C:\\devtroce.jpg", "/media/devtroce.jpg");
			System.out.println("descarga satisfactoria...");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Comentarios desde Facebook:

  1. avatar
    Carlos COLOMBIA Google Chrome Windows
    17 agosto 2017 at 12:52 #

    Hola a mi no me permite descargar el archivo que deseo
    me envia error.

    java.lang.Exception: java.io.FileNotFoundException: C:\Descarga\SFTP (Access is denied)

  2. avatar
    Hernán Mozilla Firefox Windows
    18 mayo 2011 at 16:15 #

    Hola,

    Para subir un archivo se usa lo siguiente:

    BufferedInputStream os = new BufferedInputStream(new FileInputStream(rutaArchivoOrigen));
    channelSftp.put(os, rutaArchivoDestino);

    en lugar de:
    OutputStream os = new BufferedOutputStream(new FileOutputStream(pOutputStream));
    channelSftp.get(pPathFile, os);

  3. avatar
    Javis MEXICO Google Chrome Windows
    15 abril 2011 at 14:17 #

    Excelente codigo muy detallado y entendible, solo una duda en la parte de

    // 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”);

    si no se pudiese de esa forma es decir si no se pudiera deshabilitar el intercambio de claves que aplica?

  4. avatar
    Leo ARGENTINA Google Chrome Windows
    27 septiembre 2010 at 07:41 #

    ¡Muchas gracias!
    Muy útil y muy claro el código.

    ¡Saludos!

  5. avatar
    Sutano COLOMBIA Mozilla Firefox Windows
    7 agosto 2010 at 19:46 #

    Excelente, me sirvio muchisimo

Responder