{eval=Array;=+count(Array);}
這個(gè)非常簡單,基本原理先通過ssh連接遠(yuǎn)程Linux主機(jī),然后執(zhí)行shell命令,獲取返回結(jié)果,下面我簡單介紹一下實(shí)現(xiàn)過程,主要內(nèi)容如下:
1.首先,需要在maven中導(dǎo)入程序所依賴的Jar包,這個(gè)直接在pom.xml文件中輸入就行,如下:
2.接著就可以用Java編程來實(shí)現(xiàn)遠(yuǎn)程連接Linux主機(jī)并執(zhí)行shell命令或腳本了,主要步驟及截圖如下:
首先,導(dǎo)入程序所依賴的包,初始化成員變量,這里定義了一個(gè)ExecuteShell類,創(chuàng)建對象時(shí),需要輸入IP地址、用戶名和密碼這3個(gè)參數(shù),用于后面ssh連接遠(yuǎn)程Linux主機(jī),代碼如下,非常簡單:
接著就是遠(yuǎn)程連接Linux主機(jī)了,測試代碼如下,很好理解,創(chuàng)建一個(gè)Connection連接,如果連接成功,則返回true,失敗則返回false:
連接成功后,我們就可以直接執(zhí)行Linux shell腳本或命令了,測試代碼如下,非常簡單,打開一個(gè)Session會話,然后執(zhí)行shell命令或腳本,返回執(zhí)行結(jié)果:
processStdout函數(shù)代碼如下,主要是取得shell命令和腳本返回的結(jié)果,代碼如下:
最后,在main函數(shù)中創(chuàng)建ExecuteShell類對象,調(diào)用execute函數(shù)執(zhí)行shell命令或腳本就行,如下:
點(diǎn)擊運(yùn)行程序,截圖如下,已經(jīng)成功執(zhí)行shell,并取得返回的結(jié)果:
至此,我們就完成了利用Java來遠(yuǎn)程調(diào)用Linux命令或shell腳本??偟膩碚f,整個(gè)過程非常簡單,代碼量也不多,很好理解,只要你有一定的Java基礎(chǔ),熟悉一下上面的代碼和示例,多調(diào)試幾遍程序,很快就能掌握的,網(wǎng)上也有相關(guān)教程和資料,非常豐富詳細(xì),感興趣的話,可以搜一下,希望以上分享的內(nèi)容能對你有所幫助吧,也歡迎大家評論、留言進(jìn)行補(bǔ)充。
1.導(dǎo)入maven依賴jar包
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>build210</version>
</dependency>
2.編輯相應(yīng)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;
/**
* 遠(yuǎn)程執(zhí)行l(wèi)inux的shell script
*/
public class RemoteExecuteCommand {
//字符編碼默認(rèn)是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() {
}
/**
* 遠(yuǎn)程登錄linux的主機(jī)
* @return
* 登錄成功返回true,否則返回false
*/
public Boolean login(){
boolean flg=false;
try {
conn = new Connection(ip);
conn.connect();//連接
flg=conn.authenticateWithPassword(userName, userPwd);//認(rèn)證
} catch (IOException e) {
e.printStackTrace();
}
return flg;
}
/**
* 遠(yuǎn)程執(zhí)行shll腳本或者命令
* @param cmd 即將執(zhí)行的命令
* @return 命令執(zhí)行完后返回的結(jié)果值
*/
public String execute(String cmd){
String result="";
try {
if(login()){
Session session= conn.openSession();//打開一個(gè)會話
session.execCommand(cmd);//執(zhí)行命令
result=processStdout(session.getStdout(),DEFAULTCHART);
//如果為得到標(biāo)準(zhǔn)輸出為空,說明腳本執(zhí)行出錯(cuò)了
if(StringUtils.isBlank(result)){
result=processStdout(session.getStderr(),DEFAULTCHART);
}
conn.close();
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 遠(yuǎn)程執(zhí)行shll腳本或者命令
* @param cmd 即將執(zhí)行的命令
* @return 命令執(zhí)行成功后返回的結(jié)果值,如果命令執(zhí)行失敗,返回空字符串,不是null
*/
public String executeSuccess(String cmd){
String result="";
try {
if(login()){
Session session= conn.openSession();//打開一個(gè)會話
session.execCommand(cmd);//執(zhí)行命令
result=processStdout(session.getStdout(),DEFAULTCHART);
conn.close();
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 解析腳本執(zhí)行返回的結(jié)果集
* @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");
//執(zhí)行命令
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"));
//執(zhí)行腳本
//rec.execute("sh /usr/local/tomcat/bin/statup.sh");
//這個(gè)方法與上面最大的區(qū)別就是,上面的方法,不管執(zhí)行成功與否都返回,
//這個(gè)方法呢,如果命令或者腳本執(zhí)行錯(cuò)誤將返回空字符串
//System.out.println(rec.executeSuccess("ifconfig"));
}
}
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答3
回答0
回答