Java-web项目如何远程调用shell脚本

小组聊天灌水 小组聊天灌水 主题:993 回复:2175

Java-web项目如何远程调用shell脚本

虐人心 发布于 2017-01-04 字数 102 浏览 1202 回复 3

如题,A服务器上运行的web项目如何去远程调用B服务器上的上的shell脚本?比如
/opt/test/test.sh

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

泛泛之交 2017-07-22 3 楼

我在openwrt环境下做的实验:这里的openwrt就相当于你问题中的B端

openwrt上部署有uhttpd服务器,web目录为/www/cgi-bin,我将测试的脚本hello.sh放到web目录下,在远端浏览器中输入:http://192.168.1.1/cgi-bin/hello.sh就可以执行该脚本
执行不是出于web目录下的脚本,就需要根据“龙觉忠”同学的方法了。我使用的是通过php编写接口来调用各个目录的脚本文件。

夜无邪 2017-03-12 2 楼

可以使用ssh方式调用远程服务器的shell脚本,
下边是从网上找的一个类:

/* //**

  • 远程执行shell脚本类

  • @author l
    */
    public class RmtShellExecutor {

    / *//* /
    private Connection conn;
    /
    *// 远程机器IP */
    private String ip;
    /* //
    用户名 */
    private String usr;
    /* //* 密码 /
    private String psword;
    private String charset = Charset.defaultCharset().toString();

    private static final int TIME_OUT = 1000 5 60;

    /* //**

    • 构造函数
    • @param param 传入参数Bean 一些属性的getter setter 实现略
      */
      public RmtShellExecutor(ShellParam param) {
      this.ip = param.getIp();
      this.usr = param.getUsername();
      this.psword = param.getPassword();
      }

    /* //**

    • 构造函数
    • @param ip
    • @param usr
    • @param ps
      */
      public RmtShellExecutor(String ip, String usr, String ps) {
      this.ip = ip;
      this.usr = usr;
      this.psword = ps;
      }

    /* //**

    • 登录
    • @return
    • @throws IOException
      */
      private boolean login() throws IOException {
      conn = new Connection(ip);
      conn.connect();
      return conn.authenticateWithPassword(usr, psword);
      }

    /* //**

    • 执行脚本

    • @param cmds

    • @return

    • @throws Exception
      */
      public int exec(String cmds) throws Exception {
      InputStream stdOut = null;
      InputStream stdErr = null;
      String outStr = "";
      String outErr = "";
      int ret = -1;
      try {
      if (login()) {
      // Open a new {@link Session} on this connection
      Session session = conn.openSession();
      // Execute a command on the remote machine.
      session.execCommand(cmds);

            stdOut = new StreamGobbler(session.getStdout());
            outStr = processStream(stdOut, charset);
      
            stdErr = new StreamGobbler(session.getStderr());
            outErr = processStream(stdErr, charset);
      
            session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
      
            System.out.println("outStr=" + outStr);
            System.out.println("outErr=" + outErr);
      
            ret = session.getExitStatus();
        } else {
            throw new AppException("登录远程机器失败" + ip); // 自定义异常类 实现略
        }

      } finally {
      if (conn != null) {
      conn.close();
      }
      IOUtils.closeQuietly(stdOut);
      IOUtils.closeQuietly(stdErr);
      }
      return ret;
      }

    /* //**

    • @param in
    • @param charset
    • @return
    • @throws IOException
    • @throws UnsupportedEncodingException
      */
      private String processStream(InputStream in, String charset) throws Exception {
      byte[] buf = new byte[1024];
      StringBuilder sb = new StringBuilder();
      while (in.read(buf) != -1) {
      sb.append(new String(buf, charset));
      }
      return sb.toString();
      }

    public static void main(String args[]) throws Exception {
    RmtShellExecutor exe = new RmtShellExecutor("...", "sshapp", "sshapp");
    // 执行myTest.sh 参数为java Know dummy
    System.out.println(exe.exec("sh /webapp/myshell/myTest.sh java Know dummy"));
    // exe.exec("uname -a && date && uptime && who");
    }
    }

原文:http://www.pin5i.com/showtopic-java-ssh-shell.html

归属感 2017-01-08 1 楼

方法1:如果B服务器也有WEB环境,可以在B服务器写接口供A调用,根据传递的参数信息取执行相应的shell脚本,当然必须要有权限。
方法2:可以在B服务器写一个守护进程监听某一端口,A在执行脚本时发消息到B服务器的该端口;程序根据请求信息执行相应的脚本。(可以考虑NodeJs来进行端口监听)