最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何用java程序(JSch)運(yùn)行遠(yuǎn)程linux主機(jī)上的shell腳本

 更新時間:2020年08月07日 11:36:55   作者:字母哥博客  
這篇文章主要介紹了如何用java程序(JSch)運(yùn)行遠(yuǎn)程linux主機(jī)上的shell腳本,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

運(yùn)行遠(yuǎn)程主機(jī)上的shell腳本

下面的例子是教給大家如何通過java程序,運(yùn)行遠(yuǎn)程主機(jī)上的shell腳本。(我講的不是一個黑客學(xué)習(xí)教程,而是使用用戶名密碼去執(zhí)行有用戶認(rèn)證資格的主機(jī)上的shell腳本)。并且通過java程序獲得shell腳本的輸出。
首先通過maven坐標(biāo)引入JSch依賴庫,我們正是通過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)開通SSH服務(wù)(也就是我們平時登錄主機(jī)所使用的服務(wù))。

遠(yuǎn)程shell腳本

下面的代碼放入一個文件:hello.sh,腳本的內(nèi)容很簡單只是用來測試,回顯輸出“hello <參數(shù)1> ”

#! /bin/sh
echo "hello $1\n";

然后我把它放到遠(yuǎn)程主機(jī)的/root目錄下面,遠(yuǎn)程主機(jī)的IP是1.1.1.1(當(dāng)然我真實(shí)測試時候不是這個IP,我不能把我的真實(shí)IP寫到這個文章里面,以免被攻擊)。并且在遠(yuǎn)程主機(jī)上,為這個腳本設(shè)置可執(zhí)行權(quán)限,方法如下:

$ chmod +x hello.sh

本地java程序

我們可以使用下面的代碼,去遠(yuǎn)程的linux 主機(jī)執(zhí)行shell腳本,詳細(xì)功能請看代碼注釋

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;
  //會話超時時間
  private static final int SESSION_TIMEOUT = 10000;
  //管道流超時時間(執(zhí)行腳本超時時間)
  private static final int CHANNEL_TIMEOUT = 5000;

  public static void main(String[] args) {
    //腳本名稱及路徑,與上文要對上
    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)的錯誤日志
      channelExec.setErrStream(System.err);

      //腳本執(zhí)行結(jié)果輸出,對于程序來說是輸入流
      InputStream in = channelExec.getInputStream();

      // 5 秒執(zhí)行管道超時
      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é)果打印到程序控制臺
          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();
      }
    }

  }
}

最終在本地控制臺,獲得遠(yuǎn)程主機(jī)上shell腳本的執(zhí)行結(jié)果。如下

hello zimug

exit-status: 0

當(dāng)然,我只是為大家演示這樣一個例子,上面的代碼可以通過更好的封裝,從而提供更簡單的使用方式。

以上就是如何用java程序(JSch)運(yùn)行遠(yuǎn)程linux主機(jī)上的shell腳本的詳細(xì)內(nèi)容,更多關(guān)于JAVA運(yùn)行Linux的shell腳本的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java多線程編程實(shí)例

    java多線程編程實(shí)例

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下。
    2017-11-11
  • Java分布式鎖由淺入深介紹

    Java分布式鎖由淺入深介紹

    這篇文章主要介紹了Java分布式鎖,數(shù)據(jù)庫實(shí)現(xiàn)分布式鎖方式比較多,如悲觀鎖(查詢時增加for?update)、樂觀鎖(通過version字段)、增加一個表記錄鎖信息等。因?yàn)橐蕾囉跀?shù)據(jù)庫,比較好理解,但是也存在一些問題
    2023-03-03
  • Java?中的5個代碼性能提升技巧

    Java?中的5個代碼性能提升技巧

    這篇文章主要給大家分享了Java的5個代碼性能提升的技巧,雖然大多數(shù)情況下極致優(yōu)化代碼是沒有必要的,但是作為一名技術(shù)開發(fā)者,我們還是想追求代碼的更小、更快,更強(qiáng)。如果哪天發(fā)現(xiàn)程序的運(yùn)行速度不盡人意,就需要這樣的文章了,需要的朋友可以參考一下
    2021-12-12
  • Mybatis-Plus中IdType.AUTO局部配置不生效的問題解決

    Mybatis-Plus中IdType.AUTO局部配置不生效的問題解決

    本文主要介紹了Mybatis-Plus中IdType.AUTO局部配置不生效的問題解決,數(shù)據(jù)庫插入數(shù)據(jù)時,id的默認(rèn)生成方式還是雪花算法,局部配置沒有生效,下面就來解決一下,感興趣的可以了解一下
    2023-09-09
  • 淺談UUID生成的原理及優(yōu)缺點(diǎn)

    淺談UUID生成的原理及優(yōu)缺點(diǎn)

    UUID是一套用于生成全局唯一標(biāo)識符的標(biāo)準(zhǔn),也被稱為GUID?(Globally?Unique?Identifier),通過使用UUID可以在分布式系統(tǒng)中生成唯一的?ID,UUID的生成方式有多種,本文將詳細(xì)講解?UUID?的生成原理、特性、實(shí)用場景以及優(yōu)缺點(diǎn)
    2023-06-06
  • 帶你重新認(rèn)識Java動態(tài)代理

    帶你重新認(rèn)識Java動態(tài)代理

    這篇文章主要為大家介紹了Java的動態(tài)代理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 過濾器 和 攔截器的 6個區(qū)別(別再傻傻分不清了)

    過濾器 和 攔截器的 6個區(qū)別(別再傻傻分不清了)

    這篇文章主要介紹了過濾器 和 攔截器的 6個區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • IntelliJ IDEA 統(tǒng)一設(shè)置編碼為utf-8編碼的實(shí)現(xiàn)

    IntelliJ IDEA 統(tǒng)一設(shè)置編碼為utf-8編碼的實(shí)現(xiàn)

    這篇文章主要介紹了IntelliJ IDEA 統(tǒng)一設(shè)置編碼為utf-8編碼的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-06-06
  • Java冒泡排序及優(yōu)化介紹

    Java冒泡排序及優(yōu)化介紹

    大家好,本篇文章主要講的是Java冒泡排序及優(yōu)化介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Spring?Boot深入排查?java.lang.ArrayStoreException異常

    Spring?Boot深入排查?java.lang.ArrayStoreException異常

    這篇文章介紹了Spring?Boot深入排查?java.lang.ArrayStoreException異常,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12

最新評論

磐石市| 榕江县| 博爱县| 平远县| 武川县| 新闻| 高州市| 集安市| 枣强县| 安西县| 汪清县| 门头沟区| 美姑县| 曲靖市| 稻城县| 平果县| 共和县| 西藏| 麦盖提县| 惠水县| 泸定县| 呈贡县| 五常市| 唐河县| 来宾市| 临安市| 托里县| 北京市| 岚皋县| 渑池县| 红桥区| 青海省| 巴东县| 新建县| 嘉义县| 天镇县| 宁津县| 天气| 阿拉善盟| 尉氏县| 民和|