diff --git a/src/main/java/com/example/ftpdemo/controller/SSHRemoteCall.java b/src/main/java/com/example/ftpdemo/controller/SSHRemoteCall.java index aa46aa9..ebc14c1 100644 --- a/src/main/java/com/example/ftpdemo/controller/SSHRemoteCall.java +++ b/src/main/java/com/example/ftpdemo/controller/SSHRemoteCall.java @@ -295,7 +295,7 @@ public class SSHRemoteCall { } } } - channelSftp.disconnect(); +// channelSftp.disconnect(); } diff --git a/src/main/java/com/example/ftpdemo/service/impl/MethodImpl.java b/src/main/java/com/example/ftpdemo/service/impl/MethodImpl.java index 9e4990c..d98b609 100644 --- a/src/main/java/com/example/ftpdemo/service/impl/MethodImpl.java +++ b/src/main/java/com/example/ftpdemo/service/impl/MethodImpl.java @@ -5,7 +5,6 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.example.ftpdemo.cache.CodeCache; -import com.example.ftpdemo.controller.SSHRemoteCall; import com.example.ftpdemo.entity.NbmsEnprefix; import com.example.ftpdemo.entity.NbmsEntApply; import com.example.ftpdemo.service.Method; @@ -13,6 +12,7 @@ import com.example.ftpdemo.service.NbmsEnprefixService; import com.example.ftpdemo.service.NbmsEntApplyServcie; import com.example.ftpdemo.util.Constant; import com.example.ftpdemo.util.Encrypt; +import com.example.ftpdemo.util.JschUtil; import com.jcraft.jsch.*; import com.xxl.job.core.context.XxlJobHelper; import lombok.AllArgsConstructor; @@ -64,12 +64,17 @@ public class MethodImpl implements Method { stream.close(); // 远程连接服务器 - SSHRemoteCall.getInstance().sshRemoteCallLogin(Constant.ipAddress, Constant.userName, Constant.password); +// SSHRemoteCall.getInstance().sshRemoteCallLogin(Constant.ipAddress, Constant.userName, Constant.password); + JschUtil jschUtil = new JschUtil(Constant.ipAddress, 22102, Constant.userName, Constant.password); + jschUtil.connect(); // 确保目录一定存在 - SSHRemoteCall.getInstance().directory(upSrc); +// SSHRemoteCall.getInstance().directory(upSrc); + jschUtil.directory(upSrc); // 上传文件到指定目录 - SSHRemoteCall.getInstance().uploadFile("/data1/qingniao/" + upSrc + "/" + fileName, src); +// SSHRemoteCall.getInstance().uploadFile("/data1/qingniao/" + upSrc + "/" + fileName, src); + jschUtil.upload( src,"/data1/qingniao/" + upSrc + "/" + fileName); + } /** diff --git a/src/main/java/com/example/ftpdemo/util/JschUtil.java b/src/main/java/com/example/ftpdemo/util/JschUtil.java new file mode 100644 index 0000000..dc81dd2 --- /dev/null +++ b/src/main/java/com/example/ftpdemo/util/JschUtil.java @@ -0,0 +1,341 @@ +package com.example.ftpdemo.util; + +import com.jcraft.jsch.*; +import com.xxl.job.core.context.XxlJobHelper; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Properties; + +public class JschUtil { + + // sftp通道 + ChannelSftp chSftp; + private JSch jSch; + // session对象 + private Session session; + // JAVA与主机的连接通道 + private Channel channel; + // 主机ip + private String host; + + // 主机端口号 + private int port; + + // 主机账号 + private String username; + + // 主机密码 + private String password; + + public JschUtil(String host, int port, String username, String password) { + this.host = host; + this.port = port; + this.username = username; + this.password = password; + } + + public JschUtil() { + } + + /** + * 检测是否可以和主机通信 + * + * @return + */ + public boolean connect() { + + jSch = new JSch(); + + boolean reulst = false; + + try { + + // 根据主机账号、ip、端口获取一个Session对象 + session = jSch.getSession(username, host, port); + + // 存放主机密码 + session.setPassword(password); + + // 首次连接,去掉公钥确认 + Properties config = new Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + + // 超时连接时间为3秒 + session.setTimeout(30000); + + // 进行连接 + session.connect(); + + // 获取连接结果 + reulst = session.isConnected(); + + if (!reulst) { + XxlJobHelper.log("【连接】获取连接失败"); + } + + } catch (JSchException e) { + XxlJobHelper.log(e.getMessage()); + } finally { + close(); + } + return reulst; + } + + /** + * 关闭连接 + */ + public void close() { + + if (channel != null && channel.isConnected()) { + channel.disconnect(); + } + + if (session != null && session.isConnected()) { + session.disconnect(); + } + + if (chSftp != null && chSftp.isConnected()) { + chSftp.quit(); + } + + } + + /** + * 执行shell命令 + * + * @param command + * @return + */ + public String execCommand(String command) { + + jSch = new JSch(); + + // 存放执行命令结果 + StringBuffer result = new StringBuffer(); + int exitStatus = 0; + + try { + + // 根据主机账号、ip、端口获取一个Session对象 + session = jSch.getSession(username, host, port); + + // 存放主机密码 + session.setPassword(password); + + // 去掉首次连接确认 + Properties config = new Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + + // 超时连接时间为3秒 + session.setTimeout(3000); + + // 进行连接 + session.connect(); + + channel = session.openChannel("exec"); + ((ChannelExec) channel).setCommand(command); + + channel.setInputStream(null); + // 错误信息输出流,用于输出错误的信息,当exitstatus<0的时候 + ((ChannelExec) channel).setErrStream(System.err); + + // 执行命令,等待执行结果 + channel.connect(); + + // 获取命令执行结果 + InputStream in = channel.getInputStream(); + + /** + * 通过channel获取信息的方式,采用官方Demo代码 + */ + byte[] tmp = new byte[1024]; + while (true) { + while (in.available() > 0) { + int i = in.read(tmp, 0, 1024); + if (i < 0) { + break; + } + result.append(new String(tmp, 0, i)); + } + // 从channel获取全部信息之后,channel会自动关闭 + if (channel.isClosed()) { + if (in.available() > 0) { + continue; + } + exitStatus = channel.getExitStatus(); + break; + } + try { + Thread.sleep(1000); + } catch (Exception ee) { + } + } + + + } catch (IOException e) { + XxlJobHelper.log(e.getMessage()); + } catch (JSchException e) { + XxlJobHelper.log(e.getMessage()); + } finally { + close(); + } + + XxlJobHelper.log("退出码为:" + exitStatus); + return result.toString(); + } + + /** + * 文件上传至主机 + * + * @param directory 当前文件路径 + * @param uploadFile 上传至主机的路径 + */ + public void upload(String directory, String uploadFile) { + // 创建JSch对象 + jSch = new JSch(); + + try { + // 根据主机账号、ip、端口获取一个Session对象 + session = jSch.getSession(username, host, port); + // 存放主机密码 + session.setPassword(password); + // 去掉首次连接确认 + Properties config = new Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + // 超时连接时间为3秒 + session.setTimeout(30000); + // 进行连接 + session.connect(); + // 打开SFTP通道 + chSftp = (ChannelSftp) session.openChannel("sftp"); + // 建立STFP连接 + chSftp.connect(); + // 设置编码格式 + chSftp.setFilenameEncoding("UTF-8"); + // 创建一个文件名称问uploadFile的文件 + File file = new File(uploadFile); + chSftp.put(new FileInputStream(file), uploadFile); + XxlJobHelper.log("文件上传成功到:"+file.getName()); + } catch (JSchException | SftpException | FileNotFoundException e) { + XxlJobHelper.log(e.getMessage()); + } finally { + close(); + } + } + + /** + * 将主机文件下载至本地 + * + * @param directory 下载到本地的位置 + * @param downloadFile 下载文件在虚拟机的位置 + */ + public void download(String directory, String downloadFile) { + + try { + jSch = new JSch(); + + // 根据主机账号、ip、端口获取一个Session对象 + session = jSch.getSession(username, host, port); + + // 存放主机密码 + session.setPassword(password); + + // 去掉首次连接确认 + Properties config = new Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + + // 超时连接时间为3秒 + session.setTimeout(30000); + + // 进行连接 + session.connect(); + + // 打开SFTP通道 + chSftp = (ChannelSftp) session.openChannel("sftp"); + + // 建立SFTP通道的连接 + chSftp.connect(); + + // 设置编码格式 + chSftp.setFilenameEncoding("UTF-8"); + + /** + * 说明: + * 1、当前上读取文件信息没有任何反馈,如果没有异常则代表成功 + * 2、如果需要判断是否读取成功的进度,可参考https://blog.csdn.net/coding99/article/details/52416373?locationNum=13&fps=1 + * 3、将src文件下载到dst路径中 + */ + chSftp.get(directory, downloadFile); + + XxlJobHelper.log("文件下载成功"); + } catch (JSchException | SftpException e) { + XxlJobHelper.log(e.getMessage()); + } finally { + close(); + } + } + + /** + * 如果此目录不存在将新建目录 + */ + public void directory(String path) { + + try { + jSch = new JSch(); + + // 根据主机账号、ip、端口获取一个Session对象 + session = jSch.getSession(username, host, port); + + // 存放主机密码 + session.setPassword(password); + + // 去掉首次连接确认 + Properties config = new Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + + // 超时连接时间为3秒 + session.setTimeout(30000); + + // 进行连接 + session.connect(); + + // 打开SFTP通道 + chSftp = (ChannelSftp) session.openChannel("sftp"); + + // 建立SFTP通道的连接 + chSftp.connect(); + + String[] folders = path.split("/"); + for (String folder : folders) { + if (folder.length() > 0) { + try { + chSftp.cd(folder); + } catch (SftpException e) { + try { + chSftp.mkdir(folder); + XxlJobHelper.log("生成目录" + folder); + chSftp.cd(folder); + } catch (SftpException ex) { + throw new RuntimeException(ex); + } + } + } + } + + } catch (JSchException e) { + throw new RuntimeException(e); + } finally { + close(); + } + } + +} +