回覆列表
-
1 # Java大資料佈道者
-
2 # 小小猿愛嘻嘻
這個非常簡單,基本原理先透過ssh連線遠端Linux主機,然後執行shell命令,獲取返回結果,下面我簡單介紹一下實現過程,主要內容如下:
1.首先,需要在maven中匯入程式所依賴的Jar包,這個直接在pom.xml檔案中輸入就行,如下:
2.接著就可以用Java程式設計來實現遠端連線Linux主機並執行shell命令或指令碼了,主要步驟及截圖如下:
首先,匯入程式所依賴的包,初始化成員變數,這裡定義了一個ExecuteShell類,建立物件時,需要輸入IP地址、使用者名稱和密碼這3個引數,用於後面ssh連線遠端Linux主機,程式碼如下,非常簡單:
接著就是遠端連線Linux主機了,測試程式碼如下,很好理解,建立一個Connection連線,如果連線成功,則返回true,失敗則返回false:
連線成功後,我們就可以直接執行Linux shell指令碼或命令了,測試程式碼如下,非常簡單,開啟一個Session會話,然後執行shell命令或指令碼,返回執行結果:
processStdout函式程式碼如下,主要是取得shell命令和指令碼返回的結果,程式碼如下:
最後,在main函式中建立ExecuteShell類物件,呼叫execute函式執行shell命令或指令碼就行,如下:
至此,我們就完成了利用Java來遠端呼叫Linux命令或shell指令碼。總的來說,整個過程非常簡單,程式碼量也不多,很好理解,只要你有一定的Java基礎,熟悉一下上面的程式碼和示例,多除錯幾遍程式,很快就能掌握的,網上也有相關教程和資料,非常豐富詳細,感興趣的話,可以搜一下,希望以上分享的內容能對你有所幫助吧,也歡迎大家評論、留言進行補充。
1.匯入maven依賴jar包
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>build210</version>
</dependency>
2.編輯相應Java程式碼
package com.ksy.fw.base.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.commons.lang.StringUtils;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
/**
* 遠端執行linux的shell script
*/
public class RemoteExecuteCommand {
//字元編碼預設是utf-8
private static String DEFAULTCHART="UTF-8";
private Connection conn;
private String ip;
private String userName;
private String userPwd;
public RemoteExecuteCommand(String ip, String userName, String userPwd) {
this.ip = ip;
this.userName = userName;
this.userPwd = userPwd;
}
public RemoteExecuteCommand() {
}
/**
* 遠端登入linux的主機
* @return
* 登入成功返回true,否則返回false
*/
public Boolean login(){
boolean flg=false;
try {
conn = new Connection(ip);
conn.connect();//連線
flg=conn.authenticateWithPassword(userName, userPwd);//認證
} catch (IOException e) {
e.printStackTrace();
}
return flg;
}
/**
* 遠端執行shll指令碼或者命令
* @param cmd 即將執行的命令
* @return 命令執行完後返回的結果值
*/
public String execute(String cmd){
String result="";
try {
if(login()){
Session session= conn.openSession();//開啟一個會話
session.execCommand(cmd);//執行命令
result=processStdout(session.getStdout(),DEFAULTCHART);
//如果為得到標準輸出為空,說明指令碼執行出錯了
if(StringUtils.isBlank(result)){
result=processStdout(session.getStderr(),DEFAULTCHART);
}
conn.close();
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 遠端執行shll指令碼或者命令
* @param cmd 即將執行的命令
* @return 命令執行成功後返回的結果值,如果命令執行失敗,返回空字串,不是null
*/
public String executeSuccess(String cmd){
String result="";
try {
if(login()){
Session session= conn.openSession();//開啟一個會話
session.execCommand(cmd);//執行命令
result=processStdout(session.getStdout(),DEFAULTCHART);
conn.close();
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 解析指令碼執行返回的結果集
* @param in 輸入流物件
* @param charset 編碼
* @return 以純文字的格式返回
*/
private 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();
}
public static void setCharset(String charset) {
DEFAULTCHART = charset;
}
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public static void main(String[] args) {
RemoteExecuteCommand rec=new RemoteExecuteCommand("127.0.0.1", "root","root");
//執行命令
System.out.println(rec.execute("chmod 777 /usr/ksybak/myshell/tomcat-fw.sh"));
System.out.println(rec.execute("/usr/ksybak/myshell/tomcat-fw.sh"));
//System.out.println(rec.execute("/usr/ksybak/myshell/tomcat-fw.sh"));
//執行指令碼
//rec.execute("sh /usr/local/tomcat/bin/statup.sh");
//這個方法與上面最大的區別就是,上面的方法,不管執行成功與否都返回,
//這個方法呢,如果命令或者指令碼執行錯誤將返回空字串
//System.out.println(rec.executeSuccess("ifconfig"));
}
}