|
|
|
@@ -0,0 +1,291 @@ |
|
|
|
package com.ruoyi.platform.utils; |
|
|
|
|
|
|
|
import java.io.ByteArrayInputStream; |
|
|
|
import java.io.File; |
|
|
|
import java.io.FileInputStream; |
|
|
|
import java.io.FileNotFoundException; |
|
|
|
import java.io.FileOutputStream; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.io.UnsupportedEncodingException; |
|
|
|
import java.util.Properties; |
|
|
|
import java.util.Vector; |
|
|
|
|
|
|
|
import org.apache.commons.io.IOUtils; |
|
|
|
import org.slf4j.Logger; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
|
|
|
|
import com.jcraft.jsch.Channel; |
|
|
|
import com.jcraft.jsch.ChannelSftp; |
|
|
|
import com.jcraft.jsch.JSch; |
|
|
|
import com.jcraft.jsch.JSchException; |
|
|
|
import com.jcraft.jsch.Session; |
|
|
|
import com.jcraft.jsch.SftpException; |
|
|
|
|
|
|
|
/** |
|
|
|
* |
|
|
|
* @ClassName: SFTPUtil |
|
|
|
* @Description: sftp连接工具类 |
|
|
|
* @date 2017年5月22日 下午11:17:21 |
|
|
|
* @version 1.0.0 |
|
|
|
*/ |
|
|
|
public class SFTPUtil { |
|
|
|
private transient Logger log = LoggerFactory.getLogger(this.getClass()); |
|
|
|
|
|
|
|
private ChannelSftp sftp; |
|
|
|
|
|
|
|
private Session session; |
|
|
|
/** FTP 登录用户名*/ |
|
|
|
private String username; |
|
|
|
/** FTP 登录密码*/ |
|
|
|
private String password; |
|
|
|
/** 私钥 */ |
|
|
|
private String privateKey; |
|
|
|
/** FTP 服务器地址IP地址*/ |
|
|
|
private String host; |
|
|
|
/** FTP 端口*/ |
|
|
|
private int port; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 构造基于密码认证的sftp对象 |
|
|
|
* @param userName |
|
|
|
* @param password |
|
|
|
* @param host |
|
|
|
* @param port |
|
|
|
*/ |
|
|
|
public SFTPUtil(String username, String password, String host, int port) { |
|
|
|
this.username = username; |
|
|
|
this.password = password; |
|
|
|
this.host = host; |
|
|
|
this.port = port; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 构造基于秘钥认证的sftp对象 |
|
|
|
* @param userName |
|
|
|
* @param host |
|
|
|
* @param port |
|
|
|
* @param privateKey |
|
|
|
*/ |
|
|
|
public SFTPUtil(String username, String host, int port, String privateKey) { |
|
|
|
this.username = username; |
|
|
|
this.host = host; |
|
|
|
this.port = port; |
|
|
|
this.privateKey = privateKey; |
|
|
|
} |
|
|
|
|
|
|
|
public SFTPUtil(){} |
|
|
|
|
|
|
|
/** |
|
|
|
* 连接sftp服务器 |
|
|
|
* |
|
|
|
* @throws Exception |
|
|
|
*/ |
|
|
|
public void login(){ |
|
|
|
try { |
|
|
|
JSch jsch = new JSch(); |
|
|
|
if (privateKey != null) { |
|
|
|
jsch.addIdentity(privateKey);// 设置私钥 |
|
|
|
log.info("sftp connect,path of private key file:{}" , privateKey); |
|
|
|
} |
|
|
|
log.info("sftp connect by host:{} username:{}",host,username); |
|
|
|
|
|
|
|
session = jsch.getSession(username, host, port); |
|
|
|
log.info("Session is build"); |
|
|
|
if (password != null) { |
|
|
|
session.setPassword(password); |
|
|
|
} |
|
|
|
Properties config = new Properties(); |
|
|
|
config.put("StrictHostKeyChecking", "no"); |
|
|
|
|
|
|
|
session.setConfig(config); |
|
|
|
session.connect(); |
|
|
|
log.info("Session is connected"); |
|
|
|
|
|
|
|
Channel channel = session.openChannel("sftp"); |
|
|
|
channel.connect(); |
|
|
|
log.info("channel is connected"); |
|
|
|
|
|
|
|
sftp = (ChannelSftp) channel; |
|
|
|
log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port)); |
|
|
|
} catch (JSchException e) { |
|
|
|
log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{host, port, e.getMessage()}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 关闭连接 server |
|
|
|
*/ |
|
|
|
public void logout(){ |
|
|
|
if (sftp != null) { |
|
|
|
if (sftp.isConnected()) { |
|
|
|
sftp.disconnect(); |
|
|
|
log.info("sftp is closed already"); |
|
|
|
} |
|
|
|
} |
|
|
|
if (session != null) { |
|
|
|
if (session.isConnected()) { |
|
|
|
session.disconnect(); |
|
|
|
log.info("sshSession is closed already"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 将输入流的数据上传到sftp作为文件 |
|
|
|
* |
|
|
|
* @param directory |
|
|
|
* 上传到该目录 |
|
|
|
* @param sftpFileName |
|
|
|
* sftp端文件名 |
|
|
|
* @param in |
|
|
|
* 输入流 |
|
|
|
* @throws SftpException |
|
|
|
* @throws Exception |
|
|
|
*/ |
|
|
|
public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{ |
|
|
|
try { |
|
|
|
sftp.cd(directory); |
|
|
|
} catch (SftpException e) { |
|
|
|
log.warn("directory is not exist"); |
|
|
|
sftp.mkdir(directory); |
|
|
|
sftp.cd(directory); |
|
|
|
} |
|
|
|
sftp.put(input, sftpFileName); |
|
|
|
log.info("file:{} is upload successful" , sftpFileName); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 上传单个文件 |
|
|
|
* |
|
|
|
* @param directory |
|
|
|
* 上传到sftp目录 |
|
|
|
* @param uploadFile |
|
|
|
* 要上传的文件,包括路径 |
|
|
|
* @throws FileNotFoundException |
|
|
|
* @throws SftpException |
|
|
|
* @throws Exception |
|
|
|
*/ |
|
|
|
public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{ |
|
|
|
File file = new File(uploadFile); |
|
|
|
upload(directory, file.getName(), new FileInputStream(file)); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。 |
|
|
|
* |
|
|
|
* @param directory |
|
|
|
* 上传到sftp目录 |
|
|
|
* @param sftpFileName |
|
|
|
* 文件在sftp端的命名 |
|
|
|
* @param byteArr |
|
|
|
* 要上传的字节数组 |
|
|
|
* @throws SftpException |
|
|
|
* @throws Exception |
|
|
|
*/ |
|
|
|
public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{ |
|
|
|
upload(directory, sftpFileName, new ByteArrayInputStream(byteArr)); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 将字符串按照指定的字符编码上传到sftp |
|
|
|
* |
|
|
|
* @param directory |
|
|
|
* 上传到sftp目录 |
|
|
|
* @param sftpFileName |
|
|
|
* 文件在sftp端的命名 |
|
|
|
* @param dataStr |
|
|
|
* 待上传的数据 |
|
|
|
* @param charsetName |
|
|
|
* sftp上的文件,按该字符编码保存 |
|
|
|
* @throws UnsupportedEncodingException |
|
|
|
* @throws SftpException |
|
|
|
* @throws Exception |
|
|
|
*/ |
|
|
|
public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{ |
|
|
|
upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName))); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 下载文件 |
|
|
|
* |
|
|
|
* @param directory |
|
|
|
* 下载目录 |
|
|
|
* @param downloadFile |
|
|
|
* 下载的文件 |
|
|
|
* @param saveFile |
|
|
|
* 存在本地的路径 |
|
|
|
* @throws SftpException |
|
|
|
* @throws FileNotFoundException |
|
|
|
* @throws Exception |
|
|
|
*/ |
|
|
|
public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{ |
|
|
|
if (directory != null && !"".equals(directory)) { |
|
|
|
sftp.cd(directory); |
|
|
|
} |
|
|
|
File file = new File(saveFile); |
|
|
|
sftp.get(downloadFile, new FileOutputStream(file)); |
|
|
|
log.info("file:{} is download successful" , downloadFile); |
|
|
|
} |
|
|
|
/** |
|
|
|
* 下载文件 |
|
|
|
* @param directory 下载目录 |
|
|
|
* @param downloadFile 下载的文件名 |
|
|
|
* @return 字节数组 |
|
|
|
* @throws SftpException |
|
|
|
* @throws IOException |
|
|
|
* @throws Exception |
|
|
|
*/ |
|
|
|
public byte[] download(String directory, String downloadFile) throws SftpException, IOException{ |
|
|
|
if (directory != null && !"".equals(directory)) { |
|
|
|
sftp.cd(directory); |
|
|
|
} |
|
|
|
InputStream is = sftp.get(downloadFile); |
|
|
|
|
|
|
|
byte[] fileData = IOUtils.toByteArray(is); |
|
|
|
|
|
|
|
log.info("file:{} is download successful" , downloadFile); |
|
|
|
return fileData; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 删除文件 |
|
|
|
* |
|
|
|
* @param directory |
|
|
|
* 要删除文件所在目录 |
|
|
|
* @param deleteFile |
|
|
|
* 要删除的文件 |
|
|
|
* @throws SftpException |
|
|
|
* @throws Exception |
|
|
|
*/ |
|
|
|
public void delete(String directory, String deleteFile) throws SftpException{ |
|
|
|
sftp.cd(directory); |
|
|
|
sftp.rm(deleteFile); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 列出目录下的文件 |
|
|
|
* |
|
|
|
* @param directory |
|
|
|
* 要列出的目录 |
|
|
|
* @param sftp |
|
|
|
* @return |
|
|
|
* @throws SftpException |
|
|
|
*/ |
|
|
|
public Vector<?> listFiles(String directory) throws SftpException { |
|
|
|
return sftp.ls(directory); |
|
|
|
} |
|
|
|
|
|
|
|
public static void main(String[] args) throws SftpException, IOException { |
|
|
|
SFTPUtil sftp = new SFTPUtil("lanhuigu", "123456", "192.168.200.12", 22); |
|
|
|
sftp.login(); |
|
|
|
//byte[] buff = sftp.download("/opt", "start.sh"); |
|
|
|
//System.out.println(Arrays.toString(buff)); |
|
|
|
File file = new File("D:\\upload\\index.html"); |
|
|
|
InputStream is = new FileInputStream(file); |
|
|
|
|
|
|
|
sftp.upload("/data/work", "test_sftp_upload.csv", is); |
|
|
|
sftp.logout(); |
|
|
|
} |
|
|
|
} |