前言
最近在公司需要通过SSH然后对SFTP连接,然后进行操作,所以在这里记录一下,方便自己以后使用,也方便给大家作为参考。
正文
首先得需要对JSch进行依赖引用,项目由gradle进行搭建。
以下是build.gradle 代码:
// https://mvnrepository.com/artifact/com.jcraft/jsch
compile group: 'com.jcraft', name: 'jsch', version: '0.1.54'
然后需要一个实体类,用来配置我们的JSch的相关参数。
Tips:公司使用的是AWS,参数都是配置在ECS里的。所以我需要从环境变量里取出相应的值,大家可以自行修改成 hard code。
实体类:
public class SftpConfigProperties {
public static final String environment=System.getenv("PUBLISHER_ENVIRONMENT");
public static final String sftpUsername=System.getenv("PUBLISHER_SFTP_USERNAME");
public static final String sftpHost=System.getenv("PUBLISHER_SFTP_HOST");
public static final int sftpPort=Integer.valueOf(System.getenv("PUBLISHER_SFTP_PORT"));
public static final String sftpPassword=System.getenv("PUBLISHER_SFTP_PASSWORD");
public static final String sftpFilePath="/"+environment+"/dir_publisher_sftp";
}
最后,最重要的是jsch的主类:
代码如下:
package com.harry.jsch;
import com.jcraft.jsch.*;
import com.kingland.dst.config.SftpConfigProperties;
import org.apache.log4j.Logger;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;
/**
* this method is used to connect to sftp with jsch
*/
public class SftpConnectUtil {
private static Logger logger=Logger.getLogger(SftpConnectUtil.class);
/**
* 这个方法用来连接到sftp
* @param ip
* @param user
* @param password
* @param port
* @return session
*/
public Session connect(String ip,String user,String password,int port){
logger.info("start to connect to sftp");
Session session=null;
JSch jsch=new JSch();
try {
//给出连接需要的用户名,ip地址以及端口号
session=jsch.getSession(user, ip, port);
//第一次登陆时候,是否需要提示信息,value可以填写 yes,no或者是ask
session.setConfig("StrictHostKeyChecking", "no");
//设置是否超时
session.setTimeout(10000);
//设置密码
session.setPassword(password);
//创建连接
session.connect();
logger.info("sftp session set properties success");
} catch (JSchException e) {
e.printStackTrace();
}
if(session == null) {
logger.error("session is null");
}else if(session.isConnected() == true) {
logger.info("connet to sftp server is successful");
}
return session;
}
/**
* 这个方法用来上传文件
* @param session
* @param filePath
* @param fileName
*/
public void uploadFile(Session session,String filePath,String fileName) {
ChannelSftp channel =null;
String filePathName=filePath+File.separator+fileName;
FileInputStream fis =null;
try {
fis = new FileInputStream(new File(filePathName));
// 创建连接的形式,这里是sftp
channel =(ChannelSftp)session.openChannel("sftp");
channel.connect();
channel.cd(SftpConfigProperties.sftpFilePath);
channel.put(fis, fileName);
channel.exit();
fis.close();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//这个方法用来删除sftp上对应的文件
//ls方法是用来将制定文件夹下的文件名都给取出来
//遍历之后,拿到文件名进行删除,可以在删除前,给出判断条件,或者是制定文件名
public void deleteExpireFile(ChannelSftp channel){
Vector vector=channel.ls(SftpConfigProperties.sftpFilePath);
for(Object obj:vector){
if(obj instanceof ChannelSftp.LsEntry){
String fileName=((ChannelSftp.LsEntry) obj).getFilename();
if (".".equals(fileName) || "..".equals(fileName)) {
continue;
}
channel.rm(fileName);
logger.info("success delete the file :"+SftpConfigProperties.sftpFilePath+File.separator+fileName);
}
}
}
}
最后
谢谢大家的观看,希望可以帮助到大家