iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >java实现服务器巡查的代码
  • 625
分享到

java实现服务器巡查的代码

2024-04-02 19:04:59 625人浏览 独家记忆
摘要

目录需求批量ping1.jdk1.5的InetAddresss方式2.最简单的办法,直接调用CMD3.Java调用shell执行ping命令批量ssh检查需求:依赖引入工具封装密码核

需求

用户,给了一大批服务器,需要检查服务器能否ping通,ssh密码是否正常,以及检查服务器的cpu,内存,硬盘占用情况。一个个检查肯定不现实,于是希望通过代码实现。

批量ping

1.Jdk1.5的InetAddresss方式

注意:使用时应注意,如果远程服务器设置了防火墙或相关的配制,可能会影响到结果。另外,由于发送ICMP请求需要程序对系统有一定的权限,当这个权限无法满足时, isReachable方法将试着连接远程主机的tcp端口。可能出现isReachable=false但是用cmd验证却能够ping通的情况。

代码实现:


   
    public static boolean netOk(String ip){
        InetAddress address=null;
        boolean netOk=false;
        try {
            address =InetAddress.getByName(ip);
           netOk= address.isReachable(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  netOk;
    }

2.最简单的办法,直接调用CMD

注意:如果出现windows环境下可以正常ping通的,而在Centos(linux)里面无法ping通,可能是被ping的设备上有设置ping包大小限制,限制在了32位以内。

最终使用

Process pro = Runtime.getRuntime().exec("ping -s 32 " + ipAddress );

并解析结果来进行判断。

命令行基础

其中n是次数,w是超时时间,单位是毫秒

ping -n 1 -w 1000 9.8.8.8

代码实现:


      
public  static  boolean ping(String ipAddress,  int pingTimes,  int timeOut) {  
        BufferedReader in =  null;  
        Runtime r = Runtime.getRuntime();   //  将要执行的ping命令,此命令是windows格式的命令  
        String pinGCommand = "ping " + ipAddress + " -n " + pingTimes    + " -w " + timeOut;  
         try {    //  执行命令并获取输出  
            System.out.println(pingCommand);   
            Process p = r.exec(pingCommand);   
             if (p ==  null) {    
                 return  false;   
            }
            in =  new BufferedReader( new InputStreamReader(p.getInputStream()));    //  逐行检查输出,计算类似出现=23ms TTL=62字样的次数  
             int connectedCount = 0;   
            String line =  null;   
             while ((line = in.readLine()) !=  null) {    
                connectedCount += getCheckResult(line);   
            }    //  如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真  
             return connectedCount == pingTimes;  
        }  catch (Exception ex) {   
            ex.printStackTrace();    //  出现异常则返回假  
             return  false;  
        }  finally {   
             try {    
                in.close();   
            }  catch (IOException e) {    
                e.printStackTrace();   
            }  
        }
    }
 
// 若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.
     private  static  int getCheckResult(String line) {   //  System.out.println("控制台输出的结果为:"+line);  
        Pattern pattern = Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)",    Pattern.CASE_INSENSITIVE);  
        Matcher matcher = pattern.matcher(line);  
         while (matcher.find()) {
             return 1;
        }
         return 0; 
    }

3.Java调用shell执行ping命令

注意:这种需要在linux环境执行

命令行基础

其中 -c是次数,-W是超时时间,单位是秒

ping -c 2 -W 1 8.8.8.8


  
    public static boolean pingByShell(String ipAddress,  int pingTimes,  int timeOut){
        String sh="ping -c "+pingTimes+" -W "+timeOut+" "+ipAddress;
        String result = exeShell(sh);
        if(result!=null){
          if(result.contains("ttl")){
              return true;
          }
        }
        return false;
    }
 
 

    public static String exeShell(String sh){
        Process process = null;
        List<String> processList = new ArrayList<String>();
        try {
            process = Runtime.getRuntime().exec(sh);
 
            BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = "";
            while ((line = input.readLine()) != null) {
                processList.add(line);
            }
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        String result = StringUtils.join(processList, "\n");
        return result;
    }

批量ssh检查

需求:

先检查网络是否通(这里我是先检查ssh用的22端口),不通的记录下来,端口通的,再用文档记录的登录信息ssh登录,将登录成功的和不成功的分别记录下来。

注意:有的服务器有安全策略,不要同一台服务器多次尝试。

依赖引入


<!-- ssh  -->
<dependency>
    <groupId>ch.ethz.ganymed</groupId>
    <artifactId>ganymed-ssh2</artifactId>
    <version>262</version>
</dependency>

工具封装


package com.isi.utils;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Calendar;
 
import org.apache.commons.lang3.StringUtils;
 
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
 
 
public class SshUtil {
    private static String DEFAULT_CHAR_SET = "UTF-8";
    private static String tipStr = "=======================%s=======================";
    private static String splitStr = "=====================================================";
 
    
    public static Connection login(String ip, String userName, String passWord){
        boolean isAuthenticated = false;
        Connection conn = null;
        long startTime = Calendar.getInstance().getTimeInMillis();
        try {
            conn = new Connection(ip);
            conn.connect(); // 连接主机
 
            isAuthenticated = conn.authenticateWithPassword(userName, password); // 认证
            if(isAuthenticated){
                System.out.println(String.fORMat(tipStr, "认证成功"));
            } else {
                System.out.println(String.format(tipStr, "认证失败"));
            }
        } catch (IOException e) {
            System.err.println(String.format(tipStr, "登录失败"));
            e.printStackTrace();
        }
        long endTime = Calendar.getInstance().getTimeInMillis();
        System.out.println("登录用时: " + (endTime - startTime)/1000.0 + "s\n" + splitStr);
        return conn;
    }
 
 
    public static boolean pwdCheck(String ip, String userName, String password){
        boolean isAuthenticated = false;
        Connection conn = null;
        long startTime = Calendar.getInstance().getTimeInMillis();
        try {
            conn = new Connection(ip);
            conn.connect(); // 连接主机
 
            isAuthenticated = conn.authenticateWithPassword(userName, password); // 认证
            if(isAuthenticated){
                System.out.println(String.format(tipStr, "认证成功"));
                return true;
            } else {
                System.out.println(String.format(tipStr, "认证失败"));
                return false;
            }
        } catch (Exception e) {
            System.err.println(String.format(tipStr, "登录失败"));
            e.printStackTrace();
        }finally {
            if(conn!=null){
                conn.close();
            }
        }
        long endTime = Calendar.getInstance().getTimeInMillis();
        System.out.println("登录用时: " + (endTime - startTime)/1000.0 + "s\n" + splitStr);
        return false;
    }
 
 
    
    public static String execute(Connection conn, String cmd){
        String result = "";
        Session session = null;
        try {
            if(conn != null){
                session = conn.openSession();  // 打开一个会话
                session.execCommand(cmd);      // 执行命令
                result = processStdout(session.getStdout(), DEFAULT_CHAR_SET);
 
                //如果为得到标准输出为空,说明脚本执行出错了
                if(StringUtils.isBlank(result)){
                    System.err.println("【得到标准输出为空】\n执行的命令如下:\n" + cmd);
                    result = processStdout(session.getStderr(), DEFAULT_CHAR_SET);
                }else{
                    System.out.println("【执行命令成功】\n执行的命令如下:\n" + cmd);
                }
            }
        } catch (IOException e) {
            System.err.println("【执行命令失败】\n执行的命令如下:\n" + cmd + "\n" + e.getMessage());
            e.printStackTrace();
        } finally {
            if (conn != null) {
                conn.close();
            }
            if (session != null) {
                session.close();
            }
        }
        return result;
    }
 
    
    private static String processStdout(InputStream in, String charset){
        InputStream stdout = new StreamGobbler(in);
        StringBuffer buffer = new StringBuffer();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
            String line = null;
            while((line = br.readLine()) != null){
                buffer.append(line + "\n");
            }
        } catch (UnsupportedEncodingException e) {
            System.err.println("解析脚本出错:" + e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("解析脚本出错:" + e.getMessage());
            e.printStackTrace();
        }
        return buffer.toString();
    }
 
    
    public static boolean isHostConnectable(String host, int port,int timeout) {
        Socket socket = new Socket();
        try {
            socket.connect(new InetSocketAddress(host, port),timeout);
            socket.setSoTimeout(timeout);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return true;
    }
 
}

密码核对


    public static void main(String[] args){
        String ip = "192.168.4.188";   // 此处根据实际情况,换成自己需要访问的主机IP
        String userName = "root";
        String password = "123456";
        boolean flag = pwdCheck(ip, userName, password);
        System.out.println("flag===="+flag);
 
    }

资源巡查

使用封装的sshUtil


    public static void main(String[] args){
        // 此处根据实际情况,换成自己需要访问的主机IP
        String ip = "192.168.4.188";
        String userName = "root";
        String password = "123456";

 
        Connection connection = login(ip, userName, password);
 
        //查看最大的盘 指定---为分隔符,默认的分隔符java无法指定
        String max_disk_cmd="df | sort -k2nr | head -1 | awk '{print $2,$3,$4,$5}' OFS='---' ";
        //查看内存使用情况
        String free_mem_cmd="free | sort -k2nr | head -1 | awk '{print $2,$3,$4}' OFS='---'";
        //计算cpu使用率, -n number:指定在结束前应该产生的最大迭代次数或帧数,一般迭代次数越大,获取到的cpu使用率越准确; 本脚本中是迭代了5次,"-n5"
        String cpu_use_cmd="top -b -n5 | fgrep \"Cpu(s)\" | tail -1 | awk -F'id,' '{split($1, vs, \",\"); v=vs[length(vs)]; sub(/\\s+/, \"\", v);sub(/\\s+/, \"\", v); printf \"%d\", 100-v;}'";
 
        String result = execute(connection, cpu_use_cmd);
        System.out.println("result = " + result);
        String[] datas = result.split("---");
        String str = Arrays.toString(datas);
        System.out.println("str = " + str);
        closeConn(connection);
    }

使用命令组合 sort

#-n: --numeric-sort    按照数字的值进行比较

#-k:--key=POS1[,POS2]     start a key at POS1 (origin 1), end it at POS2

        按指定的列做排序

#-r:--reverse    反序排列

-t:指定排序用的字段的分隔符


sort -t ":" -k 3 -nr /etc/passwd

按两个字段做排序:


sort -t: -k7 -k3nr /etc/passwd

参考:https://www.jb51.net/article/134816.htm

head

head   -n  1  显示文件前1行内容

head   -n  -1  显示文件除了最后1行的内容

head   -c   5  显示文件前n个字节

 head   -c   -5  显示文件除了最后5个字节的内容

awk

输出指定列

awk '{print $1,$4}' test

 

格式化输出,指定输出分隔符

awk '{printf "%-8s %-10s\n",$1,$4}' test

也可以用

awk '{print $1,$2}' OFS=' '

 指定输入分隔符

awk -F, '{print $1,$2}' test

参考:Https://www.jb51.net/article/174434.htm

到此这篇关于java实现服务器巡查的文章就介绍到这了,更多相关java服务器巡查内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: java实现服务器巡查的代码

本文链接: https://www.lsjlt.com/news/159289.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java实现服务器巡查的代码
    目录需求批量ping1.Jdk1.5的InetAddresss方式2.最简单的办法,直接调用CMD3.Java调用shell执行ping命令批量ssh检查需求:依赖引入工具封装密码核...
    99+
    2024-04-02
  • java实现对服务器的自动巡检邮件通知
    1、需求之前一直是手动的巡检,然后贴图,最近服务器数量大增,有点忙不过来了。因为一直用的java,对shell脚本不是特别了解,所以这次用java写了个小项目,实现对多服务器,多任务的巡检,巡检结果有故障的会通过邮件通知。2、功能和效果巡检...
    99+
    2023-05-31
    java 服务器 巡检
  • java WebSocket 服务端实现代码
    1.什么是WebSocket   WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务...
    99+
    2024-04-02
  • 如何通过Java代码实现Jetty的Http服务器
    这篇文章主要讲解了“如何通过Java代码实现Jetty的Http服务器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何通过Java代码实现Jetty的Http服务器”吧!Jetty是一个轻...
    99+
    2023-07-02
  • MySQL查看锁的实现代码
    目录mysql查看锁的sql开启锁监控其他监控MySQL查看锁的sql 查看数据库状态 # 会显示加锁的信息等等 show engine innodb status; 查看正在执行的线程信息 show full p...
    99+
    2023-02-05
    MySQL查看锁
  • Java实现动态代理的实例代码
    目录前言静态代理 动态代理 CGLib实现动态代理 总结前言 动态代理在Java中有着广泛的应用,比如Spring AOP、Hibernate数据查询、测试框架的后端mock、RPC...
    99+
    2024-04-02
  • Java实现定时任务的示例代码
    目录xxl-job官网引入依赖配置信息(application.properties)配置类(XxlJobConfiguration)调用xxl-job-admin模块的接口添加调度...
    99+
    2022-11-21
    Java实现定时任务 Java定时任务 Java 定时
  • python 代码检查,实现行级代码优化
        有时候运行一个python程序,它需要运行很长时间。你或许想提升该程序的运行效率。那该怎么做那?     首先需要你要找到该程序瓶颈在哪里~   比如,哪个函数的运行花费时间比较长? 哪个函数占用内存比较多,是否需要优化对内存的使用...
    99+
    2023-01-31
    代码 python
  • java实现计算器的代码怎么写
    以下是一个简单的Java代码实现计算器的示例:```javaimport java.util.Scanner;public class Calculator {public static void main(String[] args)...
    99+
    2023-08-11
    java
  • java动态代理实现代码
    目录1、代理模式2、动态代理3、原理研究4、应用5、总结1、代理模式 代理模式是常用的设计模式之一,也是开发中常见的设计模式。 简单的描述一下,代理模式就是将实现类隔离开,比如你想给...
    99+
    2024-04-02
  • java画图代码实现
    要使用Java语言进行图形绘制,可以使用Java的图形库,如AWT(Abstract Window Toolkit)或Swing等。...
    99+
    2023-09-23
    java
  • java音乐播放器实现代码
    本文实例为大家分享了java音乐播放器的具体代码,供大家参考,具体内容如下这个是源码结构介绍这个是界面,有点简陋,见笑了,但是基本上的东西都有了,没办法,没有美工的程序写的界面直接上源代码Player.javapackage com.ser...
    99+
    2023-05-31
    java 播放器 ava
  • Java调用ChatGPT的实现代码
    目录Java调用ChatGPT的小插件1. ChatGPT账号准备2. 配置阶段2.1 依赖引入2.2 配置application.yml文件2.3 @EnableChatGPT注解...
    99+
    2023-02-18
    Java调用ChatGPT Java实现调用ChatGPT
  • Java代码实现循环队列的示例代码
    循环队列结构 队列特点 队列为一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受...
    99+
    2024-04-02
  • Python 代码实现模糊查询
    最近在做一个django项目,里面有一个字典数据非常大,虽然已经做了分页处理。但是用户想要找到指定的数据,还得一页页翻,非常繁琐。字典的结构如下:file_list = [     ...
    99+
    2023-01-31
    模糊 代码 Python
  • Java模拟OPC Server服务器并创建节点代码实现
    前言 模拟OPC Server服务器的方法除了使用KEPServerEX6软件以外,还可以使用java代码模拟启动一个opc server。下文详细讲解,如何使用java代码,实现模拟一个或者多个op...
    99+
    2023-09-27
    java 开发语言
  • Java实现AES算法的实例代码
      使用AES算法可用于对数据进行加密码与解密,使用的时候需要注意两点:1)被加密的串越长,加密后的字符串越长,注意数据库字段的设计;2)Linux与Windows环境中可能会出现由...
    99+
    2024-04-02
  • java编程实现并查集的路径压缩代码详解
    首先看两张路径压缩的图片:并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。一些常见的用途有求连通子图、求最小生成树的 Kruskal 算法和求最近公共祖先(Least...
    99+
    2023-05-30
    java 算法 并查集
  • Java使用Jedis操作Redis服务器的实例代码
    这几天Java项目中需要用到Redis,于是学习了一下使用Jedis来操作Redis服务器的相关知识,下面为具体的配置和代码。1、Maven中配置Jedis在maven项目的pom.xml中添加依赖<dependencies> ...
    99+
    2023-05-31
    jedis redis java
  • Java多线程CyclicBarrier的实现代码
    介绍 CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作