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

作者:字母哥博客 时间:2023-11-24 12:35:58 

运行远程主机上的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

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

来源:https://www.cnblogs.com/zimug/archive/2020/08/07/13450493.html

标签:JAVA,JSCH,Linux,shell,脚本
0
投稿

猜你喜欢

  • 网易Java程序员两轮面试 请问你能答对几个?

    2023-11-29 10:32:08
  • C# WinForm状态栏实时显示当前时间(窗体状态栏StatusStrip示例)

    2022-10-09 16:58:51
  • DrawerLayout的简单使用及侧滑菜单实现详解

    2023-04-27 04:10:59
  • SpringBoot @CompentScan excludeFilters配置无效的解决方案

    2022-08-01 09:06:42
  • Java HashMap的工作原理

    2022-12-25 14:39:02
  • Android 4.0 设置全屏修改的解决方法

    2022-11-24 17:08:12
  • android开发教程之间隔执行程序(android计时器)

    2023-11-29 22:43:51
  • C# 使用multipart form-data方式post数据到服务器

    2023-12-20 21:10:58
  • JavaWeb中的常用的请求传参注解说明

    2023-06-19 03:12:06
  • Java设计模式之装饰模式详解

    2022-09-27 05:55:32
  • C语言算法积累加tag的循环队列

    2022-09-21 16:05:30
  • springBoot项目中使用@Value取值出现的问题及解决

    2023-05-29 12:59:16
  • C#byte数组传入C操作方法

    2021-11-06 12:30:18
  • 一篇文章带你了解Java SpringMVC返回null

    2023-11-24 15:18:03
  • Android的Fragment的生命周期各状态和回调函数使用

    2022-12-10 17:44:34
  • Java获取Process子进程进程ID方法详解

    2022-09-01 13:21:08
  • Java基础之反射

    2021-12-20 17:20:20
  • Redis监听过期的key实现流程详解

    2023-12-12 02:41:28
  • 在IDEA中maven配置MyBatis的流程详解

    2021-08-26 17:02:27
  • Java8中的Stream 流实践操作

    2021-11-01 19:59:33
  • asp之家 软件编程 m.aspxhome.com