Java如何在命令行中获取指定数据

1.执行ipconfig /all获取主机所有网卡信息

并分析这些字符串,提取出有效网卡(网卡名称,mac地址,ipv4地址,掩码,网关,dns)

将网卡插入HashMap中,key是网卡的名称,value是网卡对象(包含mac和4个逻辑地址)

请输入网卡的名称,程序通过map的get方法取出此名称对应的网卡对象

根据网卡对象执行其方法getNetId()取出其网卡所在网络号进行打印

getBroadId()取出其广播号进行打印

2.根据网卡的ip和掩码扫描所有这个子网中可能存在的邻居

然后用ping ..方式进行验证此邻居是否存在,如果存在则将其加入

网卡的邻居集合(HashSet)中

3.某些邻居有可能开启防火墙导致ping失败,所以验证其是否存在的

恰当方式是先ping它一下,然后用arp -a查看这个邻居是否有arp回应

如果存在arp条目则说明这个邻居是存在的.

代码实例

package day2020072501;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Zzbds {

  public static String exeCmd(String commandStr) {
    BufferedReader br = null;
    try {
      Process p = Runtime.getRuntime().exec(commandStr);
      br = new BufferedReader(new InputStreamReader(p.getInputStream()));
      String line = null;
      StringBuilder sb = new StringBuilder();
      while ((line = br.readLine()) != null) {
        sb.append(line + "\n");
      }
      // System.out.println(sb.toString());
      return sb.toString();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (br != null) {
        try {
          br.close();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
    return commandStr;
  }

  public static void main(String[] args) {
    String str = exeCmd("ipconfig /all");
    String expr = "(.+适配器 +.+)\\:"; // 找到所有网卡名字
    HashMap<NetInfo, String> mp = new HashMap<>(); // HashMap存储信息

    Pattern pt = Pattern.compile(expr); // 配对 P,和正则匹配
    Matcher mt = pt.matcher(str); // 开始匹配源字符串 matcher
    System.out.println("\n==========================");

    int MacIndex = 0;// 记录网卡
    while (mt.find()) {
      MacIndex++;
      System.out.println(mt.group(1));
    }
    System.out.println("\n共" + MacIndex + "个网卡");
    if (MacIndex == 0) {
      System.out.println("没有网卡");
      return;
    }

    System.out.println("\n==========================");

    Matcher mt1 = pt.matcher(str); // 开始匹配源字符串 matcher
    // System.out.println("可用网卡");
    int MacUse = 0;// 可以使用的网卡数量
    String[] MacArr = new String[10];// 存储网卡数组(可用网卡)
    while (mt1.find()) { // 循环遍历所有网卡
      // 判断是否可用
      if (NetWorkUtil.NetWorkavailable(mt1.group())) {
        MacArr[MacUse] = mt1.group();
        MacUse++;
        // System.out.println(mt1.group());
      }
    }
    for (int i = 0; i < MacUse; i++) {
      System.out.println(MacArr[i]);
    }
    System.out.println("\n可用网卡共:" + MacUse + "个");
    System.out.println("\n==========================\n");

    // System.out.println("------------------------------------");
    // 打印出可用的网卡信息
    for (int j = 0; j < MacUse; j++) { // 使用(数组)循环,打印所有可用网卡的所有信息
      String MacInfo = "";// 可用的网卡信息
      String expr1 = "(" + MacArr[j] + "([\\d\\D]*))";
      System.out.println("\n第" + (j + 1) + "个是:" + MacArr[j]);
      Pattern pt1 = Pattern.compile(expr1);
      Matcher mt2 = pt1.matcher(str);
      if (mt2.find()) {
        MacInfo = mt2.group(1);// 把查到的信息赋给变量MaxInfo
      }
      // System.out.println(MacInfo);
      System.out.println("---------------------可用网卡的具体信息如下(第" + (j + 1) + "个网卡)----------------");
      Pattern pt2 = Pattern.compile(" +描述(\\. +)+: (.*)");
      Matcher mt3 = pt2.matcher(MacInfo);// 网卡名
      Pattern pt3 = Pattern.compile(" +物理地址(\\. +)+: (.*)");
      Matcher mt4 = pt3.matcher(MacInfo);// 网卡地址
      Pattern pt5 = Pattern.compile(" +IPv4 地址( +\\.)+ +: +(.*)\\(");
      Matcher mt5 = pt5.matcher(MacInfo);// IP地址
      Pattern pt6 = Pattern.compile(" +子网掩码( +\\.)+ +: +(.*)");
      Matcher mt6 = pt6.matcher(MacInfo);// 子网掩码
      Pattern pt7 = Pattern.compile(" +默认网关(\\. +)+: (.*)");
      Matcher mt7 = pt7.matcher(MacInfo);// 网关
      Pattern pt8 = Pattern.compile(" +DNS 服务器( +\\.)+ +: +(.*)");
      Matcher mt8 = pt8.matcher(MacInfo);// DNS

      String MacName = "";
      String MacIP = "";
      String IPV4 = "";
      String NetMask = "";
      String GateWay = "";
      String DNS = "";

      if (mt3.find() && mt4.find() && mt5.find() && mt6.find() && mt7.find() && mt8.find()) {
        MacName = mt3.group(2);
        MacIP = mt4.group(2);
        IPV4 = mt5.group(2);
        NetMask = mt6.group(2);
        GateWay = mt7.group(2);
        DNS = mt8.group(2);
        mp.put(new NetInfo(MacName,MacIP, IPV4, NetMask, GateWay, DNS), MacName);
      }
      System.out.println("网卡名称:" + MacName.trim());
      System.out.println("网卡地址:" + MacIP.trim());
      System.out.println("IPV4地址:" + IPV4.trim());
      System.out.println("子网掩码:" + NetMask.trim());
      System.out.println("默认网关:" + GateWay.trim());
      System.out.println("DNS地址:" + DNS.trim());

    }

    System.out.println("\n=====================使用HashMap遍历输出===========================");
    for (NetInfo h : mp.keySet()) {
      System.out.println("\n网卡名字:" + mp.get(h) + "\n" + h);
      System.out.println("\n-------------");
    }

    System.out.println("======================");
    System.out.println("请输入网卡名:");
    //String inputMacName = new Scanner(System.in).next();//输入网卡名称
    //默认输入:VMware Virtual Ethernet Adapter for VMnet8

    String NetId = "";//记录IP
    String inputMacName ="VMware Virtual Ethernet Adapter for VMnet8";
    System.out.println("您输入的是:"+inputMacName);
    for (NetInfo h : mp.keySet()) {
      if((h.getMacName().trim()).equals(inputMacName)){
        System.out.println("\n网卡名字:" + mp.get(h) + "\n" + h);
        NetId = h.getIPV4();
        System.out.println("\nIP:"+NetId); //打印出此IP(后面求出网络号、广播号)
      }
    }

    //分解数组
    String []netIPArr = NetId.split("\\.");
    for(int i= 0;i<netIPArr.length;i++){
      System.out.println(netIPArr[i]);
    }

    //求网络号:
      System.out.println("网络号:"+netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+0);
      System.out.println("广播号:"+netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+255);

    //访问所有邻居
    HashSet<String> nei = new HashSet<>();//存储所有可达的邻居
    for(int i= 1;i<5;i++){
      String str1 = exeCmd("ping "+netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+i);
      System.out.println(str1);
      //判断是否Ping 通
      Pattern pt9 = Pattern.compile("TTL");
      Matcher mt9 = pt9.matcher(str1);
      if (mt9.find()){//如果能ping 通,直接加入到set集合内
        //System.out.println(netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+i);
        nei.add(netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+i);//存储
      }else{//如果ping 不同,使用arp 查看回应
        String str2 = exeCmd("arp -a");
        Pattern pt10 = Pattern.compile(netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+i);
        Matcher mt10 = pt10.matcher(str2);
        if (mt10.find()){//如果arp 返回数据,也加入到set集合内
          nei.add(netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+i);//存储
        }
      }
    }

    //输出所有可达的邻居
    System.out.println("所有可达的邻居:");
    for(String s : nei){
      System.out.println(s);
    }

  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 用命令行编译java并生成可执行的jar包方法

    1.编写源代码 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: package test; import java.awt.*; import javax.swing.*; //更多包的导入... class NotePadFrame extends JFrame { //主界面的设计... } //其他相关代码... public class CardLayoutDemo { public static

  • 通过Spring Shell 开发 Java 命令行应用

    提到 Java,大家都会想到 Java 在服务器端应用开发中的使用.实际上,Java 在命令行应用的开发中也有一席之地.在很多情况下,相对于图形用户界面来说,命令行界面响应速度快,所占用的系统资源少.在与用户进行交互的场景比较单一时,命令行界面是更好的选择.命令行界面有其固定的交互模式.通常是由用户输入一系列的参数,在执行之后把相应的结果在控制台输出.命令行应用通常需要处理输入参数的传递和验证.输出结果的格式化等任务.Spring Shell 可以帮助简化这些常见的任务,让开发人员专注于实现应用

  • java使用命令行打包JAR

    1.命令行的方式:打包jar cf JAR文件名称 程序文件名称或者程序所在的文件夹举例:jar cf MyApp.jar D:JavaProjectMyApp查看一个jar文件的内容jar tvf JAR文件名称举例:jar tvf MyApp.jar将一个jar文件解压缩jar xf JAR文件名称举例:jar xf MyApp.jar往压缩包里面增加文件jar xf JAR文件名称 添加的文件或者其他的jar文件举例:jar xf MyApp.jar Test.class更新一个jar文件

  • Java命令行下Jar包打包小结

    jar包打包实现 jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容 从最后显示的两个示例看出存在两种打包的方法,两者的区别就是是否使用自己定义的MANIFEST清单文件.第一个示例没有使用MANIFEST文件进行打包,所以最终生成的jar包中MANIFEST文件为默认文件,这种方式适用于比较简单的jar包结构,不存在其他jar包依赖以及生成的jar包不需要可执行.这种方式生成的jar包不能使用java -jar XXX.jar命令执行,因为MANIFEST文件

  • Java简单实现调用命令行并获取执行结果示例

    本文实例讲述了Java简单实现调用命令行并获取执行结果.分享给大家供大家参考,具体如下: import java.io.BufferedReader; import java.io.InputStreamReader; public class Command { public static void exeCmd(String commandStr) { BufferedReader br = null; try { Process p = Runtime.getRuntime().exec(

  • windows命令行中java和javac、javap使用详解(java编译命令)

    如题,首先我们在桌面,开始->运行->键入cmd 回车,进入windows命令行.进入如图所示的画面: 可知,当前默认目录为C盘Users文件夹下的Administrator文件夹.一般而言,我们习惯改变当前目录.由于windows有磁盘分区,若要跳到其他磁盘,例如E盘,有几种方法: 1.输入命令: pushd 路径(此命令可将当前目录设为所希望的任一个已存在的路径) 2.输入命令: e:  转移到e盘,然后再输入 cd 转移到所希望的已知路径. 如图: 希望在windows命令行下使用jav

  • 将java程序打成jar包在cmd命令行下执行的方法

    前言 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口.本文将给大家介绍java程序打成jar包在cmd命令行下执行的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.打包 二.修改配置文件是程序能够引用第三方jar包 1.新建一个文件夹,用来存储这个项目 ------------第三方jar包单独存在一个文件夹下面(这里放在了lib下面)(重点是lib要和weixin.jar同

  • Ubuntu安装java的最简单的命令行方式(推荐)

    由于经常要安装java,因此 深受其烦! 分为两部: 1. sudo apt-get install openjdk-7-jdk 2. sudo vim /etc/environment 然后把下面的复制过去 : JAVA_HOME="/usr/lib/jvm/java-1.7.0-openjdk-amd64>" 3.source /etc/environment 以上所述是小编给大家介绍的Ubuntu安装java的最简单的命令行方式,希望对大家有所帮助,如果大家有任何疑问请给我

  • Java如何在命令行中获取指定数据

    1.执行ipconfig /all获取主机所有网卡信息 并分析这些字符串,提取出有效网卡(网卡名称,mac地址,ipv4地址,掩码,网关,dns) 将网卡插入HashMap中,key是网卡的名称,value是网卡对象(包含mac和4个逻辑地址) 请输入网卡的名称,程序通过map的get方法取出此名称对应的网卡对象 根据网卡对象执行其方法getNetId()取出其网卡所在网络号进行打印 getBroadId()取出其广播号进行打印 2.根据网卡的ip和掩码扫描所有这个子网中可能存在的邻居 然后用p

  • Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址

    使用Windows命令行cmd可以指定浏览器打开网址.在node.js中使用start即可: 比如分别用Chrome和IE打开网址 start chrome http://www.google.cn start iexplore http://www.google.cn 但是当用户没有安装Chrome时使用start则会报错,并会弹出错误对话框: [Window Title] chrome [Content] Windows 找不到文件 'chrome'.请确定文件名是否正确后,再试一次. 如果

  • shell 命令行中操作HBase数据库实例详解

     shell 命令行中操作HBase数据库 Shell控制 进入到shell命令行界面,执行hbase命令,并附加shell关键字: [grid@hdnode3 ~]$ hbase shell HBase Shell; enter ¨help¨ for list of supported commands. Type "exit" to leave the HBase Shell Version 0.90.5, r1212209, Fri Dec 9 05:40:36 UTC 2011

  • java自带命令行工具jmap、jhat与jinfo的使用实例代码详解

    java自带命令行工具(jmap,jhat,jinfo) (1)JMAP 1.作用 打印进程,core文件,和远程进程的共享对象存储map或堆存储器的详细信息. 2.使用 jmap[options]pid jmap[options]executablecore jmap[options][pid]server-id@]remote-hostname-or-IP 如果指定的进程是在64位Java虚拟机(JVM)上运行,那么你可能需要指定-J-d64选项,例如:jmap -J-d64 -heap p

  • 使用devenv在命令行中编译项目的方法

    本文介绍如何使用命令行运行Visual Studio编译项目. 一.devenv介绍 devenv是VisualStudio的可执行程序,一般在"..\Microsoft Visual Studio 12.0\Common7\IDE"下,用于运行Visual Studio. 使用devenv来编译项目的实例: devenv D:\Build\MyProject\Src\MyProject.sln /Build "Debug|x64" 二.devenv的使用帮助 1.

  • Linux ftp 命令行中下载文件get与上传文件put的命令应用详解

    介绍:从本地以用户anok登录的机器192.168.0.16上通过ftp远程登录到192.168.0.6的ftp服务器上,登录用户名是peo.以下为使用该连接做的实验. 查看远程ftp服务器上用户peo相应目录下的文件所使用的命令为:ls,登录到ftp后在ftp命令提示符下查看本地机器用户anok相应目录下文件的命令是:!ls.查询ftp命令可在提示符下输入:?,然后回车. 1.从远程ftp服务器下载文件的命令格式: get  远程ftp服务器上当前目录下要下载的文件名  [下载到本地机器上当前

  • MySQL在Linux系统中隐藏命令行中的密码的方法

    在命令行中输入命令并不是一个好主意,会造成安全问题.但是如果你决定去写一个应用,而这个应用需要在命令行中使用密码或者其他敏感信息.那么,你能通过以下方法禁止系统的其他用户轻易的看到这些敏感数据 呢?,类似MySQL在ps命令下隐藏密码. 假设我这里系统里两个用户,一个是root ,一个是dabu .测试系统为centos 6.5在按照下面的步骤做: [root@dabu.info ~]#su dabu #切换到dabu这个账号 [dabu@dabu.info ~]$cd ~ #切换到dabu的h

  • Android shell命令行中过滤adb logcat输出的方法

    我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adb logcat输出的方法.        1.只显示需要的输出(白名单) 最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配.简单的匹配一行当中的某个字符串,例如 MyApp: adb logcat | grep MyApp        adb logcat |

  • Android shell命令行中过滤adb logcat输出的几种方法

    我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adb logcat输出的方法.        1.只显示需要的输出(白名单) 最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配.简单的匹配一行当中的某个字符串,例如 MyApp: adb logcat | grep MyApp adb logcat | grep -i

随机推荐