*1.导入jsch-0.1.51.jar包
2.创建SFTP封装类:
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.Session;
public class SFTP{
private Session session;//会话
private Channel channel;//连接通道
private ChannelSftp sftp;// sftp操作类
public Session getSession() {
return session;
}
public void setSession(Session session) {
this.session = session;
}
public Channel getChannel() {
return channel;
}
public void setChannel(Channel channel) {
this.channel = channel;
}
public ChannelSftp getSftp() {
return sftp;
}
public void setSftp(ChannelSftp sftp) {
this.sftp = sftp;
}
}
3.创建工具操作类:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
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 SFTPUtil {
private static Logger log = LogManager.getLogger(SFTPUtil.class);
/**
* 连接ftp/sftp服务器
* @param SFTP类
*/
public static void getConnect(SFTP s) throws Exception {
/** 密钥的密码 */
// String privateKey ="key";
// /** 密钥文件路径 */
// String passphrase ="path";
/** 主机 */
String host =""; //服务器ip地址
/** 端口 */
int port =22;
/** 用户名 */
String username =""; // 服务器用户名,密码
/** 密码 */
String password ="";
Session session = null;
Channel channel = null;
ChannelSftp sftp = null;// sftp操作类
JSch jsch = new JSch();
//设置密钥和密码
//支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息就可以了
// if (privateKey != null && !"".equals(privateKey)) {
// if (passphrase != null && "".equals(passphrase)) {
// //设置带口令的密钥
// jsch.addIdentity(privateKey, passphrase);
// } else {
// //设置不带口令的密钥
// jsch.addIdentity(privateKey);
// }
// }
session = jsch.getSession(username, host, port);
session.setPassword(password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no"); // 不验证 HostKey
session.setConfig(config);
try {
session.connect();
} catch (Exception e) {
if (session.isConnected())
session.disconnect();
log.error("连接服务器失败,请检查主机[" + host + "],端口[" + port
+ "],用户名[" + username + "],端口[" + port
+ "]是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.");
}
channel = session.openChannel("sftp");
try {
channel.connect();
} catch (Exception e) {
if (channel.isConnected())
channel.disconnect();
log.error("连接服务器失败,请检查主机[" + host + "],端口[" + port
+ "],用户名[" + username + "],密码是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.");
}
sftp = (ChannelSftp) channel;
s.setChannel(channel);
s.setSession(session);
s.setSftp(sftp);
}
/**
* 断开连接
*
*/
public static void disConn(Session session,Channel channel,ChannelSftp sftp)throws Exception{
if(null != sftp){
sftp.disconnect();
sftp.exit();
sftp = null;
}
if(null != channel){
channel.disconnect();
channel = null;
}
if(null != session){
session.disconnect();
session = null;
}
}
/**
* 进入目录
* @param directory
* @throws Exception
*/
public static void cd(String directory)throws Exception {
SFTP s=new SFTP();
getConnect(s);//建立连接
Session session = s.getSession();
Channel channel = s.getChannel();
ChannelSftp sftp = s.getSftp();// sftp操作类
try {
sftp.cd(directory); //目录要一级一级进
} catch (Exception e) {
throw new Exception(e.getMessage(),e);
} finally {
disConn(session,channel,sftp);
}
}
/**
* 列出目录下的文件
* @param directory 要列出的目录
* @return list 文件名列表
* @throws Exception
*/
public static List<String> listFiles(String directory) throws Exception {
SFTP s=new SFTP();
getConnect(s);//建立连接
Session session = s.getSession();
Channel channel = s.getChannel();
ChannelSftp sftp = s.getSftp();// sftp操作类
Vector fileList=null;
List<String> fileNameList = new ArrayList<String>();
fileList = sftp.ls(directory); //返回目录下所有文件名称
disConn(session,channel,sftp);
Iterator it = fileList.iterator();
while(it.hasNext()) {
String fileName = ((LsEntry)it.next()).getFilename();
if(".".equals(fileName) || "..".equals(fileName)){
continue;
}
fileNameList.add(fileName);
}
return fileNameList;
}
}