【春ブート構成テンプレート] Javaリモートシェルコマンド実行(マルチマスタをサポートするために、リモートコマンドによって開始されました)
序文
初期の2020年までに新たに肺炎ウイルスの影響は、自宅で数日間家は、ディスパッチシステムに思って、退屈、ビッグデータの管理とメンテナンスジョブのスケジューリングを使用します。
彼は、ほとんどがストップ整流BUGを書いたメインフレーム環境を切り替えた後見つけ、(企業の環境で適切に提出する能力である前に)デバッグジョブに適用に記載の欲求不満にされないか、リモートシェルの実行エンジンの故障の前に書かれていただけの下でプログラムを再実装してみると、今いくつかの共有を行うためにここに、本当に以前の実装に比べて、マルチホストに送信され、リモートシェルコマンドを有効にする、簡単なの多くを集中型の構成テンプレートのための完全なソリューションをされて加算されます。
POMはサポートに依存します
、SpringBootのためのプログラミングフレームワーク選ばれたブロガーたちは二つのマシン、Xianxiangのpom.xmlの追加の依存関係にリモートコマンドシェルを送信する必要があることを想定しています。
<!-- @ConfigurationProperties注解支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- shell认证支持 -->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
配置YML
application.ymlに情報を追加します。
jackroy1:
host: 172.26.20.80
port: 22
user: root
password: jack_roy1
jackroy2:
host: 172.26.20.81
port: 22
user: root
password: jack_roy2
# 根据需要还可设置多台主机信息
内蔵クラス
最初のLinuxのエンティティクラスのCentOSOneEntityを作成します。
package com.jackroy.www.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
@Component
@ConfigurationProperties(prefix="jackroy1")
public class CentOSOneEntity {
/* 主机(IP) */
private String host;
/* 连接端口 */
private int port;
/* 编码 */
private Charset charset = StandardCharsets.UTF_8;
/* 用户 */
private String user;
/* 密码 */
private String password;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public Charset getCharset() {
return charset;
}
public void setCharset(Charset charset) {
this.charset = charset;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Linuxは、第二のエンティティクラスCentOSTwoEntityを作成します。
package com.jackroy.www.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
@Component
@ConfigurationProperties(prefix="jackroy2")
public class CentOSTwoEntity {
/* 主机(IP) */
private String host;
/* 连接端口 */
private int port;
/* 编码 */
private Charset charset = StandardCharsets.UTF_8;
/* 用户 */
private String user;
/* 密码 */
private String password;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public Charset getCharset() {
return charset;
}
public void setCharset(Charset charset) {
this.charset = charset;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
また、必要に応じて複数のホストエンティティクラスを作成し、ログインを作成、実行クラスSSHRegisterことができます。
package com.jackroy.www.entity;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
public class SSHRegisterEntity {
/* 连接器 */
private Connection connect;
/* 主机(IP) */
private String host;
/* 连接端口 */
private int port;
/* 编码 */
private Charset charset;
/* 用户 */
private String user;
/* 密码 */
private String password;
public SSHRegisterEntity(CentOSEntity centOSEntity) {
this.host = centOSEntity.getHost();
this.port=centOSEntity.getPort();
this.user = centOSEntity.getUser();
this.charset = centOSEntity.getCharset();
this.password = centOSEntity.getPassword();
}
/**
* 登录Centos主机
*/
private boolean login() {
connect = new Connection(host,port);
try {
connect.connect();
return connect.authenticateWithPassword(user, password);
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
/**
* 获取返回信息
*/
public StringBuilder processStdout(InputStream in) {
byte[] buf = new byte[1024];
StringBuilder builder = new StringBuilder();
try {
int length;
while ((length = in.read(buf)) != -1) {
builder.append(new String(buf, 0, length));
}
} catch (IOException e) {
e.printStackTrace();
}
return builder;
}
/**
* exec shell命令
*/
public StringBuilder exec(String shell) throws IOException {
InputStream inputStream = null;
StringBuilder result = new StringBuilder();
try {
// 认证登录信息
if (this.login()) {
// 登陆成功则打开一个会话
Session session = connect.openSession();
session.execCommand(shell);
inputStream = session.getStdout();
result = this.processStdout(inputStream);
connect.close();
}
} finally {
if (null != inputStream) {
inputStream.close();
}
}
return result;
}
}
コール
次のように呼び出します。
@Autowired
CentOSOneEntity centOSOneEntity;
@Autowired
CentOSTwoEntity centOSTwoEntity;
public int submit() throws IOException {
// 主机1
SSHRegisterEntity sshRegisterEntity1 = new SSHRegisterEntity(centOSOneEntity);
// 主机2
SSHRegisterEntity sshRegisterEntity2 = new SSHRegisterEntity(centOSTwoEntity);
// 向主机1发送命令
StringBuilder stringBuilder1 = sshRegisterEntity1.exec("ll /root/");
// 向主机2发送命令
StringBuilder stringBuilder2 = sshRegisterEntity2.exec("ll /root/");
// 返回信息1
System.out.println(stringBuilder1.toString());
// 返回信息2
System.out.println(stringBuilder2.toString());
return null;
}
追伸
必要に応じて、複数のマシンを構成するために柔軟性を使用し、操作中に、以下のコメントを交換することができます問題はありません。