>  기사  >  Java  >  JSch가 쉘 명령을 원격으로 실행하는 방법

JSch가 쉘 명령을 원격으로 실행하는 방법

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-04-23 09:38:143399검색

이 글에서는 JSch를 사용하여 원격으로 Shell 명령을 실행하는 방법을 자세히 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

JSch가 쉘 명령을 원격으로 실행하는 방법

JSch는 Java Secure Channel의 약어입니다. JSch는 SSH2의 순수 Java 구현입니다. 이를 통해 SSH 서버에 연결하고 포트 전달, X11 전달, 파일 전송 등을 사용할 수 있습니다. 물론 해당 기능을 자신의 애플리케이션에 통합할 수도 있습니다. 프레임워크 jsch는 2016년에 업데이트되었으며 현재는 더 이상 업데이트되지 않는 매우 오래된 프레임워크입니다.

JSch는 셸을 사용하여 명령을 실행합니다. 두 가지 방법이 있습니다.

  • ChannelExec: 한 번에 하나의 명령을 실행합니다.

  • ChannelShell: 여러 명령을 실행할 수 있으므로 일상적인 개발에서는 많이 사용되지 않으므로 필요에 따라 사용할 수 있습니다.

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

1. ChannelExec

  • ;을 사용하여 각 명령을 구분합니다. 참고: 각 명령의 실행은 다른 명령의 실행에 영향을 주지 않습니다. 즉, 각 명령이 실행되지만 모든 명령이 성공적으로 실행된다는 보장은 없습니다.

  • 각 명령을 &&로 구분하세요. 참고: 이전 명령이 성공적으로 실행되면 다음 명령이 실행됩니다. 이렇게 하면 모든 명령이 실행된 후 실행 프로세스가 성공합니다.

  • 각 명령은 ||로 구분하세요. 참고: ||는 또는 명령이 성공적으로 실행될 때까지 이전 명령 실행이 실패한 후에만 다음 명령이 실행된다는 것을 의미합니다.

2. ChannelShell

ChannelShell의 경우 여러 명령을 입력 스트림 형태로 실행할 수 있습니다. 이는 로컬 컴퓨터에서 대화형 셸을 사용하는 것과 같습니다(일반적으로 대화형 사용에 사용됩니다). 중지하려면 두 가지 방법이 있습니다.

  • 종료 명령을 보내 프로그램에 이 상호 작용이 끝났음을 알립니다.

  • 바이트 스트림에서 사용 가능한 방법을 사용하여 데이터의 전체 크기를 가져옵니다. 그런 다음 루프 읽기를 반복하십시오.

사용 예

1. pom 종속성 소개

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

2.jsch 사용 예

쉘 도구 클래스는 여기에 캡슐화되어 있어 쉘 명령을 실행할 수 있습니다. 사용 시 코드는 다음과 같습니다.

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가 쉘 명령을 원격으로 실행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제