Java远程调用Shell脚本并获取输出信息【推荐】

Java远程调用Shell脚本并获取输出信息【推荐】

本文介绍如何使用Java远程调用Linux服务器上的Shell脚本,并获取执行的输出信息。本文介绍两种方法实现该功能:使用JSch库和使用ProcessBuilder类。以下是具体步骤:

准备工作

在开始之前,你需要了解以下知识点:

  • SSH:Secure Shell,即加密的远程登录协议。
  • SSH公钥认证:在SSH协议中,使用公钥认证可以免去密码认证的过程,简化远程调用过程。
  • JSch库:Java实现的SSH2协议库,可以用于远程操作Linux服务器。
  • Shell脚本:是一种用Shell脚本语言编写的脚本程序,可以在Linux系统中运行。

使用JSch库

使用JSch库可以实现在Java程序中通过SSH协议连接到Linux服务器,并执行Shell脚本。

步骤一:引入依赖

在项目中引入JSch依赖,可以通过Maven、Gradle等方式进行添加。以下是Maven中添加JSch依赖的示例:

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

步骤二:创建SSH连接

使用JSch库连接到服务器需要以下几个参数:

  • host:服务器地址
  • port:SSH协议的端口号,默认是22
  • username:登录服务器的用户名
  • password:登录服务器的密码(或者是SSH公钥的文件路径)
import com.jcraft.jsch.*;

public class SSHConnection {

    private JSch jsch = new JSch();
    private Session session;
    private String host;
    private int port;
    private String username;
    private String password;

    public SSHConnection(String host, int port, String username, String password) {
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;
    }

    public void connect() throws JSchException {
        session = jsch.getSession(username, host, port);
        session.setPassword(password);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();
    }

    public void disconnect() {
        if (session != null && session.isConnected()) {
            session.disconnect();
        }
    }

    // 在SSH连接上执行Shell脚本
    public String exec(String command) throws JSchException, IOException {
        ChannelExec channel = (ChannelExec) session.openChannel("exec");
        channel.setCommand(command);
        InputStream in = channel.getInputStream();
        channel.connect();
        byte[] tmp = new byte[1024];
        StringBuilder sb = new StringBuilder();
        while (true) {
            while (in.available() > 0) {
                int i = in.read(tmp, 0, 1024);
                if (i < 0) break;
                sb.append(new String(tmp, 0, i));
            }
            if (channel.isClosed()) {
                if (in.available() > 0) continue;
                System.out.println("exit-status: " + channel.getExitStatus());
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (Exception ee) {
            }
        }
        channel.disconnect();
        return sb.toString();
    }
}

在上述代码中,我们使用createSession()方法创建SSH连接对象。然后使用exec()方法在SSH连接对象上执行Shell脚本。

步骤三:执行Shell脚本

有了SSH连接对象,就可以在其上使用exec()方法执行Shell脚本了。以下是一个示例:

public class SSHDemo {

    public static void main(String[] args) throws JSchException, IOException {
        String host = "192.168.1.100";
        int port = 22;
        String username = "username";
        String password = "password";
        SSHConnection ssh = new SSHConnection(host, port, username, password);
        ssh.connect();
        String result = ssh.exec("ls -l");
        System.out.println(result);
        ssh.disconnect();
    }
}

在上述代码中,我们运行了一个基本的Shell脚本命令:ls -l。就可以看到该命令输出了远程服务器中的文件列表。注意:需要根据实际情况修改IP地址、用户名和密码。

使用ProcessBuilder类

如果不想使用JSch ,也可以使用ProcessBuilder类实现在Java程序中执行Shell脚本获得输出信息的功能。

步骤一:编写Shell脚本

为了演示如何使用ProcessBuilder类执行Shell脚本,我们先编写一个示例的Shell脚本。在Linux系统中,新建一个文件 hello.sh,然后输入以下代码:

#!/bin/bash
echo "Hello, World!"

保存后,使用 chmod +x hello.sh 命令授予执行权限。

步骤二:在Java程序中执行Shell脚本

在Java程序中执行Shell脚本,可以使用ProcessBuilder类。以下是一个示例:

public class ShellDemo {

    public static void main(String[] args) throws IOException, InterruptedException {
        ProcessBuilder pb = new ProcessBuilder("/bin/bash", "hello.sh");
        pb.directory(new File("/home/user"));
        Process process = pb.start();
        InputStream is = process.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        int exitCode = process.waitFor();
        System.out.println("Exit code: " + exitCode);
    }
}

在上述代码中,我们使用ProcessBuilder类构造一个进程,然后使用start()方法启动进程。通过getInputStream()方法获取进程输出信息,并使用BufferedReader读取输出。使用waitFor()方法等待Shell脚本执行完毕,并且获取脚本执行后的退出码。

至此,我们介绍了两种方法实现Java远程调用Shell脚本并获取输出信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java远程调用Shell脚本并获取输出信息【推荐】 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 搭建maven私有仓库的方法实现

    安装Maven私有仓库的原因是我们需要存储自己开发的代码和第三方依赖,以便于项目中可以统一管理和使用,同时也可以防止一些第三方依赖在我们的开发环境中被其他人修改或删除。以下是搭建maven私有仓库的方法实现的攻略: 前置条件 服务器操作系统已安装Java和Maven 了解如何使用Maven构建Java项目 已取得服务器的管理员权限 步骤 1. 安装Nexus…

    Java 2023年6月2日
    00
  • Java IO之File 类详解

    Java IO之File 类详解 什么是File类 Java IO中的File类用于表示文件或目录的抽象路径名。 File类是Java IO包中最基础的类之一,它提供了对文件系统中文件或目录进行操作的方法。File类的对象可以是目录或文件,可以进行文件的创建、删除、重命名,以及返回一些有关文件或目录的基本信息(如文件名、路径、大小、修改时间等)。 File类…

    Java 2023年5月19日
    00
  • Java编程实现时间和时间戳相互转换实例

    Java编程实现时间和时间戳相互转换实例 时间和时间戳 在Java中,时间通常用时间戳(timestamp)表示,其是一个long型的整数,表示自1970年1月1日00:00:00以来经过的毫秒数,也就是Unix时间戳。 而时间则通常用Java中的Date、Calendar或SimpleDateFormat等封装类表示。 时间戳转换为时间 我们首先来看如何将…

    Java 2023年5月20日
    00
  • Java中关于子类覆盖父类的抛出异常问题

    Java中的异常处理机制是一个很重要的特性,可以帮助开发者更好的处理程序运行过程中可能出现的异常情况,使程序更加健壮和稳定。在子类覆盖父类的方法时,如果子类方法抛出的异常类型与父类方法不同,就会产生编译错误。本文将详细介绍Java中关于子类覆盖父类的抛出异常问题,并提供两个示例说明。 1. 子类覆盖父类抛出异常类型必须兼容 子类覆盖父类的方法时,抛出的异常类…

    Java 2023年5月27日
    00
  • 纯java代码实现抽奖系统

    纯Java代码实现抽奖系统需要考虑以下几个方面: 随机生成中奖号码 用户输入信息并提交抽奖请求 判断用户是否中奖并发送中奖信息 接下来我会详细讲解每个方面的实现。 随机生成中奖号码 要实现抽奖系统首先需要生成中奖号码,可以使用Java中的Random类来实现。以下是一个示例代码: import java.util.Random; public class L…

    Java 2023年5月19日
    00
  • 关于spring boot使用 jdbc+mysql 连接的问题

    请看下面的攻略: 1.引入相关依赖 在pom.xml文件中加入以下依赖: <dependencies> <!– Spring Boot JDBC 依赖 –> <dependency> <groupId>org.springframework.boot</groupId> <artifact…

    Java 2023年5月20日
    00
  • 在JSP中访问数据库大全

    以下是在JSP中访问数据库的完整攻略: 1. 准备工作 要在JSP中访问数据库,首先需要安装JDBC驱动和配置数据库连接信息。 下载对应数据库的JDBC驱动jar包,将其放置于Web应用的WEB-INF/lib目录下 在Web应用的WEB-INF目录下创建一个名为web.xml的文件,并在其中配置数据库连接信息,比如连接地址、用户名、密码等 <!– …

    Java 2023年6月15日
    00
  • Spring Boot环境下Mybatis Plus的快速应用操作

    让我们来详细讲解一下在Spring Boot环境下如何快速应用MyBatis Plus。 准备工作 在使用MyBatis Plus前,需要在pom.xml文件中添加MyBatis Plus的依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部