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

news/2024/7/7 20:38:29

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);
            //是否使用密钥登录,一般默认为no
            session.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.jar
 
tpid=`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!'
fi
 
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'App is running.'
else
    echo 'App is NOT running.'
fi
 
rm -f tpid
rm -f wkProject.log
nohup java -jar ./$RESOURCE_NAME >>wkProject.log  2>&1 &
echo $! > tpid
echo Start Success!


http://lihuaxi.xjx100.cn/news/1830218.html

相关文章

计算机毕业设计 基于SpringBoot的无人智慧超市管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解+答疑

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Oracle SQL 注入上的 Django GIS 函数和聚合漏洞 (CVE-2020-9402)

漏洞描述 Django 于2020年3 月4日发布了一个安全更新&#xff0c;修复了 GIS 函数和聚合中的 SQL 注入漏洞。 参考链接&#xff1a; Django security releases issued: 3.0.4, 2.2.11, and 1.11.29 | Weblog | Django 该漏洞要求开发者使用 JSONField/HStoreField;此外&…

实现流量控制和熔断降级

Sentinel Sentinel 是阿里巴巴开源的一款高可用性和流量控制的分布式系统。它最初是为了解决阿里巴巴内部的微服务架构中的流量控制和熔断降级问题而开发的。Sentinel 旨在提供实时的流量控制、熔断降级、系统负载保护等功能&#xff0c;以保障应用的高可用性和稳定性。以下是…

LeetCode Hot100 102.二叉树的层序遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 方法&#xff1a;迭代 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if …

Android Gradle 升级到7.x及Maven推送问题

7.0以下的Android插件工程使用Maven上传时脚本如下所示。 plugins {id com.android.libraryid kotlin-androidid maven }// 源代码一起打包 task androidSourcesJar(type: Jar) {archiveClassifier.set(sources)from android.sourceSets.main.java.sourceFiles }uploadArchive…

使用new Vue()的时候发生了什么?

前言 Vue.js是一个流行的JavaScript前端框架&#xff0c;用于构建单页面应用&#xff08;SPA&#xff09;和用户界面。当我们使用new Vue()来创建一个Vue实例时&#xff0c;Vue会执行一系列的初始化过程&#xff0c;将数据变成响应式&#xff0c;编译模板&#xff0c;挂载实例…

metersphere 设置定时任务和查看报告

设置定时任务 设置时间 查看执行后的测试报告 查看报告详情

设计测试用例的具体方法总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️白马沉河共歃誓&#xff0c;怒涛没城亦不悔 ☁️基于需求进行测试用例的设计 基…