zoukankan      html  css  js  c++  java
  • Java调用远程Shell脚本(待验证)

    最近,需要开发一个Web管理系统,通过Web控制来执行远程Linux主机上的服务脚本,参考了http://blog.csdn.net/sheismylife/archive/2009/11/17/4823696.aspx使用的一个小工具,确实很好地解决了这个问题,做个记录,以供查阅。

    这个小工具打成一个jar文件:ganymed-ssh2-build210.jar,可以在http://www.ganymed.ethz.ch/ssh2/处下载。该工具是基于SSH2协议的实现,在使用它的过程中非常容易,只需要指定合法的用户名口令,或者授权认证文件,就可以创建到远程Linux主机的连接,在建立起来的会话中调用该Linux主机上的脚本文件,执行相关操作。

    下面是我基于ganymed-ssh2-build210.jar库,写的一个Demo,代码如下所示:

    package org.shirdrn.shell;


    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.charset.Charset;

    import ch.ethz.ssh2.Connection;
    import ch.ethz.ssh2.Session;

    /**
    * 远程Shell脚本执行工具
    *
    * @author Administrator
    */
    public class RemoteShellTool {

    private Connection conn;
    private String ipAddr;
    private String charset = Charset.defaultCharset().toString();
    private String userName;
    private String password;

    public RemoteShellTool(String ipAddr, String userName, String password, String charset) {
       this.ipAddr = ipAddr;
       this.userName = userName;
       this.password = password;
       if(charset != null) {
        this.charset = charset;
       }
    }
    /**
    * 登录远程Linux主机
    *
    * @return
    * @throws IOException
    */
    public boolean login() throws IOException {
       conn = new Connection(ipAddr);
       conn.connect(); // 连接
       return conn.authenticateWithPassword(userName, password); // 认证
    }


    /**
    * 执行Shell脚本或命令
    *
    * @param cmds 命令行序列
    * @return
    */
    public String exec(String cmds) {
       InputStream in = null;
       String result = "";
       try {
        if (this.login()) {
         Session session = conn.openSession(); // 打开一个会话
         session.execCommand(cmds);
         in = session.getStdout();
         result = this.processStdout(in, this.charset);
         conn.close();
        }
       } catch (IOException e1) {
        e1.printStackTrace();
       }
       return result;
    }

    /**
    * 解析流获取字符串信息
    *
    * @param in 输入流对象
    * @param charset 字符集
    * @return
    */
    public String processStdout(InputStream in, String charset) {
       byte[] buf = new byte[1024];
       StringBuffer sb = new StringBuffer();
       try {
        while (in.read(buf) != -1) {
         sb.append(new String(buf, charset));
        }
       } catch (IOException e) {
        e.printStackTrace();
       }
       return sb.toString();
    }
    }

    需要说明的一点是,执行脚本以后,可以获取脚本执行的结果文本,需要对这些文本进行正确编码后返回给客户端(我们的Web管理控制台),才能看到实际脚本执行的结果。

    另外,当执行login方法时,登录成功,位于当前的***.***.***.***:/home/username/目录之下,你可以指定脚本文件所在的绝对路径,或者通过cd导航到脚本文件所在的目录,然后传递执行脚本所需要的参数,完成脚本调用执行。

    http://hi.baidu.com/shirdrn/blog/item/59223b129a7322c5c3fd78a9.html

  • 相关阅读:
    c++跨平台技术学习(一)--使用公共的代码
    软件项目将死的27个征兆
    Java中的方法重载应用
    Java成员变量的初始化和在內存中的运行机制
    Java源文件结构和Java常用包
    细说Java访问控制符
    构造函数与this
    linux基础学习-6.3-DNS的配置文件
    linux基础学习-6.2-网卡配置文件
    linux基础学习-6.1-目录结构的特点
  • 原文地址:https://www.cnblogs.com/chinacloud/p/1917864.html
Copyright © 2011-2022 走看看