Java遠(yuǎn)程調(diào)用Shell腳本并獲取輸出信息【推薦】
1、添加依賴
<dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>262</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
2、Api說明
首先構(gòu)造一個(gè)連接器,傳入一個(gè)需要登陸的ip地址;
Connection conn = new Connection(ipAddr);
模擬登陸目的服務(wù)器,傳入用戶名和密碼;
boolean isAuthenticated = conn.authenticateWithPassword(userName, passWord);
它會(huì)返回一個(gè)布爾值,true 代表成功登陸目的服務(wù)器,否則登陸失敗。
打開一個(gè)session,執(zhí)行你需要的linux 腳本命令;
Session session = conn.openSession(); session.execCommand(“ifconfig”);
接收目標(biāo)服務(wù)器上的控制臺(tái)返回結(jié)果,讀取br中的內(nèi)容;
InputStream stdout = new StreamGobbler(session.getStdout()); BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
得到腳本運(yùn)行成功與否的標(biāo)志 :0-成功 非0-失敗
System.out.println(“ExitCode: ” + session.getExitStatus());
關(guān)閉session和connection
session.close(); conn.close();
Tips:
通過第二部認(rèn)證成功后當(dāng)前目錄就位于/home/username/目錄之下,你可以指定腳本文件所在的絕對路徑,或者通過cd導(dǎo)航到腳本文件所在的目錄,然后傳遞執(zhí)行腳本所需要的參數(shù),完成腳本調(diào)用執(zhí)行。
執(zhí)行腳本以后,可以獲取腳本執(zhí)行的結(jié)果文本,需要對這些文本進(jìn)行正確編碼后返回給客戶端,避免亂碼產(chǎn)生。
如果你需要執(zhí)行多個(gè)linux控制臺(tái)腳本,比如第一個(gè)腳本的返回結(jié)果是第二個(gè)腳本的入?yún)?,你必須打開多個(gè)Session,也就是多次調(diào)用 Session sess = conn.openSession();,使用完畢記得關(guān)閉就可以了。
3. 實(shí)例:工具類
public class SSHTool {
private Connection conn;
private String ipAddr;
private Charset charset = StandardCharsets.UTF_8;
private String userName;
private String password;
public SSHTool(String ipAddr, String userName, String password, Charset charset) {
this.ipAddr = ipAddr;
this.userName = userName;
this.password = password;
if (charset != null) {
this.charset = charset;
}
}
/**
* 登錄遠(yuǎn)程Linux主機(jī)
*
* @return 是否登錄成功
*/
private boolean login() {
conn = new Connection(ipAddr);
try {
// 連接
conn.connect();
// 認(rèn)證
return conn.authenticateWithPassword(userName, password);
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
/**
* 執(zhí)行Shell腳本或命令
*
* @param cmds 命令行序列
* @return 腳本輸出結(jié)果
*/
public StringBuilder exec(String cmds) throws IOException {
InputStream in = null;
StringBuilder result = new StringBuilder();
try {
if (this.login()) {
// 打開一個(gè)會(huì)話
Session session = conn.openSession();
session.execCommand(cmds);
in = session.getStdout();
result = this.processStdout(in, this.charset);
conn.close();
}
} finally {
if (null != in) {
in.close();
}
}
return result;
}
/**
* 解析流獲取字符串信息
*
* @param in 輸入流對象
* @param charset 字符集
* @return 腳本輸出結(jié)果
*/
public StringBuilder processStdout(InputStream in, Charset charset) throws FileNotFoundException {
byte[] buf = new byte[1024];
StringBuilder sb = new StringBuilder();
// OutputStream os = new FileOutputStream("./data.txt");
try {
int length;
while ((length = in.read(buf)) != -1) {
// os.write(buf, 0, c);
sb.append(new String(buf, 0, length));
}
} catch (IOException e) {
e.printStackTrace();
}
return sb;
}
public static void main(String[] args) throws IOException {
SSHTool tool = new SSHTool("192.168.100.40", "root", "123456", StandardCharsets.UTF_8);
StringBuilder exec = tool.exec("bash /root/test12345.sh");
System.out.println(exec);
}
}
總結(jié)
以上所述是小編給大家介紹的Java遠(yuǎn)程調(diào)用Shell腳本并獲取輸出信息,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
關(guān)于Mybatis 中使用Mysql存儲(chǔ)過程的方法
這篇文章給大家介紹了Mybatis 中使用Mysql存儲(chǔ)過程的方法,本文通過實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-03-03
java實(shí)現(xiàn)將文件上傳到ftp服務(wù)器的方法
這篇文章主要介紹了java實(shí)現(xiàn)將文件上傳到ftp服務(wù)器的方法,結(jié)合實(shí)例形式分析了基于java實(shí)現(xiàn)的ftp文件傳輸類定義與使用方法,需要的朋友可以參考下2016-08-08
如何使用@ConditionalOnExpression決定是否生效注釋
這篇文章主要介紹了如何使用@ConditionalOnExpression決定是否生效注釋的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Debian配置JDK1.7 與Linux Java Helloworld
這篇文章主要介紹了Debian配置JDK1.7 與Linux Java Helloworld 的相關(guān)資料,需要的朋友可以參考下2016-06-06
Java兩種動(dòng)態(tài)代理JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理詳解
這篇文章主要介紹了Java兩種動(dòng)態(tài)代理JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理詳解,代理模式是23種設(shè)計(jì)模式的一種,他是指一個(gè)對象A通過持有另一個(gè)對象B,可以具有B同樣的行為的模式,為了對外開放協(xié)議,B往往實(shí)現(xiàn)了一個(gè)接口,A也會(huì)去實(shí)現(xiàn)接口,需要的朋友可以參考下2023-11-11

