Java使用JSch实现SSH远程执行命令

ops/2024/9/24 5:20:33/

前言

有一个奇怪的需求,就是将本地的内容直接提交到远程服务器,并且需要针对文件夹进行处理。所以,这里就直接采用JSch来实现。在这里,感谢秀发浓密的程序猿的这篇博客,给了很大启发。

思路

既然是直接读取文件夹,我们就不考虑浏览器不能访问本地文件的问题了。直接就是Java处理,然后直接读取文件提交服务器。

当然,介于上传过程中是Windows上传到Linux,如果只传图片倒还没什么问题,传文件可就造了老罪了。还好我现在只有图片需求。

但也并不能掉以轻心,因为,就算是图片,名字也是中文的。

所以直接用UUID避免了上传乱码,等上传结束了再mv到目标文件夹中。

上代码

java">private static final String TMPDIR = "/data/ftp";
public static void sshSftpUpload(String ip, String user, String psw, int port, String localDirFileName, String destDir, String fileName) throws Exception {// 这些需要后期关闭的资源需要单独拉出来// 而由于OutputStream与InputStream在初始化时需要单独Override其中的write方法// 所以没办法直接用`try-catch-resource`语法糖给直接new出来// 所以单独声明,就干脆全放一起了Channel channel = null, channelShell = null;Session session = null;ChannelSftp sftp = null;String tmpFileName = "";OutputStream outStream = null;InputStream inStream = null;try {JSch jsch = new JSch();// 如果端口非法,使用默认端口if (port <= 0)session = jsch.getSession(user, ip);elsesession = jsch.getSession(user, ip, port);// 如果服务器连接不上,则抛出异常// 在真正返回值的地方再处理异常,单凭返回值没办法细致处理问题if (session == null)throw new Exception("session is null");// 设置主机令牌session.setPassword(psw);//设置第一次登陆的时候提示,可选值:(ask | yes | no)session.setConfig("StrictHostKeyChecking", "no");//设置登陆超时时间(30s)session.connect(30 * 1000);//创建sftp通信通道channel = session.openChannel("sftp");channel.connect(1000);// 强制转换,否则Channel类无法使用cd方法sftp = (ChannelSftp) channel;// 进入临时目录文件夹sftp.cd(TMPDIR);// 以下代码实现从本地上传一个文件到服务器// 上传时中文可能乱码,采用UUID规避tmpFileName = UUID.randomUUID().toString().replace("-", "").toLowerCase() + "." + fileName.substring(fileName.lastIndexOf('.') + 1);outStream = sftp.put(tmpFileName);// Files的构造函数是私有的,经典的单例模式,在项目中表现更佳inStream = Files.newInputStream(new File(localDirFileName).toPath());// 一如既往的上传操作byte[] b = new byte[1024];int n;while ((n = inStream.read(b)) != -1)outStream.write(b, 0, n);// 需要注意的是,你完全可以在这里调用flush,就像这样// outStream.flush();// 但flush往往会造成系统级IO操作// 所以个人不愿意在这里flush,而是在finally中flush// 传输完成  将文件转移到正式目录 - 注:exec不起作用channelShell = session.openChannel("shell");// 需要放置回车符模拟Shell的回车操作channelShell.setInputStream(new ByteArrayInputStream(("cp " + TMPDIR + "/" + tmpFileName + " " + destDir + "/" + fileName + " \n").getBytes(StandardCharsets.UTF_8)));// 将输出重定向到控制台channelShell.setOutputStream(System.out);channelShell.connect(5 * 1000);} catch (Exception e) {throw new Exception(e.getMessage());} finally {// 结束后关闭资源,有的是close,有的是flush,有的是disconnectif (outStream != null) {outStream.flush();outStream.close();}if (inStream != null) inStream.close();if (sftp != null) {// 删除临时文件sftp.rm(tmpFileName);sftp.disconnect();}if (session != null) session.disconnect();if (channel != null) channel.disconnect();if (channelShell != null) channelShell.disconnect();}
}

虽然finally很长,但是起码交付没啥问题

主打一个面向测试用例编程了。


http://www.ppmy.cn/ops/37234.html

相关文章

pip 安装插件加速技巧: 修改为国内源

在国内&#xff0c;用 pip 安装 python 依赖包的时候&#xff0c;总是会遇到 Timeout 或者下载太慢的问题。 这是因为 pip 源在国外&#xff0c;解决方法就是把 pip 源改成国内的&#xff0c;就可以实现 pip install 加速。 1. 国内有哪些 pip 源&#xff1f; 国内有几个名气比…

一体化设计的ATA(FXS网关)设计——电源插头、WiFi、双网口、S口、USB等接口集于一身

目录 集成电源插头集成WiFi集成USB两个网口FXS接口&#xff08;Phone&#xff09;集成创新 ATA&#xff08;FXS网关&#xff09;已经走过几十年的发展&#xff0c;很难有创新。 下面介绍的这款ATA&#xff08;FXS网关&#xff09;通过一体化设计的集成创新&#xff0c;成为一款…

MinimogWP WordPress 主题下载——优雅至上,功能无限

无论你是个人博客写手、创意工作者还是企业站点的管理员&#xff0c;MinimogWP 都将成为你在 WordPress 平台上的理想之选。以其优雅、灵活和功能丰富而闻名&#xff0c;MinimogWP 不仅提供了令人惊叹的外观&#xff0c;还为你的网站带来了无限的创作和定制可能性。 无与伦比的…

栈的2道面试题【有效的括号】【用栈实现队列】

栈的面试题&#xff1a; 1.有效的括号 题目&#xff1a; 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合…

vue的指令(参数,动态参数,修饰符,缩写等)(2024-05-07)

1、指令概念 指令 (Directives) 是带有 v- 前缀的特殊attribute。指令 attribute 的值预期是单个 JavaScript 表达式 (v-for指令 是例外情况)。指令的职责是&#xff0c;当表达式的值改变时&#xff0c;将其产生的连带影响&#xff0c;响应式地作用于 DOM。 <p v-if"s…

pgsql和mysql比较

pgsql相对于mysql的优势主要体现在以下几个方面&#xff1a; 稳定性和可靠性&#xff1a;PostgreSQL的稳定性极强&#xff0c;即使在崩溃、断电等灾难场景下也能表现出很好的抗打击能力。相比之下&#xff0c;很多MySQL用户都遇到过Server级的数据库丢失的情况。此外&#xff…

电脑显示丢失mfc140u.dll怎么修复,总共有7个方法

mfc140u.dll 是一个动态链接库&#xff08;Dynamic Link Library&#xff09;文件&#xff0c;它是Microsoft Foundation Class (MFC)库的一部分&#xff0c;专为使用C编程语言开发Windows应用程序而设计。MFC库由微软提供&#xff0c;作为一个高级的应用程序框架&#xff0c;旨…

性能测试基础介绍

1.性能测试的意义 1.1.现状 互联网行业发展快&#xff0c;用户量大大增加&#xff1b; 业务和系统架构越来越复杂&#xff0c;数据越来越多&#xff0c;用户不仅仅满足于功能的实现&#xff0c;在某些场景下&#xff0c;更 在意系统性能。 1.2.什么是性能测试 通过一定的手段&…