Java 使用 Jsch 列出远程服务器中的所有文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/35358762/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
List all files in remote server using Jsch
提问by Karthick Sambanghi
I am trying to list all the files/directory from a remote server using JSCH and i can able to get all the information as well..
我正在尝试使用 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's are 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 {
/**
* @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 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 ..
回答by CodeIsLife
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());
}
回答by krishnakumarp
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();
}
}
}
回答by user3400505
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();
}
}
}