本篇文章給大家詳細介紹一下用JSch遠端執行Shell指令的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
JSch 是Java Secure Channel的縮寫。 JSch是一個SSH2的純Java實作。它允許你連接到一個SSH伺服器,並且可以使用連接埠轉發,X11轉發,文件傳輸等,當然你也可以整合它的功能到你自己的應用程式。框架jsch很老的框架,更新到2016年,現在也不更新了。
JSch 使用 shell 執行指令,有兩種方法
ChannelExec: 一次執行一條指令,一般我們用這個就夠了。
ChannelShell: 可執行多條指令,平常開發用的不多,依需求來吧;
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");//只能执行一条指令(也可执行符合指令) ChannelShell channelShell = (ChannelShell) session.openChannel("shell");//可执行多条指令 不过需要输入输出流
1. ChannelExec
每個指令之間用; 隔開。說明:各指令的執行給果,不會影響其它指令的執行。換句話說,各個指令都會執行,但不保證每個指令都執行成功。
每個指令之間用 && 隔開。說明:若前面的指令執行成功,才會去執行後面的指令。這樣可以確保所有的命令執行完畢後,執行過程都是成功的。
每個指令之間用 || 隔開。說明:|| 是或的意思,只有前面的指令執行失敗後才去執行下一條指令,直到執行成功一條指令為止。
2. ChannelShell
對於ChannelShell,以輸入流的形式,可執行多條指令,這就像在本地電腦上使用互動式shell(它通常用於:互動式使用)。如要要停止,有兩種方式:
傳送一個exit指令,告訴程式本次互動結束;
使用位元組流中的available方法,來取得資料的總大小,然後循環去讀。
使用範例
1. 引入pom 依賴
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.53</version> </dependency>
2. jsch 使用範例
在此封裝了一個Shell 工具類,用來執行shell 指令,具體使用細節在程式碼註解中有說明,可以直接拷貝並使用,程式碼如下:
package org.example.shell;/** * Created by qianghaohao on 2021/3/28 */import com.jcraft.jsch.ChannelExec;import com.jcraft.jsch.JSch;import com.jcraft.jsch.Session;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * @description: * @author: qianghaohao * @time: 2021/3/28 */public class Shell { private String host; private String username; private String password; private int port = 22; private int timeout = 60 * 60 * 1000; public Shell(String host, String username, String password, int port, int timeout) { this.host = host; this.username = username; this.password = password; this.port = port; this.timeout = timeout; } public Shell(String host, String username, String password) { this.host = host; this.username = username; this.password = password; } public String execCommand(String cmd) { JSch jSch = new JSch(); Session session = null; ChannelExec channelExec = null; BufferedReader inputStreamReader = null; BufferedReader errInputStreamReader = null; StringBuilder runLog = new StringBuilder(""); StringBuilder errLog = new StringBuilder(""); try { // 1. 获取 ssh session session = jSch.getSession(username, host, port); session.setPassword(password); session.setTimeout(timeout); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); // 获取到 ssh session // 2. 通过 exec 方式执行 shell 命令 channelExec = (ChannelExec) session.openChannel("exec"); channelExec.setCommand(cmd); channelExec.connect(); // 执行命令 // 3. 获取标准输入流 inputStreamReader = new BufferedReader(new InputStreamReader(channelExec.getInputStream())); // 4. 获取标准错误输入流 errInputStreamReader = new BufferedReader(new InputStreamReader(channelExec.getErrStream())); // 5. 记录命令执行 log String line = null; while ((line = inputStreamReader.readLine()) != null) { runLog.append(line).append("\n"); } // 6. 记录命令执行错误 log String errLine = null; while ((errLine = errInputStreamReader.readLine()) != null) { errLog.append(errLine).append("\n"); } // 7. 输出 shell 命令执行日志 System.out.println("exitStatus=" + channelExec.getExitStatus() + ", openChannel.isClosed=" + channelExec.isClosed()); System.out.println("命令执行完成,执行日志如下:"); System.out.println(runLog.toString()); System.out.println("命令执行完成,执行错误日志如下:"); System.out.println(errLog.toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { if (inputStreamReader != null) { inputStreamReader.close(); } if (errInputStreamReader != null) { errInputStreamReader.close(); } if (channelExec != null) { channelExec.disconnect(); } if (session != null) { session.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return runLog.toString(); }}
上述工具類別使用:
package org.example;import org.example.shell.Shell;/** * Hello world! * */public class App { public static void main( String[] args ) { String cmd = "ls -1"; Shell shell = new Shell("192.168.10.10", "ubuntu", "11111"); String execLog = shell.execCommand(cmd); System.out.println(execLog); }}
推薦:《java影片教學》
以上是JSch如何遠端執行Shell指令的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

WebStorm Mac版
好用的JavaScript開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版
SublimeText3 Linux最新版

記事本++7.3.1
好用且免費的程式碼編輯器