mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
add SshjSftp
This commit is contained in:
parent
a59c87b7d2
commit
f572056d5a
@ -9,6 +9,7 @@
|
||||
* 【db 】 优化Condition参数拆分(pr#2046@Github)
|
||||
* 【core 】 优化ArrayUtil.isAllEmpty性能(pr#2045@Github)
|
||||
* 【core 】 CharSequenceUtil.replace方法支持增补字符(pr#2041@Github)
|
||||
* 【extra 】 增加SshjSftp(pr#493@Gitee)
|
||||
|
||||
### 🐞Bug修复
|
||||
* 【http 】 HttpUtil重定向次数失效问题(issue#I4O28Q@Gitee)
|
||||
|
@ -1,5 +1,6 @@
|
||||
package cn.hutool.extra.ssh;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.core.util.CharsetUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
@ -18,7 +19,6 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 在使用jsch 进行sftp协议下载文件时,总是中文乱码,而该框架源码又不允许设置编码。故:站在巨人的肩膀上,此类便孕育而出。
|
||||
@ -29,26 +29,54 @@ import java.util.stream.Collectors;
|
||||
* </p>
|
||||
*
|
||||
* @author youyongkun
|
||||
* @date 2021/12/31 14:51
|
||||
* @since 5.7.18
|
||||
* @since 5.7.19
|
||||
*/
|
||||
public class SshjSftp extends AbstractFtp {
|
||||
|
||||
private SSHClient ssh;
|
||||
private SFTPClient sftp;
|
||||
|
||||
/**
|
||||
* 构造,使用默认端口
|
||||
*
|
||||
* @param sshHost 主机
|
||||
*/
|
||||
public SshjSftp(String sshHost) {
|
||||
this(new FtpConfig(sshHost, 22, null, null, CharsetUtil.CHARSET_UTF_8));
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param sshHost 主机
|
||||
* @param sshUser 用户名
|
||||
* @param sshPass 密码
|
||||
*/
|
||||
public SshjSftp(String sshHost, String sshUser, String sshPass) {
|
||||
this(new FtpConfig(sshHost, 22, sshUser, sshPass, CharsetUtil.CHARSET_UTF_8));
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param sshHost 主机
|
||||
* @param sshPort 端口
|
||||
* @param sshUser 用户名
|
||||
* @param sshPass 密码
|
||||
*/
|
||||
public SshjSftp(String sshHost, int sshPort, String sshUser, String sshPass) {
|
||||
this(new FtpConfig(sshHost, sshPort, sshUser, sshPass, CharsetUtil.CHARSET_UTF_8));
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param sshHost 主机
|
||||
* @param sshPort 端口
|
||||
* @param sshUser 用户名
|
||||
* @param sshPass 密码
|
||||
* @param charset 编码
|
||||
*/
|
||||
public SshjSftp(String sshHost, int sshPort, String sshUser, String sshPass, Charset charset) {
|
||||
this(new FtpConfig(sshHost, sshPort, sshUser, sshPass, charset));
|
||||
}
|
||||
@ -68,7 +96,6 @@ public class SshjSftp extends AbstractFtp {
|
||||
* SSH 初始化并创建一个sftp客户端.
|
||||
*
|
||||
* @author youyongkun
|
||||
* @date 2021/12/31 14:59
|
||||
* @since 5.7.18
|
||||
*/
|
||||
public void init() {
|
||||
@ -115,22 +142,23 @@ public class SshjSftp extends AbstractFtp {
|
||||
public boolean mkdir(String dir) {
|
||||
try {
|
||||
sftp.mkdir(dir);
|
||||
return containsFile(dir);
|
||||
} catch (IOException e) {
|
||||
throw new FtpException(e);
|
||||
}
|
||||
return containsFile(dir);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> ls(String path) {
|
||||
List<RemoteResourceInfo> infoList;
|
||||
try {
|
||||
List<RemoteResourceInfo> infoList = sftp.ls(path);
|
||||
if (infoList != null && infoList.size() > 0) {
|
||||
return infoList.stream().map(info -> info.getName()).collect(Collectors.toList());
|
||||
}
|
||||
infoList = sftp.ls(path);
|
||||
} catch (IOException e) {
|
||||
throw new FtpException(e);
|
||||
}
|
||||
if (CollUtil.isNotEmpty(infoList)) {
|
||||
return CollUtil.map(infoList, RemoteResourceInfo::getName, true);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -177,9 +205,7 @@ public class SshjSftp extends AbstractFtp {
|
||||
public void recursiveDownloadFolder(String sourcePath, File destDir) {
|
||||
List<String> files = ls(sourcePath);
|
||||
if (files != null && !files.isEmpty()) {
|
||||
files.forEach(path -> {
|
||||
download(sourcePath + "/" + path, destDir);
|
||||
});
|
||||
files.forEach(path -> download(sourcePath + "/" + path, destDir));
|
||||
}
|
||||
}
|
||||
|
||||
@ -199,7 +225,6 @@ public class SshjSftp extends AbstractFtp {
|
||||
* @param fileDir 文件绝对路径
|
||||
* @return true:包含 false:不包含
|
||||
* @author youyongkun
|
||||
* @date 2021/12/31 15:36
|
||||
* @since 5.7.18
|
||||
*/
|
||||
public boolean containsFile(String fileDir) {
|
||||
@ -218,8 +243,7 @@ public class SshjSftp extends AbstractFtp {
|
||||
* @param exec 命令
|
||||
* @return 返回响应结果.
|
||||
* @author youyongkun
|
||||
* @date 2021/12/31 15:59
|
||||
* @since 5.7.18
|
||||
* @since 5.7.19
|
||||
*/
|
||||
public String command(String exec) {
|
||||
Session session = null;
|
||||
@ -231,13 +255,7 @@ public class SshjSftp extends AbstractFtp {
|
||||
} catch (Exception e) {
|
||||
throw new FtpException(e);
|
||||
} finally {
|
||||
if (session != null) {
|
||||
try {
|
||||
session.close();
|
||||
} catch (Exception e) {
|
||||
throw new FtpException(e);
|
||||
}
|
||||
}
|
||||
IoUtil.close(session);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
package cn.hutool.extra.ftp;
|
||||
package cn.hutool.extra.ssh;
|
||||
|
||||
import cn.hutool.core.util.CharsetUtil;
|
||||
import cn.hutool.extra.ssh.SshjSftp;
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.File;
|
||||
@ -12,7 +12,6 @@ import java.util.List;
|
||||
* 基于sshj 框架SFTP 封装测试.
|
||||
*
|
||||
* @author youyongkun
|
||||
* @date 2021/12/31 16:11
|
||||
* @since 5.7.18
|
||||
*/
|
||||
public class SftpTest {
|
||||
@ -20,11 +19,13 @@ public class SftpTest {
|
||||
private SshjSftp sshjSftp;
|
||||
|
||||
@Before
|
||||
@Ignore
|
||||
public void init() {
|
||||
sshjSftp = new SshjSftp("ip", 22, "test", "test", CharsetUtil.CHARSET_UTF_8);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void lsTest() {
|
||||
List<String> files = sshjSftp.ls("/");
|
||||
if (files != null && !files.isEmpty()) {
|
||||
@ -33,28 +34,33 @@ public class SftpTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void downloadTest() {
|
||||
sshjSftp.recursiveDownloadFolder("/home/test/temp", new File("C:\\Users\\akwangl\\Downloads\\temp"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void uploadTest() {
|
||||
sshjSftp.upload("/home/test/temp/", new File("C:\\Users\\akwangl\\Downloads\\temp\\辽宁_20190718_104324.CIME"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void mkDirTest() {
|
||||
boolean flag = sshjSftp.mkdir("/home/test/temp");
|
||||
System.out.println("是否创建成功: " + flag);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void mkDirsTest() {
|
||||
// 在当前目录下批量创建目录
|
||||
sshjSftp.mkDirs("/home/test/temp");
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void delDirTest() {
|
||||
sshjSftp.delDir("/home/test/temp");
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user