Maison >Java >javaDidacticiel >Comment JSch exécute les commandes Shell à distance

Comment JSch exécute les commandes Shell à distance

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-04-23 09:38:143578parcourir

Cet article vous donnera une introduction détaillée sur la façon d'exécuter à distance des commandes Shell à l'aide de JSch. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comment JSch exécute les commandes Shell à distance

JSch est l'abréviation de Java Secure Channel. JSch est une implémentation purement Java de SSH2. Il vous permet de vous connecter à un serveur SSH et d'utiliser la redirection de port, la redirection X11, le transfert de fichiers, etc. Bien entendu, vous pouvez également intégrer ses fonctionnalités dans vos propres applications. Le framework jsch est un framework très ancien. Il a été mis à jour en 2016 et n'est plus mis à jour maintenant.

JSch utilise le shell pour exécuter des commandes. Il existe deux méthodes

  • ChannelExec : Exécuter une commande à la fois. Généralement, cela nous suffit.

  • ChannelShell : peut exécuter plusieurs commandes. Il n'est pas beaucoup utilisé dans le développement quotidien, vous pouvez donc l'utiliser selon vos besoins

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

1 ; . ChannelExec

  • Séparez chaque commande par ;. Remarque : L'exécution de chaque commande n'affectera pas l'exécution des autres commandes. En d’autres termes, chaque commande sera exécutée, mais rien ne garantit que chaque commande sera exécutée avec succès.

  • Séparez chaque commande par &&. Remarque : Si la commande précédente est exécutée avec succès, la commande suivante sera exécutée. Cela garantit qu'une fois toutes les commandes exécutées, le processus d'exécution réussit.

  • Chaque commande est séparée par ||. Remarque : || signifie ou, la commande suivante ne sera exécutée qu'après l'échec de l'exécution de la commande précédente, jusqu'à ce qu'une commande soit exécutée avec succès.

2. ChannelShell

Pour ChannelShell, plusieurs instructions peuvent être exécutées sous la forme d'un flux d'entrée, ce qui revient à utiliser un shell interactif sur l'ordinateur local (il généralement pour : utilisation interactive). Si vous souhaitez arrêter, il existe deux manières :

  • Envoyer une commande de sortie pour indiquer au programme que cette interaction est terminée

  • Utiliser ; octets La méthode disponible dans le flux est utilisée pour obtenir la taille totale des données, puis elle est lue en boucle.

Exemple d'utilisation

1. Introduire la dépendance pom

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

2 Exemple d'utilisation de jsch

encapsule un outil Shell ici Classe, utilisé pour exécuter des commandes shell. Les détails d'utilisation spécifiques sont expliqués dans les commentaires du code. Vous pouvez le copier et l'utiliser directement. Le code est le suivant :

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();
    }}

Utilisation de la classe d'outils ci-dessus :

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);
    }}
<.>Recommandé : "

Tutoriel vidéo Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer