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

运行近程主机上的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/shecho "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 zimugexit-status: 0

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

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

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

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

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