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

news/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/news/1456837.html

相关文章

使用AIGC生成软件类图表

文章目录 如何使用 AI 生成软件类图表什么是 MermaidMermaid 的图片如何保存&#xff1f;mermaid.liveDraw.io Mermaid可以画什么图&#xff1f;流程图时序图 / 序列图类图状态图甘特图实体关系图 / ER图 如何使用 AI 生成软件类图表 ChatGPT 大语言模型不能直接生成各类图表。…

外网禅道配置

exportfs -avrf 修改代码&#xff0c;避免启动太慢&#xff1a;vi /opt/zbox/bin/zbox.php 启动和停止 /opt/zbox/zbox start /opt/zbox/zbox stop

c++ std::unique_lcock 详解

std::unique_lock 是 C 标准库中的一个类&#xff0c;用于管理对互斥锁&#xff08;std::mutex 或其派生类&#xff09;的锁定和解锁。它提供了比 std::lock_guard 更灵活的控制&#xff0c;允许在需要时延迟锁定、提前解锁以及递归锁定等。 主要特性 延迟锁定&#xff1a;st…

./build.sh:行1: g++: 未找到命令的错误问题在centos操作系统下面如何解决

目录 g: 未找到命令报错解释g: 未找到命令解决方法题外&#xff1a;gcc和g的区别g常用命令 centos操作系统&#xff0c;执行一个bash&#xff0c;bash命令很简单&#xff0c;就是用g编译一个C的程序。报告错误&#xff1a; ./build.sh:行1: g: 未找到命令 g: 未找到命令报错解释…

Anaconda删除虚拟环境目录pkgs和envs|conda瘦身

这个文件夹里面是专门放不同环境中的包的&#xff0c;只是没有区分环境&#xff0c;都混在一起了&#xff0c; 一般在想要删除一个虚拟环境&#xff0c;除了在命令行中输入conda remove -n your_env_name(虚拟环境名称) --all 然后在envs中删除虚拟环境的文件夹&#xff0c; 还…

Node.js v20.12.2版本执行npm run dev 报openssl 错误2024最新修复方案

Node.js v20.12.2版本执行npm run dev 报openssl 错误2024最新修复方案 故障描述修复方案 故障描述 ERROR SyntaxError: missing ) after argument list C:\Users\xxx\Documents\workspace\WebstormProjects\xxxx\node_modules\webpack\lib\util\createHash.js:135return new …

巩固python1

今天做到一个随机验证码的题&#xff1a; import random as r zmb AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz r.seed(1) code for i in range(4):code r.choice(zmb) print(code)用到了random.seed方法&#xff0c;即随机种子 seed() 函数用于设置随机数生成…

docker部署nginx并配置https

1.准备SSL证书&#xff1a; 生成私钥&#xff1a;运行以下命令生成一个私钥文件。 生成证书请求&#xff08;CSR&#xff09;&#xff1a;运行以下命令生成证书请求文件。 生成自签名证书&#xff1a;使用以下命令生成自签名证书。 openssl genrsa -out example.com.key 2048 …