Heim > Java > javaLernprogramm > Wie JSch Shell-Befehle remote ausführt

Wie JSch Shell-Befehle remote ausführt

醉折花枝作酒筹
Freigeben: 2021-04-23 09:38:14
nach vorne
3600 Leute haben es durchsucht

Dieser Artikel gibt Ihnen eine detaillierte Einführung in die Remoteausführung von Shell-Befehlen mit JSch. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Wie JSch Shell-Befehle remote ausführt

JSch ist die Abkürzung für Java Secure Channel. JSch ist eine reine Java-Implementierung von SSH2. Sie können damit eine Verbindung zu einem SSH-Server herstellen und Portweiterleitung, X11-Weiterleitung, Dateiübertragung usw. nutzen. Natürlich können Sie die Funktionalität auch in Ihre eigenen Anwendungen integrieren. Das Framework jsch ist ein sehr altes Framework. Es wurde 2016 aktualisiert und wird jetzt nicht mehr aktualisiert.

JSch verwendet Shell, um Befehle auszuführen.

  • ChannelExec: Im Allgemeinen reicht dies für uns aus.

  • ChannelShell: Es wird in der täglichen Entwicklung nicht oft verwendet, daher können Sie es nach Bedarf verwenden.

Verwenden Sie ;, um jeden Befehl zu trennen. Hinweis: Die Ausführung jedes Befehls hat keinen Einfluss auf die Ausführung anderer Befehle. Mit anderen Worten: Jeder Befehl wird ausgeführt, es gibt jedoch keine Garantie dafür, dass jeder Befehl erfolgreich ausgeführt wird.

  • Trennen Sie jeden Befehl durch &&. Hinweis: Wenn der vorherige Befehl erfolgreich ausgeführt wurde, wird der folgende Befehl ausgeführt. Dadurch wird sichergestellt, dass der Ausführungsprozess erfolgreich ist, nachdem alle Befehle ausgeführt wurden.

  • Trennen Sie jeden Befehl durch ||. Hinweis: || bedeutet, dass der nächste Befehl erst dann ausgeführt wird, wenn die Ausführung des vorherigen Befehls fehlschlägt, bis ein Befehl erfolgreich ausgeführt wird.

  • 2. ChannelShell

  • Für ChannelShell können mehrere Anweisungen in Form eines Eingabestreams ausgeführt werden, was der Verwendung einer interaktiven Shell auf dem lokalen Computer ähnelt (normalerweise wird sie für die interaktive Verwendung verwendet). Wenn Sie aufhören möchten, gibt es zwei Möglichkeiten:

Senden Sie einen Exit-Befehl, um dem Programm mitzuteilen, dass diese Interaktion beendet ist.

  • Verwenden Sie die verfügbare Methode im Byte-Stream, um die Gesamtgröße der Daten zu ermitteln. und dann Schleife lesen.

  • Verwendungsbeispiel

  • 1. Einführung in die POM-Abhängigkeit
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");//只能执行一条指令(也可执行符合指令)
ChannelShell channelShell = (ChannelShell) session.openChannel("shell");//可执行多条指令 不过需要输入输出流
Nach dem Login kopieren

2. Eine Shell-Tool-Klasse ist hier gekapselt, um Shell-Befehle auszuführen. Die spezifischen Verwendungsdetails werden in den Codekommentaren erläutert, die Sie direkt kopieren können und verwenden, der Code lautet wie folgt:

<dependency>
   <groupId>com.jcraft</groupId>
   <artifactId>jsch</artifactId>
   <version>0.1.53</version>
</dependency>
Nach dem Login kopieren

Verwenden Sie die oben genannten Tools:

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();
    }}
Nach dem Login kopieren

Empfohlen: „

Java-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWie JSch Shell-Befehle remote ausführt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage