业务背景:公司想要实现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