当前位置: 首页 > news >正文

java实现连接linux(上传文件,执行shell命令等)

1 导入pom

 <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency>

2 编写配置类

package com.budwk.app.atest;import com.budwk.app.common.config.AppException;
import com.jcraft.jsch.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.IOUtils;
import org.nutz.ioc.loader.annotation.IocBean;import java.io.*;
import java.util.ArrayList;
import java.util.List;@Config
@Slf4j
public class JSchSessionComponent {private static final String ip = "172.168.1.1";private static final int port = 22;private static final String userName = "root";private static final String password = "123456";/*** jsch创建连接* @return*/public Session getJSchSession(){JSch jSch = new JSch();Session session = null;try {//创建连接session = jSch.getSession(userName,ip,port);session.setPassword(password);//是否使用密钥登录,一般默认为nosession.setConfig("StrictHostKeyChecking", "no");boolean connected = session.isConnected();if (connected) {return session;}//启用连接session.connect(15222200);log.info("服务器连接成功");return session;}catch (Exception e){log.error("服务器连接失败", e);throw new AppException("服务器连接失败");}}//jsch关闭连接public void closeJSchSession(Session session){log.info("关闭连接开始");if (session != null) {session.disconnect();log.info("关闭连接结束");}}public boolean uploadFile(Session sshSession, File file) {log.info("文件正在上传中,请等待......");boolean isSuccess = false;InputStream is = null;try {Channel channel = sshSession.openChannel("sftp");channel.connect();ChannelSftp sftp = (ChannelSftp) channel;sftp.cd("/data/www/wk-mini/");//上传时接文件的服务器的存放目录String fileName =file.getName();is = new FileInputStream(file);sftp.put(is, fileName, ChannelSftp.OVERWRITE);//有重名文件覆盖log.info("文件上传结束");isSuccess = true;} catch (Exception e) {log.error("linux upload File error:", e);throw new AppException("文件上传失败");} finally {IOUtils.closeQuietly(is);}return isSuccess;}public List<String> executeShell(Session session , List<String> commands){log.info("项目开始启动,请等待");//用来存放命令的返回值List<String> cmdResult = new ArrayList<>();for (String command : commands) {Channel channel = null;try {//创建执行通道channel = session.openChannel("exec");//设置命令((ChannelExec) channel).setCommand(command);//连接通道channel.connect();//读取通道的输出InputStream in = channel.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));//存放命令的执行结果,如果结果有很多行,则每次line的值不同String line;//lines用来拼接line结果StringBuffer lines = new StringBuffer();while ((line = reader.readLine()) != null) {//去除头尾的空格line.trim();lines = lines.append(line);}//如果命令执行没有返回值,则直接输出没有返回值if (String.valueOf(lines).equals("")){cmdResult.add("命令["+command+"]执行成功,但没有返回值");}else {//否则将每行返回直接存入到list中cmdResult.add(String.valueOf(lines));}reader.close();channel.disconnect();} catch (Exception e) {log.error("启动失败", e);throw new AppException("启动失败");}}log.info("项目启动已结束..................");return cmdResult;}
}

3 测试

package com.budwk.app.atest;import com.jcraft.jsch.*;
import org.nutz.ioc.loader.annotation.IocBean;import java.io.*;
import java.util.ArrayList;
import java.util.List;@IocBean
public class TestDemo {public static void main(String[] args) {// 1 先建立连接JSchSessionComponent jSchSessionComponent = new JSchSessionComponent();Session session = jSchSessionComponent.getJSchSession();File file = new File("E:\\target\\111.jar");
//        File file = new File("E:\\target\\1.txt");boolean b = jSchSessionComponent.uploadFile(session, file);if (b) {System.out.println("文件上传成功");}jSchSessionComponent.closeJSchSession(session);//        TestDemo t = new TestDemo();
//        t.executeSheel();}private void executeSheel() {JSchSessionComponent jSchSessionComponent = new JSchSessionComponent();Session session = jSchSessionComponent.getJSchSession();// 执行命令List<String> cmds = new ArrayList<>();cmds.add("cd /data/www/;chmod u+x start.sh;./start.sh");jSchSessionComponent.executeShell(session, cmds);}//用来执行命令//Session表示传递连接对话,commands表示传递命令集合}

4 start.sh文件内容体

# sh  ./monitorstart.sh
# sh  ./jobstart.sh#!/bin/sh
RESOURCE_NAME=wkProject.jartpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fitpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; thenecho 'App is running.'
elseecho 'App is NOT running.'
firm -f tpid
rm -f wkProject.log
nohup java -jar ./$RESOURCE_NAME >>wkProject.log  2>&1 &
echo $! > tpid
echo Start Success!

http://www.lryc.cn/news/241198.html

相关文章:

  • 苹果企业签名和TF签名都是iOS内测中的常见方法有哪些?
  • CC++输入输出流介绍
  • leedcode 刷题 - 除自身以外数组的乘积 - 和为 K 的子数组
  • uniapp 富文本以及移动端富文本的展示问题
  • JAVA sql 查询
  • 掌握Katalon Studio 导入 swagger 接口文档,接口测试效率提升100%
  • 程序员最奔溃的瞬间
  • java字符串的常见用法
  • 链表OJ--下
  • FreeRTOS源码阅读笔记4--semphr.h
  • 面试:MyBatis问题
  • vue中页面(路由)跳转及传值的几种方式 router-link + query + params
  • 媒体格式转换软件Permute 3 mac中文版软件特点
  • Docker实用篇
  • 开启数据库审计(db,extended级别或os级别),并将审计文件存放到/home/oracle/audit下
  • 单片机语音芯片开发要解决的问题
  • Cesium 展示——地球以及渲染数据导出(下载)为图片或 pdf
  • 大数据平台红蓝对抗 - 磨利刃,淬精兵! | 京东云技术团队
  • java游戏制作-王者荣耀游戏
  • Linux实验三:shell程序设计: shell基础
  • webpack环境变量的设置
  • 基于51单片机音乐盒设计( proteus仿真+程序+原理图+PCB+报告+讲解视频)
  • 技术分享| anyRTC之RTN网络
  • 基于GPRS的汽车碰撞自动报警系统(论文+源码)
  • qgis添加wms服务
  • 【DQN】基于pytorch的强化学习算法Demo
  • 【C++】泛型编程 ⑭ ( 类模板示例 - 数组类模板 | 容器思想 | 自定义类可拷贝 - 深拷贝与浅拷贝 | 自定义类可打印 - 左移运算符重载 )
  • 砖家测评:腾讯云标准型S5服务器和s6性能差异和租用价格
  • Linux常用命令——blkid命令
  • ES 万条以外分页检索功能实现及注意事项