2010-02-27 30 views
11

Estoy buscando una biblioteca de Java muerta simple para usar para transferencias de archivos SFTP. No necesito otras características más allá de eso.Java SFTP Transfer Library

He probado Zehon, pero es increíble, y creo que 8 archivos jar es un poco loco por la poca funcionalidad que necesito.

Y la biblioteca tiene que ser gratuita (como en cerveza gratis), y preferiblemente de código abierto (no es un requisito).

Gracias.

+0

ftp over a ssh tunnel? –

+2

http://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol –

+1

Utilice el término "SFTP" si eso es lo que quiere decir. Entre FTP, SFTP/SSH, FTPS y túnel FTP regular sobre SSH, los acrónimos se vuelven ambiguos. – prestomation

Respuesta

27

Editar: Voy a mantener mi respuesta anterior, como JSch todavía se utiliza en muchos lugares, pero si necesita una biblioteca mejor documentada, puede utilizar sshj. Un ejemplo de cómo utilizarlo para hacer SFTP es:

SSHClient ssh = new SSHClient(); 
ssh.loadKnownHosts(); 
ssh.connect("host"); 
try { 
    ssh.authPassword("username", "password"); 
    SFTPClient sftp = ssh.newSFTPClient(); 
    try { 
     sftp.put(new FileSystemFile("/path/of/local/file"), "/path/of/ftp/file"); 
    } finally { 
     sftp.close(); 
    } 
} finally { 
    ssh.disconnect(); 
} 

Usando JSch (un lib SSH Java, utilizado por la hormiga por ejemplo), se puede hacer algo así:

Session session = null; 
Channel channel = null; 
try { 
    JSch ssh = new JSch(); 
    ssh.setKnownHosts("/path/of/known_hosts/file"); 
    session = ssh.getSession("username", "host", 22); 
    session.setPassword("password"); 
    session.connect(); 
    channel = session.openChannel("sftp"); 
    channel.connect(); 
    ChannelSftp sftp = (ChannelSftp) channel; 
    sftp.put("/path/of/local/file", "/path/of/ftp/file"); 
} catch (JSchException e) { 
    e.printStackTrace(); 
} catch (SftpException e) { 
    e.printStackTrace(); 
} finally { 
    if (channel != null) { 
     channel.disconnect(); 
    } 
    if (session != null) { 
     session.disconnect(); 
    } 
} 

Aquí está another link usando JSch para hacer SFTP.

Puede usar JSch directamente de esta manera, o por medio de Commons VFS, pero luego tendrá que tener los dos jar comunes, vfs jar y jsch.

+0

Encontré una manera más simple de hacerlo, voy a editar mi respuesta. –

+1

JSch es una gran biblioteca pero carece de documentación. Encontré que http://timarcher.com/node/57 era un ejemplo realmente útil. – UmYeah

+0

Gracias por el enlace, lo agregaré a la respuesta. De hecho, JSch realmente carece de documentación (y la legibilidad del código fuente, es como si lo hubieran lanzado en la naturaleza), pero hace el trabajo a la perfección. –

-2

¿Qué tal FTPSClient de Apache Commons?

+13

Lo que está sugiriendo es FTPS, no SFTP. –

6

Aquí está el código fuente completo de un ejemplo usando JSch sin tener que preocuparse por la verificación de la clave ssh.

import com.jcraft.jsch.*; 

public class TestJSch { 
    public static void main(String args[]) { 
     JSch jsch = new JSch(); 
     Session session = null; 
     try { 
      session = jsch.getSession("username", "127.0.0.1", 22); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      session.setPassword("password"); 
      session.connect(); 

      Channel channel = session.openChannel("sftp"); 
      channel.connect(); 
      ChannelSftp sftpChannel = (ChannelSftp) channel; 
      sftpChannel.get("remotefile.txt", "localfile.txt"); 
      sftpChannel.exit(); 
      session.disconnect(); 
     } catch (JSchException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } catch (SftpException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+3

Esta respuesta no se preocupa sobre seguridad, no sobre verificación de llaves. Al usar 'StrictHostKeyChecking = no', pierde seguridad. No recomiendo a nadie que lo use, sin explicar las consecuencias. –

3

La salida() y la desconexión() se deben colocar en un bloque finally. En este ejemplo, tenemos un programa interminable en caso de una excepción porque un segundo hilo no terminará.

+0

Esto no es realmente una respuesta, pero un comentario útil sobre @Iraklis 'respuesta anterior. – hotshot309