Java代码通过SSH协议远程Linux

业务背景:公司想要实现Java代码中操作Linux命令,在页面上点击按钮,选择几个参数就可以操作集群,并且记录日志

想要实现这个功能有几个点需要关注

一.Java代码怎么连接远程的服务器?
大家可能都有一个想法,把项目直接打包发布到该服务器上,但是这样会非常麻烦,每次你修改命令测试,就得打包一次项目,非常消耗时间

我的想法是,测试阶段可以本地SSH连接自己电脑上的Linux做测试,这样大大节约了测试时间,本地测试的没问题了,再发布到服务器上进行测试

接下来就是怎么连接Linux了
1.下载ssh需要的jar包,我已经下载好了,点击我的链接下载就好
下载jar包的链接:

官网的下载链接:
链接: http://www.ganymed.ethz.ch/ssh2/.

2.把下载好的jar包放到本地仓库中
在这里插入图片描述3.把这个jar包安装到maven仓库中
下面的是安装命令:-Dfile 这个参数是你jar包在maven库中的位置

mvn install:install-file -Dfile=D:\repository_ssh\cz\ethz\ganymed\ganymed-ssh2-build210\ganymed-ssh2-build210.jar -DgroupId=ch.ethz.ganymed -DartifactId=ganymed-ssh2 -Dversion=build210 -Dpackaging=jar

4.把这个jar包的坐标引入到pom文件中

        <dependency>
            <groupId>ch.ethz.ganymed</groupId>
            <artifactId>ganymed-ssh2</artifactId>
            <version>build210</version>
        </dependency>

测试:按住ctrl+鼠标左键点击进去即可

二、

下面的是基本的代码,我用的是spring boot的项目,写的单元测试做的测试,已经没问题了,注释也详细的写好了,可以直接用

package com.atguigu.springboot;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.io.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.atguigu.springboot.util.RemoteSSH;
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestBaidutwo {
    
    
	/**
	 * 定义几个常量
	 */
	private static final Logger logger = LoggerFactory.getLogger(RemoteSSH.class);
    private static String DEFAULTCHARTSET = "UTF-8";
    private static Connection conn;
	@Test
	public void test_connect_linux() {
    
    
		System.out.println("测试单元测试是否有问题----------");
		try {
    
    
			//这个IP地址是你远程的Linux中的IP地址
			 conn = new Connection("192.168.234.129");
	         conn.connect();//连接
	         //连接远程库的用户名和密码
	         boolean  flag = conn.authenticateWithPassword("root", "root");
	          if (flag) {
    
    
				System.out.println("连接成功-----------");
				//Linux中shell脚本的位置
				String cmd = "/root/ceshi/test.sh";
				execute(cmd);
			}else {
    
    
				System.out.println("连接失败=============");
			}
		} catch (Exception e) {
    
    
			// TODO: handle exception
		}
		
	}
	
	
	public static String execute(String cmd) {
    
    
        String result = "";
        try {
    
    
            Session session = conn.openSession();// 打开一个会话
            session.execCommand(cmd);// 执行命令;
            result = processStdout(session.getStdout(), DEFAULTCHARTSET);
            // 如果为得到标准输出为空,说明脚本执行出错了 StringUtils.isBlank(result)
            if (result.equals("")) {
    
    
            	System.out.println("脚本执行------------------------失败----------");
                result = processStdout(session.getStderr(), DEFAULTCHARTSET);
            }else {
    
    
				System.out.println("脚本执行--------------------------成功--------");
				//输出这个result就可以看到shell脚本的输出结果
				System.out.println(result);
			}
//            conn.close();
//            session.close();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        return result;
 
    }
	public static String processStdout(InputStream in, String charset) {
    
    
        InputStream stdout = new StreamGobbler(in);
        StringBuffer buffer = new StringBuffer();
        try {
    
    
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
            String line = null;
            while ((line = br.readLine()) != null) {
    
    
                buffer.append(line + "\n");
            }
        } catch (UnsupportedEncodingException e) {
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        return buffer.toString();
    }
}

我的shell脚本的位置
在这里插入图片描述我的shell脚本的内容如下;
在这里插入图片描述shell脚本的输出如下;

在这里插入图片描述我的Java代码的输出如下;

在这里插入图片描述优雅的展示成功了,哈哈!!!!!!!!!!!!!!

其中遇到的问题:
有一个小问题,输出的log日志在Linux中看不到,还得研究一下
第一次我执行失败了,但是看不出来原因来,把shell脚本的权限改成777后成功了

chmod 777 test.sh

写的还有很多不足之处,看到的朋友有疑问或者好的建议,欢迎评论到下方

猜你喜欢

转载自blog.csdn.net/qq_38220334/article/details/115002072