专栏首页服务化进程远程采集服务器指标信息(二)通过telnet执行远程命令

远程采集服务器指标信息(二)通过telnet执行远程命令

远程采集服务器信息,比如说磁盘信息、内存信息。

现介绍java通过telnet执行命令采集服务器信息,比如说执行df、ls、top。

这里在linux环境通过root或者其他用户登录执行解析方式有点出入,下面是代码

/**
 * Telnet远程会话
 * 
 */
public class TelnetSession implements IRemoteSession {
    
    private TelnetClient telnet = new TelnetClient("VT220");
    
    private InputStream in;
    
    private NodeInfoVO nodeInfoVO;
    
    private PrintStream out;
    
    private char prompt = '$';// 普通用户结束
    
    /**
     * 
     * 构造函数
     * @param serverBean
     */
    public TelnetSession(NodeInfoVO nodeInfoVO) {
        try {
            telnet.connect(nodeInfoVO.getServerIp(), DeviceConstants.TELNET_DEFAULT_PORT);
            in = telnet.getInputStream();
            out = new PrintStream(telnet.getOutputStream());
            // 根据root用户设置结束符
            this.prompt = nodeInfoVO.getServerUserName().equals("root") ? '#' : '>';
            login(nodeInfoVO.getServerUserName(), nodeInfoVO.getServerPassword());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * @return 获取 serverBean属性值
     */
    public NodeInfoVO getNodeInfoVO() {
        return nodeInfoVO;
    }
    
    /**
     * 登录
     * 
     * @param user
     * @param password
     */
    public void login(String user, String password) {
        readUntil("login:");
        write(user);
        readUntil("assword:");
        write(password);
        readUntil(prompt + "");
    }
    
    /**
     * 读取分析结果
     * 
     * @param pattern
     * @return
     */
    public String readUntil(String pattern) {
        try {
            char lastChar = pattern.charAt(pattern.length() - 1);
            StringBuffer sb = new StringBuffer();
            char ch = (char) in.read();
            while (true) {
                sb.append(ch);
                if (ch == lastChar) {
                    if (sb.toString().endsWith(pattern)) {
                        byte[] temp = sb.toString().getBytes("iso8859-1");
                        return new String(temp, "GBK");
                    }
                }
                ch = (char) in.read();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 读取分析结果
     * 
     * @param pattern
     * @return
     */
    public String readResultUntil(String pattern) {
        BufferedReader inputStream = null;
        try {
            // char lastChar = pattern.charAt(pattern.length() - 1);
            // StringBuffer sb = new StringBuffer();
            // Thread.sleep(1000);
            // final Scanner sc = new Scanner(in, "iso8859-1");
            //            
            // while (sc.hasNextLine()) {
            // String ss=sc.nextLine();
            // if(ss.contains("mmc")){
            // System.out.println("---------");
            // //return null;
            // }
            // byte[] temp = ss.toString().getBytes("iso8859-1");
            // System.out.println(new String(temp, "GBK"));
            // }
            //            
            // sc.close();
            inputStream = new BufferedReader(new InputStreamReader(in));
            String line = inputStream.readLine();
            while (inputStream.ready()) {
                System.out.println(line);
                line = inputStream.readLine();
            }
            inputStream.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null)
                    inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    
    /**
     * 写操作
     * 
     * @param value
     */
    public void write(String value) {
        try {
            out.println(value);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 向目标发送命令字符串
     * 
     * @param command
     * @return
     */
    public String execCommand(String command) {
        try {
            write(command);
            return readUntil(prompt + "");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 关闭连接
     */
    @Override
    public void close() {
        IOUtils.closeQuietly(in);
        IOUtils.closeQuietly(out);
        try {
            telnet.disconnect();
        } catch (Exception e) {
            telnet = null;
        } finally {
            telnet = null;
        }
    }
    
    public static void main(String[] args) {
//        TelnetSession she = null;
//        try {
//            she = new TelnetSession(new ServerBean("10.10.5.183", 23, "comtop", "comtophello"));
//            System.out.println(she.execCommand("wmic path win32_operatingsystem get  TotalVisibleMemorySize,"
//                + "TotalVirtualMemorySize ,FreePhysicalMemory,FreeVirtualMemory"));
//        } catch (Exception e) {
//            she.disconnect();
//        } finally {
//            she.disconnect();
//        }
    }


}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • dubbo序列化问题(三)子类覆盖父类字段hession反序列化获取不到

    在进行dubbo开发中遇到一个问题,当是用hession2进行序列化时,子类和父类有相同的字段时,hession2反序列化获取不到该字段数据,如下:

    一笠风雨任生平
  • 将整个工程的GBK转为utf-8格式

    eclipse将整个工程转为utf-8时原先中文注释会变为乱码,13年时写了个脚本将整个文件的java以及配置文件转为utf-8格式,下面是代码

    一笠风雨任生平
  • dubbo序列化问题(一)浮点数问题

    dubbo是一个分布式服务框架,在国内比较常用,在开发过程中遇到一个浮点数反序列化问题。

    一笠风雨任生平
  • SpringMVC请求参数和响应结果全局加密和解密

    前段时间在做一个对外的网关项目,涉及到加密和解密模块,这里详细分析解决方案和适用的场景。为了模拟真实的交互场景,先定制一下整个交互流程。第三方传输(包括请求和响...

    Throwable
  • Java编程思想第五版(On Java8)(十二)-集合

    通常,程序总是根据运行时才知道的某些条件去创建新的对象。在此之前,无法知道所需对象的数量甚至确切类型。为了解决这个普遍的编程问题,需要在任意时刻和任意位置创建任...

    JavaEdge
  • 13.json解析

    六月的雨
  • 第八节:详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架

    大家好,我是 Vic,今天给大家带来详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架的概述,希望你们喜欢

    达达前端
  • Java企业微信开发_04_消息推送之发送消息(主动)

    (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息。而被动回复消息是 用户发送消息之后,微信服务器将消息传递给 第三方服务器,第三方服务器接收...

    shirayner
  • GreenDao 工具类 --- 使用 Json 快速生成 Bean、表及其结构,"炒鸡"快!

    作者:林冠宏 / 指尖下的幽灵 腾讯云+社区:https://cloud.tencent.com/developer/user/1148436/activi...

    林冠宏-指尖下的幽灵
  • 2019Java面试代码与编程题

    代码与编程题 135、写一个Singleton出来 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 一般Si...

    葆宁

扫码关注云+社区

领取腾讯云代金券