{eval=Array;=+count(Array);}
這個非常簡單,基本原理先通過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命令或腳本就行,如下:
點擊運行程序,截圖如下,已經成功執行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+" ");
}
} 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"));
}
}
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答3
回答0
回答