关于spring:通过java程序JSch运行远程linux主机上的shell脚本

2次阅读

共计 2632 个字符,预计需要花费 7 分钟才能阅读完成。

如果您看完文章之后,感觉对您有帮忙,请帮我点个赞,您的反对是我不竭的创作能源!
如果您看完文章之后,感觉对您有帮忙,请帮我点个赞,您的反对是我不竭的创作能源!
如果您看完文章之后,感觉对您有帮忙,请帮我点个赞,您的反对是我不竭的创作能源!

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

当然,我只是为大家演示这样一个例子,下面的代码能够通过更好的封装,从而提供更简略的应用形式。

欢送关注我的博客,外面有很多精品合集

  • 本文转载注明出处(必须带连贯,不能只转文字):字母哥博客。

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学 Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2 一本通》
  • 《实战前后端拆散 RBAC 权限管理系统》
  • 《实战 SpringCloud 微服务从青铜到王者》
  • 《VUE 深入浅出系列》
正文完
 0