日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 循环执行ip停止服务,java调用远程服务器的shell脚本以及停止的方法实现

發布時間:2023/12/9 linux 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 循环执行ip停止服务,java调用远程服务器的shell脚本以及停止的方法实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近接了個需求,要求遠程調shell腳本,你沒聽錯!!!需求就一句話,咱是誰,咱是優秀的開發選手。考慮再三,有兩種實現方式:

方案一:腳本所在服務器安裝一個客戶端,也就是自己寫的一個小程序,本地通過端口調目標服務器的程序,然后程序調本機上的shell腳本!

優點:通過端口調用,用戶不用暴露服務器的賬號密碼,安全性高

缺點:我們需要一直維護這個客戶端程序,而且每接入一臺服務器,都得安裝該客戶端,另外非常考驗客戶端程序的健壯性。

方案二:本地直接通過IP,服務器賬號密碼調遠程服務器的shell腳本

優點:代碼易開發,擴展時只用擴展服務端代碼即可

缺點:用戶服務器的賬號密碼會暴露給服務端,密碼安全問題

把每種方案的優缺點匯報給leader,leader說:按第二種來吧

來吧!!開干,廢話不多說,直接上代碼:

導入程序所需的軟件包:

org.jvnet.hudson

ganymed-ssh2

build210-hudson-1

程序涉及的demo:

import java.io.IOException;

import java.io.InputStream;

import java.io.UnsupportedEncodingException;

import java.nio.charset.Charset;

import org.apache.commons.io.IOUtils;

import ch.ethz.ssh2.ChannelCondition;

import ch.ethz.ssh2.Connection;

import ch.ethz.ssh2.Session;

import ch.ethz.ssh2.StreamGobbler;

public class RemoteShellExecutor {

private Connection conn;

/** 遠程機器IP */

private String ip;

/** 用戶名 */

private String osUsername;

/** 密碼 */

private String password;

private String charset = Charset.defaultCharset().toString();

private final String GET_SHELL_PID = "ps -ef | grep '%s' | grep -v grep |awk '{print $2}'";

private final String KILL_SHELL_PID = "kill -15 %s";

private static final int TIME_OUT = 1000 * 5 * 60;

/**

* 構造函數

* @param ip

* @param usr

* @param pasword

*/

public RemoteShellExecutor(String ip, String usr, String pasword) {

this.ip = ip;

this.osUsername = usr;

this.password = pasword;

}

/**

* 登錄

* @return

* @throws IOException

*/

private boolean login() throws IOException {

conn = new Connection(ip);

conn.connect();

return conn.authenticateWithPassword(osUsername, password);

}

/**

* 執行腳本

*

* @param cmds

* @return

* @throws Exception

*/

public ExecuteResultVO exec(String cmds) throws Exception {

InputStream stdOut = null;

InputStream stdErr = null;

ExecuteResultVO executeResultVO = new ExecuteResultVO();

String outStr = "";

String outErr = "";

int ret = -1;

try {

if (login()) {

// Open a new {@link Session} on this connection

Session session = conn.openSession();

// Execute a command on the remote machine.

session.execCommand(cmds);

stdOut = new StreamGobbler(session.getStdout());

outStr = processStream(stdOut, charset);

stdErr = new StreamGobbler(session.getStderr());

outErr = processStream(stdErr, charset);

session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);

System.out.println("outStr=" + outStr);

System.out.println("outErr=" + outErr);

ret = session.getExitStatus();

executeResultVO.setOutStr(outStr);

executeResultVO.setOutErr(outErr);

} else {

throw new Exception("登錄遠程機器失敗" + ip); // 自定義異常類 實現略

}

} finally {

if (conn != null) {

conn.close();

}

IOUtils.closeQuietly(stdOut);

IOUtils.closeQuietly(stdErr);

}

return ret;

}

/**

* @param in

* @param charset

* @return

* @throws IOException

* @throws UnsupportedEncodingException

*/

private String processStream(InputStream in, String charset) throws Exception {

byte[] buf = new byte[1024];

StringBuilder sb = new StringBuilder();

int len = 0;

while ((len=in.read(buf)) != -1) {

sb.append(new String(buf,0,len, charset));

}

return sb.toString();

}

public static void main(String args[]) throws Exception {

//調遠程shell

RemoteShellExecutor executor = new RemoteShellExecutor("192.168.234.123", "root", "beebank");

System.out.println(executor.exec("sh /data/checkMysql.sh"));

//獲取遠程shell 進程 pid

ExecuteResultVO executeResultVO = executor.exec(String.format(GET_SHELL_PID,"sh /data/checkMysql.sh"));

//殺掉shell進程

ExecuteResultVO executeResultVO1 = executor.exec(String.format(KILL_SHELL_PID ,executeResultVO.getOutStr()));

}

public class ExecuteResultVO{

private String outStr;

private String outErr;

//省略get set

}

}

經過測試也確實好用啊,大家可以根據這個demo進行相應的修改。到此這篇關于java調遠程服務器的shell腳本以及停止的方法實現的文章就介紹到這了,更多相關java調遠程shell腳本內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

總結

以上是生活随笔為你收集整理的linux 循环执行ip停止服务,java调用远程服务器的shell脚本以及停止的方法实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。