如何用java程序(JSch)運(yùn)行遠(yuǎn)程linux主機(jī)上的shell腳本
運(yùn)行遠(yuǎn)程主機(jī)上的shell腳本
下面的例子是教給大家如何通過(guò)java程序,運(yùn)行遠(yuǎn)程主機(jī)上的shell腳本。(我講的不是一個(gè)黑客學(xué)習(xí)教程,而是使用用戶名密碼去執(zhí)行有用戶認(rèn)證資格的主機(jī)上的shell腳本)。并且通過(guò)java程序獲得shell腳本的輸出。
首先通過(guò)maven坐標(biāo)引入JSch依賴庫(kù),我們正是通過(guò)JSch去執(zhí)行遠(yuǎn)程主機(jī)上的腳本。
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency>
當(dāng)然以下java代碼可執(zhí)行的的前提是,遠(yuǎn)程主機(jī)已經(jīng)開(kāi)通SSH服務(wù)(也就是我們平時(shí)登錄主機(jī)所使用的服務(wù))。
遠(yuǎn)程shell腳本
下面的代碼放入一個(gè)文件:hello.sh,腳本的內(nèi)容很簡(jiǎn)單只是用來(lái)測(cè)試,回顯輸出“hello <參數(shù)1> ”
#! /bin/sh echo "hello $1\n";
然后我把它放到遠(yuǎn)程主機(jī)的/root目錄下面,遠(yuǎn)程主機(jī)的IP是1.1.1.1(當(dāng)然我真實(shí)測(cè)試時(shí)候不是這個(gè)IP,我不能把我的真實(shí)IP寫到這個(gè)文章里面,以免被攻擊)。并且在遠(yuǎn)程主機(jī)上,為這個(gè)腳本設(shè)置可執(zhí)行權(quán)限,方法如下:
$ chmod +x hello.sh
本地java程序
我們可以使用下面的代碼,去遠(yuǎn)程的linux 主機(jī)執(zhí)行shell腳本,詳細(xì)功能請(qǐng)看代碼注釋
import com.jcraft.jsch.*; import java.io.IOException; import java.io.InputStream; public class RunRemoteScript { //遠(yuǎn)程主機(jī)IP private static final String REMOTE_HOST = "1.1.1.1"; //遠(yuǎn)程主機(jī)用戶名 private static final String USERNAME = ""; //遠(yuǎn)程主機(jī)密碼 private static final String PASSWORD = ""; //SSH服務(wù)端口 private static final int REMOTE_PORT = 22; //會(huì)話超時(shí)時(shí)間 private static final int SESSION_TIMEOUT = 10000; //管道流超時(shí)時(shí)間(執(zhí)行腳本超時(shí)時(shí)間) private static final int CHANNEL_TIMEOUT = 5000; public static void main(String[] args) { //腳本名稱及路徑,與上文要對(duì)上 String remoteShellScript = "/root/hello.sh"; Session jschSession = null; try { JSch jsch = new JSch(); //SSH授信客戶端文件位置,一般是用戶主目錄下的.ssh/known_hosts jsch.setKnownHosts("/home/zimug/.ssh/known_hosts"); jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT); // 密碼認(rèn)證 jschSession.setPassword(PASSWORD); // 建立session jschSession.connect(SESSION_TIMEOUT); //建立可執(zhí)行管道 ChannelExec channelExec = (ChannelExec) jschSession.openChannel("exec"); // 執(zhí)行腳本命令"sh /root/hello.sh zimug" channelExec.setCommand("sh " + remoteShellScript + " zimug"); // 獲取執(zhí)行腳本可能出現(xiàn)的錯(cuò)誤日志 channelExec.setErrStream(System.err); //腳本執(zhí)行結(jié)果輸出,對(duì)于程序來(lái)說(shuō)是輸入流 InputStream in = channelExec.getInputStream(); // 5 秒執(zhí)行管道超時(shí) channelExec.connect(CHANNEL_TIMEOUT); // 從遠(yuǎn)程主機(jī)讀取輸入流,獲得腳本執(zhí)行結(jié)果 byte[] tmp = new byte[1024]; while (true) { while (in.available() > 0) { int i = in.read(tmp, 0, 1024); if (i < 0) break; //執(zhí)行結(jié)果打印到程序控制臺(tái) System.out.print(new String(tmp, 0, i)); } if (channelExec.isClosed()) { if (in.available() > 0) continue; //獲取退出狀態(tài),狀態(tài)0表示腳本被正確執(zhí)行 System.out.println("exit-status: " + channelExec.getExitStatus()); break; } try { Thread.sleep(1000); } catch (Exception ee) { } } channelExec.disconnect(); } catch (JSchException | IOException e) { e.printStackTrace(); } finally { if (jschSession != null) { jschSession.disconnect(); } } } }
最終在本地控制臺(tái),獲得遠(yuǎn)程主機(jī)上shell腳本的執(zhí)行結(jié)果。如下
hello zimug exit-status: 0
當(dāng)然,我只是為大家演示這樣一個(gè)例子,上面的代碼可以通過(guò)更好的封裝,從而提供更簡(jiǎn)單的使用方式。
以上就是如何用java程序(JSch)運(yùn)行遠(yuǎn)程linux主機(jī)上的shell腳本的詳細(xì)內(nèi)容,更多關(guān)于JAVA運(yùn)行Linux的shell腳本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析
這篇文章主要為大家介紹了java同步器AQS架構(gòu)AbstractQueuedSynchronizer的底層原理及源碼解析,有需要的朋友可以借鑒參考下,希望能有所幫助,祝大家多多進(jìn)步早日升職加薪2022-03-03java基于servlet使用組件smartUpload實(shí)現(xiàn)文件上傳
這篇文章主要介紹了java基于servlet使用組件smartUpload實(shí)現(xiàn)文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10深入了解SpringAOP中的jdk動(dòng)態(tài)代理與CGlib
這篇文章主要介紹了深入了解SpringAOP中的jdk動(dòng)態(tài)代理與CGlib,一般我們編寫程序的思想是縱向的,也就是一個(gè)方法代碼從該方法第一行開(kāi)始往下一步一步走,直到走完最后一行代碼,也就是說(shuō)很多業(yè)務(wù)都需要的比如用戶鑒權(quán),資源釋放等,需要的朋友可以參考下2023-12-12關(guān)于maven環(huán)境的安裝及maven集成idea環(huán)境的問(wèn)題
Maven 是一個(gè)基于 Java 的工具,所以要做的第一件事情就是安裝 JDK。本文重點(diǎn)給大家介紹關(guān)于maven環(huán)境的安裝及和idea環(huán)境的集成問(wèn)題,感興趣的朋友一起看看吧2021-09-09解決Mybatis-plus自定義TypeHandler查詢映射結(jié)果一直為null問(wèn)題
這篇文章主要介紹了解決Mybatis-plus自定義TypeHandler查詢映射結(jié)果一直為null問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07解決@Scheduled定時(shí)器使用@Thransactional事物問(wèn)題
這篇文章主要介紹了解決@Scheduled定時(shí)器使用@Thransactional事物問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08SpringMVC?@RequestMapping注解屬性詳細(xì)介紹
通過(guò)@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02Java多種方法實(shí)現(xiàn)合并多個(gè)list對(duì)象列表
Java編程中,合并多個(gè)列表對(duì)象可以通過(guò)Stream?API或傳統(tǒng)循環(huán)方式實(shí)現(xiàn),使用Stream?API合并時(shí),利用flatMap方法將嵌套的List展平,再通過(guò)collect方法收集成一個(gè)新的列表,傳統(tǒng)循環(huán)則通過(guò)創(chuàng)建一個(gè)空的ArrayList,并通過(guò)遍歷每個(gè)列表將元素添加進(jìn)去2024-09-09關(guān)于設(shè)置Mybatis打印調(diào)試sql的兩種方式
這篇文章主要介紹了關(guān)于設(shè)置Mybatis打印調(diào)試sql的兩種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08