`
征途2010
  • 浏览: 247597 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

远程采集服务器指标信息(二)通过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();
//        }
    }


}

 

分享到:
评论
1 楼 joinmition 2017-12-28  
兄弟,问一下,这个从服务器返回数据的时候老是阻塞怎么解决?

相关推荐

    java远程进行telnet,ftp,ssh连接的方法及源代码.rar

    例如,你可以编写一个Java程序定期通过ssh登录服务器检查运行状态,通过ftp同步远程文件,或者通过telnet进行设备的简单控制。 总的来说,这个资源包为你提供了一个很好的起点,通过学习和理解这些代码,你将能够...

    MFC单文档的telnet数据采集程序

    telnet,另一方面,是一种网络协议,允许用户远程登录到另一台计算机上,执行命令或访问服务。在数据采集程序中,telnet可能被用来连接到电力系统设备或服务器,收集实时数据或者控制设备状态。通过telnet,程序可以...

    电子-34以太网触摸屏STM32F107ETHLCD神舟IV号Telnet远程登录V1.1.rar

    Telnet协议是一种远程终端协议,允许用户通过网络连接到另一台设备并执行命令。在本项目中,STM32F107通过TCP/IP协议栈实现了服务器端的Telnet服务,用户可以通过任意支持Telnet的客户端工具,如Windows命令行的...

    TELNET协议

    - 成功登录后,用户可以通过客户端输入命令,这些命令会被发送到服务器执行。 - 服务器执行命令后,将结果返回给客户端显示。 #### 三、TELNET协议的技术特点 ##### 3.1 协议结构 - TELNET采用客户机/服务器模型。...

    电信设备-信息采集的方法、客户端及系统.zip

    客户端允许管理员远程访问设备,执行命令获取信息,或者配置自动化的数据收集任务。此外,客户端还可以集成各种API(应用程序接口)和SDK(软件开发工具包),以实现与设备的深度交互,获取更精细的数据。 系统层面...

    关于路由器IP数据包统计的流量数据采集方法.pdf

    - **Telnet程序**:使用Telnet远程登录路由器,可以执行命令获取实时或历史的流量数据。 路由器作为网络数据传输的瓶颈,所有进出局域网的流量都要经过路由器,因此利用路由器进行数据包统计,可以高效地监控和...

    串口服务器配置手册.pdf

    - **远程数据采集**: 在工业自动化领域,串口服务器可以用于远程采集设备的数据,并将这些数据发送到中央控制中心进行分析和处理。 - **设备联网**: 可以将不具备网络功能的传统设备连接到互联网上,实现远程监控和...

    远程监控方案.docx

    用户可以通过SNMP、Telnet、Web浏览器或者IP Power Pro软件进行网络管理,特别是通过内置的Web服务器功能,可以在任何操作系统平台上通过Web浏览器进行实时状态查询、基本信息管理、参数设置、用户管理和历史资料...

    网络信息采集试题实用.pdf

    2. **互联网信息查询工具**:Gopher 是一种基于菜单驱动的查询工具,允许用户实时访问互联网上的远程联机信息系统。其他选项如 Listserv 是邮件列表服务,WAIS 是宽领域信息系统,FTP 是文件传输协议。 3. **音频...

    网络信息采集试题借鉴.pdf

    2. Telnet是一种菜单驱动的互联网信息查询工具,允许用户实时访问远程联机信息系统。其他选项中,Listserv是邮件列表服务,Gopher是信息检索系统,WAIS是广义信息检索服务,FTP是文件传输协议。 3. 音频文件格式...

    路由器的新发展——数据流量采集.pdf

    二是直接利用路由器内置的流量统计功能,如Show Ip Accounting命令、SNMP协议和Telnet程序,这些工具可以提供准确的流量数据分析。 基于路由器的IP数据包统计是一种高效的数据采集方式。SNMP(简单网络管理协议)...

    网络信息采集试题.doc

    7. 网络信息资源采集的形式标准:包括资源的组织及利用方式、资源内容覆盖面大小,而不包括查准率、查全率、检索速度和收录范围,这些是评价搜索引擎性能的指标。 8. 元搜索引擎:元搜索引擎整合、调用并优化多个...

    基于SVM的Telnet隐蔽信道检测1

    在这种情况下,特定的关注点是基于Telnet的隐蔽信道,它通过将隐匿的消息附加在Telnet网络数据包中,然后发送到远程服务器,以此进行秘密通信。 由于键盘输入的任意性,检测这种隐蔽信道变得非常复杂。用户可以随意...

    RS232RS485串口服务器技术配置手册

    - **串口服务器配对应用**:例如通过一对串口服务器实现远程设备间的通信连接。 - **端口性能及参数**:针对不同型号的RS232/RS485服务器,详细介绍了其端口的电气特性、最大传输距离等。 - **硬件连接**:提供了...

    以太网串口服务器ESP904的特性及其在ROV上的应用

    这款服务器由美国B&B公司开发,适用于各种工业自动化、数据采集和远程监控场景。 ESP904的主要特性包括: 1. 强大的适应性:ESP904支持TCP服务器、TCP客户端、UDP以及虚拟COM和配对模式,能够灵活应对不同网络通信...

    信息系统自动监控技术研究

    对于UNIX系统,则通过TELNET协议登录并执行命令获取相关信息。 - **备份文件检查**:定期检查备份文件的存在性、大小和创建时间,确保备份有效。 - **系统日志监控**:利用.NET框架中的`EventLog`对象监测系统日志,...

    MC3000客户端wavelink

    总的来说,MC3000客户端Wavelink的升级是提升Symbol MC3000数据采集器效能和安全性的重要手段,通过优化的telnet客户端功能,用户可以更高效地执行远程任务,同时享受到更好的用户体验和增强的安全保障。

    音视频服务器多协议接入平台研究.pdf

    SDP实现的TEXT文本解析模块注册平台规范的操作接口,通过不同的文件夹代表不同的平台规范,使得telnet客户端可以根据选择执行相应的接口。 总的来说,音视频服务器多协议接入平台的研究旨在提高服务器的灵活性、可...

Global site tag (gtag.js) - Google Analytics