项目完成admin的时候需要实现
1.重启数据库
2.重启项目
3.项目定时任务等等多种linux任务,所以使用了如下方法,以通过admin直接完成操作
首先我们需要使用如下依赖
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>build210</version>
</dependency>
完成导入后我们就可以直接使用代码完成向linux发送指令的操作,配置类就不写了。自行发挥
示例demo:
public class RemoteExecuteCommand {
// 字符编码默认是utf-8
private static String DEFAULTCHART = "UTF-8";
@Autowired
private LinuxInformationConfig linuxInformationConfig; // 注入的ssh配置类
private Connection conn;
private String ip;
private String userName;
private String userPwd;
public void run(String cmd){ //运行时直接调用的主方法,传入指令
this.ip=linuxInformationConfig.ip;
this.userName=linuxInformationConfig.userName;
this.userPwd=linuxInformationConfig.passWord;
String execute = this.execute(cmd); //可以将指令封装为一个枚举类以调用
System.out.println(execute); //如果本机重启大可不必拿返回值,反正你都自爆了
}
public RemoteExecuteCommand() {
}
public Boolean login() { //执行登录的方法,返回boolean
boolean flg = false;
try {
conn = new Connection(ip);
conn.connect();
flg = conn.authenticateWithPassword(userName, userPwd);
} catch (IOException e) {
e.printStackTrace();
}
return flg;
}
public String execute(String cmd) { // 执行命令的方法
String result = "ok";
try {
if (login()) { //如果登录成功
System.out.println("登录成功:");
Session session = conn.openSession();
session.requestPTY("bash");
session.startShell();
PrintWriter out = new PrintWriter(session.getStdin());
out.println(cmd);
out.flush();
out.println("exit");
out.close();
session.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF | ChannelCondition.EXIT_STATUS,
60000);
System.out.println("exec has finished!");
session.close();
conn.close();
}
} catch (
IOException e) {
e.printStackTrace();
}
return result;
}
}
可以直接逐条执行命令,也可以事先在linux准备好shell脚本直接调用
前端部分代码
封装的请求
/**
* 重启admin
* @param data
* @returns {AxiosPromise}
*/
export function RestartAdmin(data) {
return request({
url: '/setting/linux/restartAdmin',
method: 'put',
data
})
}
使用一个弹窗确认组件
<!--弹窗组件-->
<el-popconfirm
cancel-button-text="cancel"
confirm-button-text="confirm"
title="Do you really want to restart Admin"
@onConfirm="confirmRestartAdmin"
@onCancel="cancelRestartAdmin">
<!--按钮-->
<el-button slot="reference" type="primary" class="filter-item" style="margin-left: 10px;" :icon="restarIconType===1?'el-icon-finished':'el-icon-loading'">Restar Admin</el-button>
</el-popconfirm>
<!--注意这里必须使用@onConfirm,和@coCancel进行父组件方法的关联,因为组件源码中是使用这两个字段进行调用父组件方法的-->
子组件调用部分源码
methods: {
confirm() {
this.visible = false;
this.$emit('onConfirm');
},
cancel() {
this.visible = false;
this.$emit('onCancel');
}
}
;
取消重启以及提交重启请求的方法,方法中调用js封装的请求
//取消重启
cancelRestartAdmin() {
const res = { flag: true, msg: 'cancel' }
this.alertMsg(res)
},
// 重启admin
confirmRestartAdmin() {
this.restarIconType = 0
RestartAdmin(res => {
this.alertMsg(res)
})
}
补充
这是本地执行
的方法,不需要任何第三方依赖,cmd
为需要执行的指令
/**
* 本地命令执行
*/
public void localinuxCmd(String cmd){
/**
* Shell执行超时时间
*/
final int SHELL_TIME_OUT = 10;
Scanner input = null;
String result = "";
Process process = null;
try {
process = Runtime.getRuntime().exec(cmd);
// 等待命令执行完成
process.waitFor(SHELL_TIME_OUT, TimeUnit.SECONDS);
InputStream is = process.getInputStream();
input = new Scanner(is);
while (input.hasNextLine()) {
result += input.nextLine() + "\n";
}
log.info(" Shell Execute Result {}", result);
} catch (InterruptedException | IOException e) {
e.printStackTrace();
log.error(" Shell Execute Meets An Error {}", e.getMessage());
} finally {
if (null != input) {
input.close();
}
if (null != process) {
process.destroy();
}
}
}
补充
进阶方法