简体   繁体   English

使用 JSch 列出远程服务器中的所有文件

[英]List all files in remote server using JSch

I am trying to list all the files/directory from a remote server using JSch.我正在尝试使用 JSch 列出来自远程服务器的所有文件/目录。

But my problem is JSch list all the files with file creation date, time stamp, type of read/write permission etc..,但我的问题是 JSch 列出了所有文件,包括文件创建日期、时间戳、读/写权限类型等,

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..下面是我的一段Java代码..

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 ..

Try running this code.尝试运行此代码。 Here we are typecasting the list elements to LsEntry and then printing the required attribute.这里我们将列表元素类型转换为 LsEntry,然后打印所需的属性。

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();
        }
    }
}

Use LSEntrySelector for accessing the properties of returned file list.使用 LSEntrySelector 访问返回文件列表的属性。

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();
        }
    }
}

for sftp you can getlist of file with对于sftp您可以使用

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.并且没有内置函数来获取execshell协议的列表文件,您已经从InputStream数据解析它。

try to exec ls command :尝试执行 ls 命令:

Channel channel=session.openChannel("exec"); 
((ChannelExec)channel).setCommand("cd " + SFTPWORKINGDIR + " && ls");
channel.connect();
channel.run();

Vector filelist = channel.run();
for (int i = 0; i < filelist.size(); i++) {
    System.out.println(filelist.get(i).toString());
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM