本篇文章給大家詳細介紹一下用JSch遠端執行Shell指令的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
JSch 是Java Secure Channel的縮寫。 JSch是一個SSH2的純Java實作。它允許你連接到一個SSH伺服器,並且可以使用連接埠轉發,X11轉發,文件傳輸等,當然你也可以整合它的功能到你自己的應用程式。框架jsch很老的框架,更新到2016年,現在也不更新了。
ChannelExec: 一次執行一條指令,一般我們用這個就夠了。
ChannelShell: 可執行多條指令,平常開發用的不多,依需求來吧;
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");//只能执行一条指令(也可执行符合指令) ChannelShell channelShell = (ChannelShell) session.openChannel("shell");//可执行多条指令 不过需要输入输出流
每個指令之間用; 隔開。說明:各指令的執行給果,不會影響其它指令的執行。換句話說,各個指令都會執行,但不保證每個指令都執行成功。
每個指令之間用 && 隔開。說明:若前面的指令執行成功,才會去執行後面的指令。這樣可以確保所有的命令執行完畢後,執行過程都是成功的。
每個指令之間用 || 隔開。說明:|| 是或的意思,只有前面的指令執行失敗後才去執行下一條指令,直到執行成功一條指令為止。
對於ChannelShell,以輸入流的形式,可執行多條指令,這就像在本地電腦上使用互動式shell(它通常用於:互動式使用)。如要要停止,有兩種方式:
傳送一個exit指令,告訴程式本次互動結束;
使用位元組流中的available方法,來取得資料的總大小,然後循環去讀。
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.53</version> </dependency>
在此封裝了一個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中文網其他相關文章!