如何用java程序(JSch)运行远程linux主机上的shell脚本

 更新时间:2020年08月07日 11:36:55   作者:字母哥博客  
这篇文章主要介绍了如何用java程序(JSch)运行远程linux主机上的shell脚本,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

运行远程主机上的shell脚本

下面的例子是教给大家如何通过java程序,运行远程主机上的shell脚本。(我讲的不是一个黑客学习教程,而是使用用户名密码去执行有用户认证资格的主机上的shell脚本)。并且通过java程序获得shell脚本的输出。
首先通过maven坐标引入JSch依赖库,我们正是通过JSch去执行远程主机上的脚本。

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

当然以下java代码可执行的的前提是,远程主机已经开通SSH服务(也就是我们平时登录主机所使用的服务)。

远程shell脚本

下面的代码放入一个文件:hello.sh,脚本的内容很简单只是用来测试,回显输出“hello <参数1> ”

#! /bin/sh
echo "hello $1\n";

然后我把它放到远程主机的/root目录下面,远程主机的IP是1.1.1.1(当然我真实测试时候不是这个IP,我不能把我的真实IP写到这个文章里面,以免被攻击)。并且在远程主机上,为这个脚本设置可执行权限,方法如下:

$ chmod +x hello.sh

本地java程序

我们可以使用下面的代码,去远程的linux 主机执行shell脚本,详细功能请看代码注释

import com.jcraft.jsch.*;

import java.io.IOException;
import java.io.InputStream;

public class RunRemoteScript {
  //远程主机IP
  private static final String REMOTE_HOST = "1.1.1.1";
  //远程主机用户名
  private static final String USERNAME = "";
  //远程主机密码
  private static final String PASSWORD = "";
  //SSH服务端口
  private static final int REMOTE_PORT = 22;
  //会话超时时间
  private static final int SESSION_TIMEOUT = 10000;
  //管道流超时时间(执行脚本超时时间)
  private static final int CHANNEL_TIMEOUT = 5000;

  public static void main(String[] args) {
    //脚本名称及路径,与上文要对上
    String remoteShellScript = "/root/hello.sh";

    Session jschSession = null;

    try {

      JSch jsch = new JSch();
      //SSH授信客户端文件位置,一般是用户主目录下的.ssh/known_hosts
      jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
      jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);

      // 密码认证
      jschSession.setPassword(PASSWORD);

      // 建立session
      jschSession.connect(SESSION_TIMEOUT);
      //建立可执行管道
      ChannelExec channelExec = (ChannelExec) jschSession.openChannel("exec");

      // 执行脚本命令"sh /root/hello.sh zimug"
      channelExec.setCommand("sh " + remoteShellScript + " zimug");

      // 获取执行脚本可能出现的错误日志
      channelExec.setErrStream(System.err);

      //脚本执行结果输出,对于程序来说是输入流
      InputStream in = channelExec.getInputStream();

      // 5 秒执行管道超时
      channelExec.connect(CHANNEL_TIMEOUT);

      // 从远程主机读取输入流,获得脚本执行结果
      byte[] tmp = new byte[1024];
      while (true) {
        while (in.available() > 0) {
          int i = in.read(tmp, 0, 1024);
          if (i < 0) break;
          //执行结果打印到程序控制台
          System.out.print(new String(tmp, 0, i));
        }
        if (channelExec.isClosed()) {
          if (in.available() > 0) continue;
          //获取退出状态,状态0表示脚本被正确执行
          System.out.println("exit-status: "
             + channelExec.getExitStatus());
          break;
        }
        try {
          Thread.sleep(1000);
        } catch (Exception ee) {
        }
      }

      channelExec.disconnect();

    } catch (JSchException | IOException e) {

      e.printStackTrace();

    } finally {
      if (jschSession != null) {
        jschSession.disconnect();
      }
    }

  }
}

最终在本地控制台,获得远程主机上shell脚本的执行结果。如下

hello zimug

exit-status: 0

当然,我只是为大家演示这样一个例子,上面的代码可以通过更好的封装,从而提供更简单的使用方式。

以上就是如何用java程序(JSch)运行远程linux主机上的shell脚本的详细内容,更多关于JAVA运行Linux的shell脚本的资料请关注脚本之家其它相关文章!

相关文章

  • 在netty中使用native传输协议的方法

    在netty中使用native传输协议的方法

    这篇文章主要介绍了在netty中使用native传输协议,这里我们只以Kqueue为例介绍了netty中native传输协议的使用,需要的朋友可以参考下
    2022-05-05
  • java同步器AQS架构AbstractQueuedSynchronizer原理解析

    java同步器AQS架构AbstractQueuedSynchronizer原理解析

    这篇文章主要为大家介绍了java同步器AQS架构AbstractQueuedSynchronizer的底层原理及源码解析,有需要的朋友可以借鉴参考下,希望能有所帮助,祝大家多多进步早日升职加薪
    2022-03-03
  • java基于servlet使用组件smartUpload实现文件上传

    java基于servlet使用组件smartUpload实现文件上传

    这篇文章主要介绍了java基于servlet使用组件smartUpload实现文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 深入了解SpringAOP中的jdk动态代理与CGlib

    深入了解SpringAOP中的jdk动态代理与CGlib

    这篇文章主要介绍了深入了解SpringAOP中的jdk动态代理与CGlib,一般我们编写程序的思想是纵向的,也就是一个方法代码从该方法第一行开始往下一步一步走,直到走完最后一行代码,也就是说很多业务都需要的比如用户鉴权,资源释放等,需要的朋友可以参考下
    2023-12-12
  • 关于maven环境的安装及maven集成idea环境的问题

    关于maven环境的安装及maven集成idea环境的问题

    Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK。本文重点给大家介绍关于maven环境的安装及和idea环境的集成问题,感兴趣的朋友一起看看吧
    2021-09-09
  • 解决Mybatis-plus自定义TypeHandler查询映射结果一直为null问题

    解决Mybatis-plus自定义TypeHandler查询映射结果一直为null问题

    这篇文章主要介绍了解决Mybatis-plus自定义TypeHandler查询映射结果一直为null问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 解决@Scheduled定时器使用@Thransactional事物问题

    解决@Scheduled定时器使用@Thransactional事物问题

    这篇文章主要介绍了解决@Scheduled定时器使用@Thransactional事物问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringMVC @RequestMapping注解属性详细介绍

    SpringMVC @RequestMapping注解属性详细介绍

    通过@RequestMapping注解可以定义不同的处理器映射规则,下面这篇文章主要给大家介绍了关于SpringMVC中@RequestMapping注解用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Java多种方法实现合并多个list对象列表

    Java多种方法实现合并多个list对象列表

    Java编程中,合并多个列表对象可以通过Stream API或传统循环方式实现,使用Stream API合并时,利用flatMap方法将嵌套的List展平,再通过collect方法收集成一个新的列表,传统循环则通过创建一个空的ArrayList,并通过遍历每个列表将元素添加进去
    2024-09-09
  • 关于设置Mybatis打印调试sql的两种方式

    关于设置Mybatis打印调试sql的两种方式

    这篇文章主要介绍了关于设置Mybatis打印调试sql的两种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论