ビジネスの背景:会社は、JavaコードでLinuxコマンドを実装し、ページのボタンをクリックして、クラスターを操作するためのいくつかのパラメーターを選択し、ログを記録したいと考えています。
この機能を実現したい場合は、注意すべき点がいくつかあります。
1. Javaコードはどのようにリモートサーバーに接続しますか?
プロジェクトをサーバー上で直接パッケージ化して公開することは誰もが考えているかもしれませんが、これは非常に面倒です。テストするコマンドを変更するたびに、プロジェクトを1回パッケージ化する必要があり、非常に時間がかかります。
私の考えでは、テスト段階では、コンピューター上のLinuxにローカルで接続してテストを行うことができます。これにより、テスト時間が大幅に節約され、ローカルテストは問題なく、サーバーにリリースしてテストできます。
次のステップは、Linuxへの接続方法
です。1。sshに必要なjarパッケージをダウンロードします。すでにダウンロードしています。リンクをクリックして
、jarパッケージをダウンロードするためのリンクをダウンロードしてください。
公式ウェブサイトのダウンロードリンク:
リンク:http://www.ganymed.ethz.ch/ssh2/。
2.ダウンロードしたjarパッケージをローカルウェアハウスに配置します。3。jar
パッケージをmavenウェアハウス
にインストールします。インストールコマンドは次のとおりです。-Dfileこのパラメーターは、mavenリポジトリ内のjarパッケージの場所です。
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キーを押しながらマウスの左ボタンをクリックしてクリックします
二、
基本的なコードは次のとおりです。SpringBootプロジェクトを使用しました。作成した単体テストは問題ありません。コメントも詳細に記述されており、直接使用できます。
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();
}
}
シェルスクリプトの場所シェルスクリプトの内容は次のとおりです。
シェルスクリプトの出力は次のとおりです。
私のJavaコードの出力は次のとおりです。
エレガントなディスプレイは成功しました、ハハ!!!!!!!!!!!!!!
発生した問題:
小さな問題があります。Linuxでは出力ログが表示されません
。最初に実行に失敗したときに調査する必要がありますが、理由がわかりません。シェルスクリプトの権限を777に変更した後成功
chmod 777 test.sh