`

【转】java Telnet 监控磁盘信息

    博客分类:
  • J2EE
 
阅读更多

    题记:

        最近弄一个视频有关的项目,有很多的视频存储,所以存储这块就有必要进行一些监控,及内容淘汰等策略。存储设备都是分布式部署的,我们不希望在 server上安装特别的插件,如何获取远程磁盘信息,成了我最大的障碍。目前采用的方式是java建立telnet连接,发送操作系统命令,解析返回信 息,在此整理下。

 

摘要:

         这是我第一次接触到java获取远程操作系统信息的工作,刚拿到需求有点两眼一抹黑,百度、Google的不少资料。总结起来大概三种类型:

        1:Apache的commons.io中有一个工具类方法:FileSystemUtils.freeSpaceKb(path),可以通过共享目录方式获取磁盘剩余信息。

        2:JConfig拓展工具,调用系统底层命令,获取磁盘信息。参考资料:http://huangyunzeng.iteye.com/blog/1142873

        3:使用jni技术,这个是解决所有和os相关的操作的万能利器了。这个没深入研究过,不会,在此就不多提了。

        在看到Apache的FileSystemUtils的时候,在本机测试了下,有点激动了。不过很快发现,这只能获取本地磁盘信息,要获取远程磁盘信息只 能建立共享目录。这显然不能满足我们的要求,不过正是FileSystemUtils工具包的实现原理给了我启发:调用操作系统命令,然后解析,获取信息 是一种不错的方式。

[java] view plain copy
  1. Runtime.getRuntime().exec(String command)  //启动进程执行操作系统命令   

 

         现在的问题就变成:建立远程连接,调用操作系统命令,然后解析返回值。我只要找到一种建立连接的方式就能完成任务了。顺着这个思路,后来选择了Telnet,理由如下:

         a:Apache中收录了Telnet. org.apache.commons.net.telnet.TelnetClient,可以直接使用Client,不用再考虑socket Server端的实现等。
         b:系统中一般都已自带了telnet,只需启动telnet服务就好,不用安装其他的插件。

         c:为不用更安全的SSH协议建立连接呢?因为我程序中需要识别操作系统类型。telnet在建立连接后,有一个头信息,根据这个头信息能基本判断是 Window,还是Linux。而换成SSH后,建立连接就不能这么方便的获取操作系统类型了。在此,我就暂时恶心一下,用Telnet吧。

 

正文:

一、telnet暨磁盘监控原理简介

二、分享部分实现代码

 

一、telnet暨磁盘监控原理简介

        如果你仔细阅读了摘要的内容,相信已经明了本文telnet远程监控磁盘信息的大概原理了。在此再提一遍,是为了补充一些更细节的内容。

二:部分实现代码:

1:成员变量及构造方法

[java]  
  1. private  TelnetClient telnet =  new  TelnetClient( "VT220" );  //"VT220" 为处理windows下的乱码问题   
[java]  
  1. private  InputStream in;  
  2.   
  3. private  PrintStream out;  
  4.   
  5. private   char  prompt =  "$"   //普通用户结束   
[java]  
  1. private   int  os = - 1 //操作系统类型   

 

[java]  
  1. public  TelnetShell(String ip,  int  port, String user, String password)  
  2.         throws  SocketException, IOException {  
  3.     telnet.connect(ip, port);  
  4.     in = telnet.getInputStream();  
  5.     out = new  PrintStream(telnet.getOutputStream());  
  6.     // 根据root用户设置结束符   
  7.     this .prompt = user.equals( "root" ) ?  '#'  :  '>' ;  
  8.     login(user, password);  
  9. }  


建立连接:

[java]  
  1. /**  
  2.  * 建立telnet连接  
  3.  *   
  4.  * <p>  
  5.  * 根据telnet 头信息识别操作系统类型,并处理连接异常  
  6.  *   
  7.  * @param user  
  8.  * @param password  
  9.  */   
  10. public   void  login(String user, String password)  throws  SocketException {  
  11.     String thead = readUntil("login:" );  
  12.     setOsType(thead); // 根据telnet 头信息获取操作系统类别   
  13.     write(user);  
  14.     readUntil("password:" );  
  15.     write(password);  
  16.   
  17.     // 处理连接异常   
  18.     boolean  loginSuccess = judgeLogin();  
  19.     System.out.println("loginSuccess or not ? "  + loginSuccess);  
  20.     if  (loginSuccess) {  
  21.         readUntil(prompt + "" );  
  22.     } else  {  
  23.         throw   new  SocketException( "Login Failed..." );  
  24.     }  
  25. }  


读/写操作

[java]  
  1. /**  
  2.  * 读取分析结果   
  3.  *   
  4.  * <p>  
  5.  * “pattern” 指明IO读取的结束位置  
  6.  * <p>  
  7.  * 为避免Windows返回中“<dir>”的干扰  
  8.  *   
  9.  * @param pattern  
  10.  * @return  
  11.  */   
  12. public  String readUntil(String pattern) {  
  13.     try  {  
  14.         char  lastChar = pattern.charAt(pattern.length() -  1 );  
  15.         StringBuffer sb = new  StringBuffer();  
  16.         char  ch = ( char ) in.read();  
  17.   
  18.         System.out.print(ch);  
  19.         while  (ch != - 1 ) {  
  20.             sb.append(ch);  
  21.             if  (ch == lastChar) {  
  22.                 if  (sb.toString().toLowerCase().endsWith(pattern)) {  
  23.                     // 避免windows下因捕获‘>’中断   
  24.                     if  (!sb.toString().toLowerCase().endsWith( "<dir>" )) {  
  25.                         System.out.println("提取完毕" );  
  26.                         return  sb.toString();  
  27.                     }  
  28.                 }  
  29.             }  
  30.   
  31.             ch = (char ) in.read();  
  32.             System.out.print(ch);  
  33.         }  
  34.     } catch  (Exception e) {  
  35.         e.printStackTrace();  
  36.     }  
  37.     return   null ;  
  38. }  

 

[java]
  1. /**  
  2.  * 写操作  
  3.  *   
  4.  * @param value  
  5.  */   
  6. public   void  write(String value) {  
  7.     try  {  
  8.         out.println(value);  
  9.         out.flush();  
  10.     } catch  (Exception e) {  
  11.         e.printStackTrace();  
  12.     }  
  13. }  


识别系统类型,执行命令

[java]  
  1. /**  
  2.  * 设置操作系统类型  
  3.  *   
  4.  * @param telnetHeadInfo  
  5.  */   
  6. public   void  setOsType(String telnetHeadInfo) {  
  7.     if  ( null  == telnetHeadInfo ||  "" .equals(telnetHeadInfo))  
  8.         return ;  
  9.   
  10.     if  (telnetHeadInfo.indexOf( "Microsoft" ) != - 1 ) {  
  11.         os = 1 ;  
  12.     } else   if  (telnetHeadInfo.indexOf( "Kernel" ) != - 1 ) {  
  13.         os = 2 // x-nix   
  14.     } else   
  15.         os = 3 ;  
  16. }  

 

[java]  
  1. /**  
  2.  * 向目标发送命令字符串  
  3.  *   
  4.  * @param command  
  5.  * @return  
  6.  */   
  7. public  String sendCommand(String command) {  
  8.     try  {  
  9.         write(command);  
  10.         return  readUntil(prompt +  "" );  
  11.     } catch  (Exception e) {  
  12.         e.printStackTrace();  
  13.     }  
  14.     return   null ;  
  15. }  


关闭连接

[java]  
  1. /**  
  2.  * 关闭连接  
  3.  */   
  4. public   void  disconnect() {  
  5.     try  {  
  6.         telnet.disconnect();  
  7.     } catch  (Exception e) {  
  8.         e.printStackTrace();  
  9.     }  
  10. }  


这样,建立连接、识别操作系统,执行命令,读取返回等都基本完成了。可以说Telnet远程获取操作系统信息的大部分代码已经完成。当然,在提供外层封装上,你也可以仿照Apache的FileSystemUtils写一个工具类,采用一些工厂类的模式方便调用,拓展。

 

最后,可能您已经发现了,本文的标题是要监控“磁盘信息”,但我完全可以获取跟多信息。有了这个telnetShell.java后,我完全可以发送其他系统命令,获取更多信息。这就看你怎么发挥了,呵呵。

分享到:
评论

相关推荐

    阿里监控工具阿里监控工具

    在性能监控方面,阿里监控工具能够深入到操作系统、数据库、网络等多个层次,实时监测CPU使用率、内存占用、磁盘I/O、网络流量等关键指标。通过对这些指标的持续监控,可以及时发现并预警潜在的性能瓶颈,避免系统...

    wgcloud监控系统v3.2.9操作手册

    该系统提供了丰富的核心监控功能,包括但不限于主机监控、ES状态监控、CPU/温度监控、内存监控、主机硬件信息监控、数据监控、服务心跳检测、应用进程管理、磁盘空间和IO监控、系统负载监控、自动网络拓扑图、端口...

    JAVA上百实例源码以及开源项目源代码

    Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 ...

    wgcloud-v3.3.0操作说明手册

    WGCloud的主要监控模块包括主机监控、ES状态监控、CPU与温度监控、内存监控、主机硬件信息、数据监控、服务心跳检测、应用进程管理、磁盘空间和IO监控、系统负载监控、自动网络拓扑图、端口监控、日志文件监控以及...

    Linux命令查看java版本

    8. **Java版本查询**:`java -version`命令用于显示当前环境中Java的版本信息。 9. **系统重启**:`reboot`命令用于重启Linux系统。 10. **网络配置**: - `netstat -lp`:显示所有正在监听的网络端口。 - `...

    wgcloud-v3.2.6系统使用说明文档pdf

    wgcloud-v3.2.6是一款基于Java和Go语言开发的微服务架构分布式监控系统,主要用于运维自动化,提供丰富的监控和告警功能。接下来,我们将详细解读wgcloud-v3.2.6系统的核心特点及主要功能。 核心特点: 1. 轻量级...

    zabbix学习文档

    - **zabbix_java_gateway**:用于Java应用的监控。 - **zabbix_web**:前端界面,提供图形化的操作界面。 #### 二、Zabbix 安装与配置 **Zabbix 软硬件需求:** - **操作系统**:支持多种Linux发行版、Windows等。...

    服务器指标要求(2021整理).docx

    - **可管理性**:通过TELNET、WEB、SNMP等方式进行远程监控和管理。 ### 软件环境要求 - **BEA Weblogic Server 8.1 Premium Edition**:提供高性能的企业级Java应用服务器。 - **BEA Tuxedo 8.1 Edition**:用于...

    Linux.docx

    - `jconsole`或`jvisualvm`提供图形化界面,监控Java应用的性能和内存状况。 - `gc.log`日志分析垃圾回收情况。 4. **Linux启动流程**: - Linux系统启动涉及BIOS自检、加载引导程序、内核加载、初始化进程和...

    IT运维管理基础知识PPT学习教案.pptx

    这些软件通常支持多种协议来获取系统数据,例如SNMP(简单网络管理协议)、RMON(远程网络监控)、Syslog(系统日志)、Event(事件通知)、Telnet、SSH(安全外壳协议)、ODBC(开放数据库连接)、JDBC(Java数据库...

    Windows安装ELK步骤.doc

    4. Nxlog:在Windows上替代Logstash监控磁盘文件的工具。 5. Kafka:可选的,用于实现Logstash与其它系统之间的高效数据传输。 ### 安装步骤 **1. 安装Java** ELK栈依赖于Java运行环境,因此首先需要下载并安装...

    Zabbix4.0的中文用户手册

    2. **服务器性能监控方案:** 关注CPU、内存、磁盘等指标。 3. **数据库监控方案:** 监控数据库性能指标,如查询响应时间等。 #### 十二、性能调优 **12.1 调优策略** - **数据库优化:** 定期清理过期数据,...

    linux必学的60个命令

    从给定的文件信息中,我们可以提炼出一系列与Linux系统操作相关的60个核心命令的知识点,这些命令是学习和掌握Linux系统基础的关键。以下是对这些命令的详细解析: 1. **登录与用户管理** - `login`: 用户登录到...

    计算机常用软件实用全套PPT.ppt

    邮件检测、邮件处理、网页制作、网页辅助、 网站推广、FTP 工具、下载工具、网络共享、网络加速、搜索引擎、远程监控、新闻阅读、IP 工具、服务器工具、网络监测、网络辅助、文件共享、Telnet工具、信息发布等。...

    SUN发展简史和命令的用法pdf

    - **telnet**:远程登录服务。 - **IO重定向**:输入输出重定向,例如通过`&gt;`或`&gt;&gt;`将命令输出重定向到文件。 #### 第二部分 SUN系统管理 ##### 用户管理 用户管理包括用户账户的创建、删除、权限管理等。 - **...

    memcached-1.2.5.tar.gz

    它将数据存储在内存中,通过网络进行访问,避免了磁盘I/O操作,显著提高了数据读取速度。memcached支持多线程,可以充分利用多核处理器的性能。 二、memcached-1.2.5的安装与配置 1. 安装:在Linux环境下,首先...

    TongWeb应用系统慢是怎么个慢.doc

    - **资源监控**:检查CPU、内存、磁盘I/O、网络带宽等资源使用情况,看是否存在瓶颈。 - **线程分析**:通过JStack或类似工具分析Java进程的线程状态,找出可能的阻塞点。 - **日志分析**:查看TongWeb的日志,寻找...

    Linux考试题.pdf

    在控制和监控网络方面,系统管理员需要掌握静态路由设定,当网络拓扑变化时,需手动修改路由设置。在Linux系统安装时,必须创建文件系统分区和交换分区,后者用作系统虚拟内存。 Shell程序在执行前需赋予执行权限,...

    Linux命令培训指南

    对于监控磁盘空间非常重要。 3. **`du`**:报告每个文件和目录的磁盘使用情况。用于检查哪些文件或目录占用了大量空间。 4. **`mkdir`**:创建新的目录。是文件系统管理的基本操作。 5. **`pwd`**:显示当前工作目录...

Global site tag (gtag.js) - Google Analytics