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

Java實現(xiàn)遠程執(zhí)行Shell指令

 更新時間:2025年08月28日 16:12:55   作者:Jeremy_Lee123  
文章介紹使用JSch在SpringBoot項目中實現(xiàn)遠程Shell操作,涵蓋環(huán)境配置、依賴引入及工具類編寫,詳解分號和雙與號執(zhí)行多指令的區(qū)別

JSch(Java Secure Channel)是SSH2的一個純Java實現(xiàn)。

它允許你連接到一個sshd 服務(wù)器,進而使用端口轉(zhuǎn)發(fā),X11轉(zhuǎn)發(fā),文件傳輸?shù)鹊裙δ堋?/p>

本文這里主要介紹如何利用JSch進行遠程Shell操作。

軟硬件環(huán)境說明

  • Windows10
  • IntelliJ IDEA
  • SpringBoot 2.1.4.RELEASE
  • CentOS7

在pom.xml中引入JSch依賴

<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

編寫執(zhí)行Shell指令的工具類

package com.lxk.aisware.util;

import com.jcraft.jsch.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Properties;

/**
 * 執(zhí)行Shell工具類
 *
 */
public class ExecuteShellUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(ExecuteShellUtil.class);

    /** 未調(diào)用初始化方法 錯誤提示信息 */
    private static final String DONOT_INIT_ERROR_MSG = "please invoke init(...) first!";

    private Session session;

    private Channel channel;

    private ChannelExec channelExec;

    private ExecuteShellUtil() {
    }

    /**
     * 獲取ExecuteShellUtil類實例對象
     *
     */
    public static ExecuteShellUtil getInstance() {
        return new ExecuteShellUtil();
    }

    /**
     * 初始化
     *
     * @param ip
     *         遠程Linux地址
     * @param port
     *         端口
     * @param username
     *         用戶名
     * @param password
     *         密碼
     * @throws JSchException
     *         JSch異常
     */
    public void init(String ip, Integer port, String username, String password) throws JSchException {
        JSch jsch = new JSch();
        jsch.getSession(username, ip, port);
        session = jsch.getSession(username, ip, port);
        session.setPassword(password);
        Properties sshConfig = new Properties();
        sshConfig.put("StrictHostKeyChecking", "no");
        session.setConfig(sshConfig);
        session.connect(60 * 1000);
        LOGGER.info("Session connected!");
        // 打開執(zhí)行shell指令的通道
        channel = session.openChannel("exec");
        channelExec = (ChannelExec) channel;
    }

    /**
     * 執(zhí)行一條命令
     */
    public String execCmd(String command) throws Exception {
        if (session == null || channel == null || channelExec == null) {
            throw new Exception(DONOT_INIT_ERROR_MSG);
        }
        LOGGER.info("execCmd command - > {}", command);
        channelExec.setCommand(command);
        channel.setInputStream(null);
        channelExec.setErrStream(System.err);
        channel.connect();
        StringBuilder sb = new StringBuilder(16);
        try (InputStream in = channelExec.getInputStream();
             InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);
             BufferedReader reader = new BufferedReader(isr)) {
            String buffer;
            while ((buffer = reader.readLine()) != null) {
                sb.append("\n").append(buffer);
            }
        }catch (Exception  e){
            LOGGER.info("execCmd result failed- > {}",e.toString());
        }finally {
            // 釋放資源
            close();
        }

        LOGGER.info("execCmd result succeed- > {}", sb.toString());
        return sb.toString();
    }

    /**
     * 釋放資源
     *
     * @date 2019/3/15 12:47
     */
    private void close() {
        if (channelExec != null && channelExec.isConnected()) {
            channelExec.disconnect();
        }
        if (channel != null && channel.isConnected()) {
            channel.disconnect();
        }
        if (session != null && session.isConnected()) {
            session.disconnect();
        }
    }
}

注:

如果要執(zhí)行多個指令,可以多次調(diào)用工具類,也可以像使用多指令shell一樣,使用【;】或【&&】等符號將多個指令隔開。     

追注:

1、【;】隔開的多個shell命令,會按照順序執(zhí)行下來,但是不能保證每條命令都執(zhí)行成功。   

2、【&&】隔開的多個shell命令,前面的命令執(zhí)行成功,才會執(zhí)行后面的命令,否則后面的命令不執(zhí)行。       

3、將多指令隔開的符號,上面給出的只是最常用的兩種,更多功能的符號可自行查閱相關(guān)資料。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一篇文章弄懂Java和Kotlin的泛型難點

    一篇文章弄懂Java和Kotlin的泛型難點

    這篇文章主要給大家介紹了如何通過一篇文章弄懂Java和Kotlin的泛型難點的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • java后端pageHelper分頁實現(xiàn)方法步驟

    java后端pageHelper分頁實現(xiàn)方法步驟

    這篇文章主要給大家介紹了關(guān)于java后端pageHelper分頁實現(xiàn)方法的相關(guān)資料,在我們的Java項目中分頁是必不可少的數(shù)據(jù)展示頁面,文中通過圖文以及示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Java泛型機制與反射原理相關(guān)知識總結(jié)

    Java泛型機制與反射原理相關(guān)知識總結(jié)

    今天帶大家學(xué)習(xí)的是關(guān)于Java進階的相關(guān)知識,文章圍繞著Java泛型機制與反射原理展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • SpringBoot Maven打包失敗報:class lombok.javac.apt.LombokProcessor錯誤的解決辦法

    SpringBoot Maven打包失敗報:class lombok.javac.apt.Lombo

    最新項目部署的時候,出現(xiàn)了一個maven打包失敗的問題,報:class lombok.javac.apt.LombokProcessor錯誤,所以本文給大家介紹了如何解決SpringBoot Maven 打包失敗:class lombok.javac.apt.LombokProcessor 錯誤,需要的朋友可以參考下
    2023-12-12
  • Java多線程并發(fā)編程 Synchronized關(guān)鍵字

    Java多線程并發(fā)編程 Synchronized關(guān)鍵字

    現(xiàn)有一成員變量 Test,當(dāng)線程 A 調(diào)用 Test 的 synchronized 方法,線程 A 獲得 Test 的同步鎖,同時,線程 B 也去調(diào)用 Test 的 synchronized 方法,此時線程 B 無法獲得 Test 的同步鎖,必須等待線程 A 釋放 Test 的同步鎖才能獲得從而執(zhí)行對應(yīng)方法的代碼
    2017-05-05
  • Java實現(xiàn)刪除文件中的指定內(nèi)容

    Java實現(xiàn)刪除文件中的指定內(nèi)容

    在日常開發(fā)中,經(jīng)常需要對文本文件進行批量處理,其中,刪除文件中指定內(nèi)容是最常見的需求之一,下面我們就來看看如何使用java實現(xiàn)刪除文件中的指定內(nèi)容吧
    2025-06-06
  • Java實現(xiàn)二分查找樹及其相關(guān)操作

    Java實現(xiàn)二分查找樹及其相關(guān)操作

    二分查找樹是一種有組織的二叉樹。我們可以通過鏈接節(jié)點表示這樣一棵樹,二分查找樹(Binary Search Tree)的基本操作有搜索、求最大值、求最小值、求前驅(qū)、求后繼、插入及刪除,對java二分查找樹相關(guān)知識感興趣的朋友一起看看吧
    2021-07-07
  • 阿里、華為、騰訊Java技術(shù)面試題精選

    阿里、華為、騰訊Java技術(shù)面試題精選

    這篇文章主要為大家分享了阿里、華為、騰訊Java技術(shù)面試題精選,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 使用SpringBoot自定義starter詳解

    使用SpringBoot自定義starter詳解

    這篇文章主要介紹了使用Spring Boot自定義starter詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助喲,需要的朋友可以參考下
    2021-05-05
  • Java SwingWorkder使用實例

    Java SwingWorkder使用實例

    最近在學(xué)習(xí)Swing,我們都知道在UI表現(xiàn)線程里面長時間執(zhí)行操作時,畫面會假死,為了能夠讓費時操作不影響畫面表現(xiàn),就需要用多線程了
    2014-04-04

最新評論

明水县| 阿拉善盟| 拉孜县| 亚东县| 同德县| 西峡县| 武强县| 吉木萨尔县| 白山市| 土默特右旗| 沙雅县| 广河县| 琼中| 淮阳县| 呼玛县| 尖扎县| 江津市| 高邮市| 连州市| 临海市| 兰考县| 桃园县| 南陵县| 旺苍县| 岳阳市| 天津市| 若羌县| 武威市| 张家界市| 黑河市| 清流县| 古蔺县| 瑞丽市| 永修县| 宁强县| 云浮市| 江津市| 金坛市| 玉屏| 大悟县| 深泽县|