Aprende a listar un directorio con la librería JSCH en Java.

Cómo listar un directorio remoto con JSCH (SFTP) en Android

Crear un cliente SFTP con Java se ha vuelto extremadamente sencillo usando la librería JSCH. JSCH es una librería escrita en Java que implementa SSH2 (permite el uso del canal SFTP). JSCH te permite conectarte a un servidor SSH y usar el reenvío de puertos, reenvío X11, transferencia de archivos, etc., y puede integrar su funcionalidad en sus propios programas escritos en Java. JSch está licenciado bajo la licencia de estilo BSD.

Puedes usar el siguiente código para obtener una lista del contenido de un directorio remoto:

// Recuerda importar las clases requeridas

import com.jcraft.jsch.*;
import com.jcraft.jsch.ChannelSftp.LsEntry;

// Y luego en tu función

try {
    JSch ssh = new JSch();
    Session session = ssh.getSession("username", "myip90000.ordomain.com", 22);
    // Recuerda que este código es solo por propositos de enseñanza, puedes añadir una identidad y un archivo known_hosts
    // para prevenir un ataque de MITM
    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    session.setPassword("Passw0rd");
    session.connect();

    Channel channel = session.openChannel("sftp");
    channel.connect();

    ChannelSftp sftp = (ChannelSftp) channel;

    // Ahora que se tiene un canal abierto, accede a un directorio primero si quieres
    // sftp.cd("/var/www/mydirectory");

    @SuppressWarnings("unchecked")
    
    // Obten la lista del contenido del actual directorio usando la instrucción ls
    java.util.Vector<LsEntry> flLst = sftp.ls("/var/www/mydirectory");

    final int i = flLst.size();
        
    // Mostrar la información de cada uno de los archivos/directorios en la consola
    for(int j = 0; j<i ;j++){
        LsEntry entry = flLst.get(j);
        SftpATTRS attr = entry.getAttrs();

        System.out.println(entry.getFilename());
        System.out.println(directory + "/" + entry.getFilename()); // Directorio remoto
        System.out.println("isDir", attr.isDir()); // Es directorio
        System.out.println("isLink", attr.isLink()); // Es un symlink (enlace simbólico)
        System.out.println("size",attr.getSize()); // obten el tamaño del archivo en bytes
        System.out.println("permissions",attr.getPermissions()); // permisos
        System.out.println("permissions_string",attr.getPermissionsString());
        System.out.println("longname",entry.toString());        
    }
    
    channel.disconnect();
    session.disconnect();
} catch (JSchException e) {
    System.out.println(e.getMessage().toString());
    e.printStackTrace();  
} catch (SftpException e) {
    System.out.println(e.getMessage().toString());
    e.printStackTrace();
}

La función ls hará el trabajo por ti, este retornara un objeto del tipo LsEntry con la información necesaria de un directorio y luego te permitirá acceder a la descripción de cada uno de las items del objeto. Recuerda que como ejemplo, este no incluye ningun tipo de seguridad. Debes agregar los archivos de hosts conocidos (known_hosts) si tu servidor usa uno, o agregar una identidad si tu servidor usa una clave privada para la autenticación. Este código funciona en cualquiera plataforma que use Java y la librería JSCH (Android, Escritorio etc).


Ingeniero de Software Senior en EPAM Anywhere. Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores