首頁 > Java > java教程 > JSch如何遠端執行Shell指令

JSch如何遠端執行Shell指令

醉折花枝作酒筹
發布: 2021-04-23 09:38:14
轉載
3583 人瀏覽過

本篇文章給大家詳細介紹一下用JSch遠端執行Shell指令的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

JSch如何遠端執行Shell指令

JSch 是Java Secure Channel的縮寫。 JSch是一個SSH2的純Java實作。它允許你連接到一個SSH伺服器,並且可以使用連接埠轉發,X11轉發,文件傳輸等,當然你也可以整合它的功能到你自己的應用程式。框架jsch很老的框架,更新到2016年,現在也不更新了。

JSch 使用 shell 執行指令,有兩種方法

  • ChannelExec: 一次執行一條指令,一般我們用這個就夠了。

  • ChannelShell: 可執行多條指令,平常開發用的不多,依需求來吧;

ChannelExec channelExec = (ChannelExec) session.openChannel("exec");//只能执行一条指令(也可执行符合指令)
ChannelShell channelShell = (ChannelShell) session.openChannel("shell");//可执行多条指令 不过需要输入输出流
登入後複製

1. ChannelExec

  • 每個指令之間用; 隔開。說明:各指令的執行給果,不會影響其它指令的執行。換句話說,各個指令都會執行,但不保證每個指令都執行成功。

  • 每個指令之間用 && 隔開。說明:若前面的指令執行成功,才會去執行後面的指令。這樣可以確保所有的命令執行完畢後,執行過程都是成功的。

  • 每個指令之間用 || 隔開。說明:|| 是或的意思,只有前面的指令執行失敗後才去執行下一條指令,直到執行成功一條指令為止。

2. ChannelShell

對於ChannelShell,以輸入流的形式,可執行多條指令,這就像在本地電腦上使用互動式shell(它通常用於:互動式使用)。如要要停止,有兩種方式:

  • 傳送一個exit指令,告訴程式本次互動結束;

  • 使用位元組流中的available方法,來取得資料的總大小,然後循環去讀。

使用範例

1. 引入pom 依賴

<dependency>
   <groupId>com.jcraft</groupId>
   <artifactId>jsch</artifactId>
   <version>0.1.53</version>
</dependency>
登入後複製

2. jsch 使用範例

在此封裝了一個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中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板