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

Java JSch遠(yuǎn)程執(zhí)行Shell命令的方法

 更新時(shí)間:2022年02月24日 11:45:53   作者:qhh0205  
本文主要介紹了Java JSch遠(yuǎn)程執(zhí)行Shell命令,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

背景

項(xiàng)目需求,需要遠(yuǎn)程 ssh 登錄到某個(gè)節(jié)點(diǎn)執(zhí)行 shell 命令來完成任務(wù)。對于這種需求,如果不用 java 程序,直接 linux 的 ssh 命令就可以完成,但是在編碼到程序中時(shí)需要相關(guān)的程序包來完成,本文主要介紹在 java 中如何使用 JSch 包實(shí)現(xiàn) ssh 遠(yuǎn)程連接并執(zhí)行命令。

JSch 簡介

JSch 是Java Secure Channel的縮寫。JSch是一個(gè)SSH2的純Java實(shí)現(xiàn)。它允許你連接到一個(gè)SSH服務(wù)器,并且可以使用端口轉(zhuǎn)發(fā),X11轉(zhuǎn)發(fā),文件傳輸?shù)?,?dāng)然你也可以集成它的功能到你自己的應(yīng)用程序??蚣躩sch很老的框架,更新到2016年,現(xiàn)在也不更新了。

JSch 使用 shell 執(zhí)行命令,有兩種方法

  • ChannelExec: 一次執(zhí)行一條命令,一般我們用這個(gè)就夠了。
  • ChannelShell: 可執(zhí)行多條命令,平時(shí)開發(fā)用的不多,根據(jù)需要來吧;
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");//只能執(zhí)行一條指令(也可執(zhí)行符合指令)
ChannelShell channelShell = (ChannelShell) session.openChannel("shell");//可執(zhí)行多條指令 不過需要輸入輸出流

1. ChannelExec

每個(gè)命令之間用 ; 隔開。說明:各命令的執(zhí)行給果,不會影響其它命令的執(zhí)行。換句話說,各個(gè)命令都會執(zhí)行,但不保證每個(gè)命令都執(zhí)行成功。
每個(gè)命令之間用 && 隔開。說明:若前面的命令執(zhí)行成功,才會去執(zhí)行后面的命令。這樣可以保證所有的命令執(zhí)行完畢后,執(zhí)行過程都是成功的。
每個(gè)命令之間用 || 隔開。說明:|| 是或的意思,只有前面的命令執(zhí)行失敗后才去執(zhí)行下一條命令,直到執(zhí)行成功一條命令為止。

2. ChannelShell

對于ChannelShell,以輸入流的形式,可執(zhí)行多條指令,這就像在本地計(jì)算機(jī)上使用交互式shell(它通常用于:交互式使用)。如要要想停止,有兩種方式:

發(fā)送一個(gè)exit命令,告訴程序本次交互結(jié)束;
使用字節(jié)流中的available方法,來獲取數(shù)據(jù)的總大小,然后循環(huán)去讀。

使用示例

1. 引入 pom 依賴

<dependency>
? ?<groupId>com.jcraft</groupId>
? ?<artifactId>jsch</artifactId>
? ?<version>0.1.53</version>
</dependency>

2. jsch 使用示例

在此封裝了一個(gè) Shell 工具類,用來執(zhí)行 shell 命令,具體使用細(xì)節(jié)在代碼注釋中有說明,可以直接拷貝并使用,代碼如下:

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 方式執(zhí)行 shell 命令
? ? ? ? ? ? channelExec = (ChannelExec) session.openChannel("exec");
? ? ? ? ? ? channelExec.setCommand(cmd);
? ? ? ? ? ? channelExec.connect(); ?// 執(zhí)行命令

? ? ? ? ? ? // 3. 獲取標(biāo)準(zhǔn)輸入流
? ? ? ? ? ? inputStreamReader = new BufferedReader(new InputStreamReader(channelExec.getInputStream()));
? ? ? ? ? ? // 4. 獲取標(biāo)準(zhǔn)錯(cuò)誤輸入流
? ? ? ? ? ? errInputStreamReader = new BufferedReader(new InputStreamReader(channelExec.getErrStream()));

? ? ? ? ? ? // 5. 記錄命令執(zhí)行 log
? ? ? ? ? ? String line = null;
? ? ? ? ? ? while ((line = inputStreamReader.readLine()) != null) {
? ? ? ? ? ? ? ? runLog.append(line).append("\n");
? ? ? ? ? ? }

? ? ? ? ? ? // 6. 記錄命令執(zhí)行錯(cuò)誤 log
? ? ? ? ? ? String errLine = null;
? ? ? ? ? ? while ((errLine = errInputStreamReader.readLine()) != null) {
? ? ? ? ? ? ? ? errLog.append(errLine).append("\n");
? ? ? ? ? ? }

? ? ? ? ? ? // 7. 輸出 shell 命令執(zhí)行日志
? ? ? ? ? ? System.out.println("exitStatus=" + channelExec.getExitStatus() + ", openChannel.isClosed="
? ? ? ? ? ? ? ? ? ? + channelExec.isClosed());
? ? ? ? ? ? System.out.println("命令執(zhí)行完成,執(zhí)行日志如下:");
? ? ? ? ? ? System.out.println(runLog.toString());
? ? ? ? ? ? System.out.println("命令執(zhí)行完成,執(zhí)行錯(cuò)誤日志如下:");
? ? ? ? ? ? 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);
? ? }
}

需要注意的點(diǎn)

如果需要后臺執(zhí)行某個(gè)命令,不能直接 <命令> + & 的方式執(zhí)行,這樣在 JSch 中不生效,需要寫成這樣的格式:<命令> > /dev/null 2>&1 &。比如要后臺執(zhí)行 sleep 60,需要寫成 sleep 60 > /dev/null 2>&1

具體 issue 見這里:https://stackoverflow.com/questions/37833683/running-programs-using-jsch-in-the-background

參考文檔

https://www.cnblogs.com/slankka/p/11988477.html

https://blog.csdn.net/sinat_24928447/article/details/83022818

到此這篇關(guān)于Java JSch遠(yuǎn)程執(zhí)行Shell命令的方法的文章就介紹到這了,更多相關(guān)Java JSch遠(yuǎn)程執(zhí)行Shell命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 普通代碼塊靜態(tài)代碼塊執(zhí)行順序(實(shí)例講解)

    Java 普通代碼塊靜態(tài)代碼塊執(zhí)行順序(實(shí)例講解)

    下面小編就為大家?guī)硪黄狫ava 普通代碼塊靜態(tài)代碼塊執(zhí)行順序(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Spring框架學(xué)習(xí)之Cache抽象詳解

    Spring框架學(xué)習(xí)之Cache抽象詳解

    這篇文章主要為大家介紹了Spring框架學(xué)習(xí)中Cache抽象詳解示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式

    Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式

    這篇文章主要介紹了Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)的實(shí)例代碼

    Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)的實(shí)例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java Spring事務(wù)的隔離級別詳解

    Java Spring事務(wù)的隔離級別詳解

    這篇文章主要介紹了Java Spring事務(wù)的隔離級別,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Java基礎(chǔ)字符編碼與內(nèi)存流詳細(xì)解讀

    Java基礎(chǔ)字符編碼與內(nèi)存流詳細(xì)解讀

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Java 多層嵌套JSON類型數(shù)據(jù)全面解析

    Java 多層嵌套JSON類型數(shù)據(jù)全面解析

    這篇文章主要介紹了Java 多層嵌套JSON類型數(shù)據(jù)全面解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 詳解微信開發(fā)之Author網(wǎng)頁授權(quán)

    詳解微信開發(fā)之Author網(wǎng)頁授權(quán)

    微信開發(fā)中,經(jīng)常有這樣的需求:獲得用戶頭像、綁定微信號給用戶發(fā)信息,那么實(shí)現(xiàn)這些的前提就是授權(quán)!本文對此進(jìn)行系統(tǒng)介紹,需要的朋友一起來看下吧
    2016-12-12
  • 徹底搞明白Spring中的自動裝配和Autowired注解的使用

    徹底搞明白Spring中的自動裝配和Autowired注解的使用

    這篇文章主要介紹了徹底搞明白Spring中的自動裝配和Autowired注解的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • postman測試傳入List<String>參數(shù)方式

    postman測試傳入List<String>參數(shù)方式

    這篇文章主要介紹了postman測試傳入List<String>參數(shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論

夹江县| 鄯善县| 大田县| 镇平县| 辛集市| 宜黄县| 长泰县| 读书| 泰兴市| 分宜县| 丘北县| 无棣县| 桓台县| 新晃| 高邑县| 沅陵县| 固镇县| 乐山市| 城步| 仪陇县| 兰坪| 新化县| 威信县| 张北县| 宝清县| 进贤县| 称多县| 崇礼县| 青龙| 虞城县| 海阳市| 瑞安市| 博爱县| 疏勒县| 雷州市| 金坛市| 凉城县| 蓬安县| 友谊县| 永靖县| 涿鹿县|