如何用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脚本的资料请关注脚本之家其它相关文章!

相关文章

  • java多线程编程实例

    java多线程编程实例

    这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下。
    2017-11-11
  • Java分布式锁由浅入深介绍

    Java分布式锁由浅入深介绍

    这篇文章主要介绍了Java分布式锁,数据库实现分布式锁方式比较多,如悲观锁(查询时增加for update)、乐观锁(通过version字段)、增加一个表记录锁信息等。因为依赖于数据库,比较好理解,但是也存在一些问题
    2023-03-03
  • Java 中的5个代码性能提升技巧

    Java 中的5个代码性能提升技巧

    这篇文章主要给大家分享了Java的5个代码性能提升的技巧,虽然大多数情况下极致优化代码是没有必要的,但是作为一名技术开发者,我们还是想追求代码的更小、更快,更强。如果哪天发现程序的运行速度不尽人意,就需要这样的文章了,需要的朋友可以参考一下
    2021-12-12
  • Mybatis-Plus中IdType.AUTO局部配置不生效的问题解决

    Mybatis-Plus中IdType.AUTO局部配置不生效的问题解决

    本文主要介绍了Mybatis-Plus中IdType.AUTO局部配置不生效的问题解决,数据库插入数据时,id的默认生成方式还是雪花算法,局部配置没有生效,下面就来解决一下,感兴趣的可以了解一下
    2023-09-09
  • 浅谈UUID生成的原理及优缺点

    浅谈UUID生成的原理及优缺点

    UUID是一套用于生成全局唯一标识符的标准,也被称为GUID (Globally Unique Identifier),通过使用UUID可以在分布式系统中生成唯一的 ID,UUID的生成方式有多种,本文将详细讲解 UUID 的生成原理、特性、实用场景以及优缺点
    2023-06-06
  • 带你重新认识Java动态代理

    带你重新认识Java动态代理

    这篇文章主要为大家介绍了Java的动态代理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 过滤器 和 拦截器的 6个区别(别再傻傻分不清了)

    过滤器 和 拦截器的 6个区别(别再傻傻分不清了)

    这篇文章主要介绍了过滤器 和 拦截器的 6个区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • IntelliJ IDEA 统一设置编码为utf-8编码的实现

    IntelliJ IDEA 统一设置编码为utf-8编码的实现

    这篇文章主要介绍了IntelliJ IDEA 统一设置编码为utf-8编码的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-06-06
  • Java冒泡排序及优化介绍

    Java冒泡排序及优化介绍

    大家好,本篇文章主要讲的是Java冒泡排序及优化介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Spring Boot深入排查 java.lang.ArrayStoreException异常

    Spring Boot深入排查 java.lang.ArrayStoreException异常

    这篇文章介绍了Spring Boot深入排查 java.lang.ArrayStoreException异常,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论