Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List all files in remote server using JSch

Tags:

java

sftp

jsch

I am trying to list all the files/directory from a remote server using JSch.

But my problem is JSch list all the files with file creation date, time stamp, type of read/write permission etc..,

But in my case I need only the file/directory name in the remote server and no additional information is required..

Below is my piece of Java code..

import java.util.Vector;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class Listremoteserver {
    
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        String SFTPHOST = "xxxxx";
        int    SFTPPORT = 22;
        String SFTPUSER = "xxx";
        String SFTPPASS = "xxxxx";
        String SFTPWORKINGDIR = "/root";
                
        Session     session     = null;
        Channel     channel     = null;
        ChannelSftp channelSftp = null;
        
        try{
            JSch jsch = new JSch();
            session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT);
            session.setPassword(SFTPPASS);
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.connect();
            channel = session.openChannel("sftp");
            channel.connect();
            channelSftp = (ChannelSftp)channel;
            channelSftp.cd(SFTPWORKINGDIR);
            Vector filelist = channelSftp.ls(SFTPWORKINGDIR);
            for(int i=0; i<filelist.size();i++){
                System.out.println(filelist.get(i).toString());
            }
            
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

Results of the above program is

-rw-r--r--    1 root     root         3161 Feb 11  2014 install.log.syslog
-rw-r--r--    1 root     root           18 May 20  2009 .bash_logout
-rw-r--r--    1 root     root          176 Sep 23  2004 .bashrc
-rw-r--r--    1 root     root          176 May 20  2009 .bash_profile
-rw-r--r--    1 root     root          129 Dec  3  2004 .tcshrc
-rw-------    1 root     root         1114 Feb 11  2014 anaconda-ks.cfg
dr-xr-x---    2 root     root         4096 Feb 11  2014 .
-rw-r--r--    1 root     root         9169 Feb 11  2014 install.log
-rw-------    1 root     root         1055 Feb 11  2014 .bash_history
-rw-r--r--    1 root     root          100 Sep 23  2004 .cshrc
dr-xr-xr-x   24 root     root         4096 Feb 12 04:19 ..
like image 514
Karthick88it Avatar asked Feb 12 '16 09:02

Karthick88it


3 Answers

Try running this code. Here we are typecasting the list elements to LsEntry and then printing the required attribute.

import java.io.File;
import java.util.Vector;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;


public class Listremoteserver {


    /**
     * @param args
     */
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        String SFTPHOST = "xxxxx";
        int    SFTPPORT = 22;
        String SFTPUSER = "xxx";
        String SFTPPASS = "xxxxx";
        String SFTPWORKINGDIR = "/tmp";
        String SFTPPRIVATEKEY = "/path/to/xxxxxxxxx.pem";

        Session     session     = null;
        Channel     channel     = null;
        ChannelSftp channelSftp = null;

        try{
            JSch jsch = new JSch();
            File privateKey = new File(SFTPPRIVATEKEY);
            if(privateKey.exists() && privateKey.isFile())
                jsch.addIdentity(SFTPPRIVATEKEY);
            session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT);
            session.setPassword(SFTPPASS);
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.connect();
            channel = session.openChannel("sftp");
            channel.connect();
            channelSftp = (ChannelSftp)channel;
            channelSftp.cd(SFTPWORKINGDIR);
            Vector filelist = channelSftp.ls(SFTPWORKINGDIR);
            for(int i=0; i<filelist.size();i++){
                LsEntry entry = (LsEntry) filelist.get(i);
                System.out.println(entry.getFilename());
            }
        }catch(Exception ex){
            ex.printStackTrace();
        } finally {
            if(session != null) session.disconnect();
            if(channel != null) channel.disconnect();
        }
    }
}
like image 161
krishnakumarp Avatar answered Oct 15 '22 06:10

krishnakumarp


Use LSEntrySelector for accessing the properties of returned file list.

import java.util.Vector;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.ChannelSftp.LsEntrySelector;
import com.jcraft.jsch.ChannelSftp.LsEntry;


public class Listremoteserver {


    /**
     * @param args
     */
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        String SFTPHOST = "xxxxx";
        int    SFTPPORT = 22;
        String SFTPUSER = "xxx";
        String SFTPPASS = "xxxxx";
        String SFTPWORKINGDIR = "/root";

        Session     session     = null;
        Channel     channel     = null;
        ChannelSftp channelSftp = null;

        try{
            JSch jsch = new JSch();
            session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT);
            session.setPassword(SFTPPASS);
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.connect();
            channel = session.openChannel("sftp");
            channel.connect();
            channelSftp = (ChannelSftp)channel;
            channelSftp.cd(SFTPWORKINGDIR);
            Vector<String> filelist=new Vector<String>();

            LsEntrySelector selector = new LsEntrySelector() {
                public int select(LsEntry entry)  {
                    final String filename = entry.getFilename();
                    if (filename.equals(".") || filename.equals("..")) {
                        return CONTINUE;
                    }
                    if (entry.getAttrs().isLink()) {
                        filelist.addElement(filename);
                    }
                    else if (entry.getAttrs().isDir()) {
                        //if (keepDirectory(filename)) {
                        filelist.addElement(entry.getFilename());
                        //}
                    }
                    else {
                        //if (keepFile(filename)) {
                        filelist.addElement(entry.getFilename());
                        //}
                    }
                    return CONTINUE;
                }
            };
            channelSftp.ls(SFTPWORKINGDIR,selector);
            for(int i=0; i<filelist.size();i++){
                System.out.println(filelist.get(i).toString());
            }

        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}
like image 5
user3400505 Avatar answered Oct 15 '22 06:10

user3400505


for sftp you can getlist of file with

Vector<ChannelSftp.LsEntry> list = channelSftp.ls("*.*");
for(ChannelSftp.LsEntry entry:list) {
    System.out.println(entry.getFilename());
}

and there isn't built in function to get list file for exec and shell protocol, you have parse it from InputStream data.

like image 2
Mang Jojot Avatar answered Oct 15 '22 06:10

Mang Jojot