Linux环境下用java查找局域网内所有设备的ip及Mac地址

工作需要用到在局域网内查找所有在线设备的ip及Mac地址,客户工控机用的是Linux系统,与Windows相比有很多命令不一样,网上查了很多资料,后来找到用Nmap工具进行扫描,对扫描结果进行解析。

本方法需要现在Linux系统上安装Nmap工具。

我这边使用的分别是Centos6.8,和Centos7,亲测有效。

具体代码如下:

import java.io.*; 

import java.net.InetAddress;
import java.util.*; 


import org.apache.commons.lang.StringUtils;


import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;


public class IpUtil{ 

/**
* 获取局域网内所有设备IP与Mac地址
* GDB
* @return
* @throws Exception 
*/
public static List<Map<String, Object>> getIps() throws Exception {
List<Map<String, Object>> result = new ArrayList<Map<String,Object>>();
        try {  
            String localIP=InetAddress.getLocalHost().getHostAddress();  
            String os = System.getProperty("os.name");//获取服务器类型
            if (os.startsWith("Linux")) {
            //Linux下获取本机ip,从而截取所属ip区段
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                    NetworkInterface intf = en.nextElement();
                    String name = intf.getName();
                    if (!name.contains("docker") && !name.contains("lo")) {
                        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress()) {
                                String ipaddress = inetAddress.getHostAddress().toString();
                                if (!ipaddress.contains("::") && !ipaddress.contains("0:0:") && !ipaddress.contains("fe80")) {
                                localIP = ipaddress;
                                    System.out.println(ipaddress);
                                }
                            }
                        }
                    }
                }
            } 
            System.out.println("localIP  >>>>>>>>>>>>>>>>>>>>>>>>>>>"+localIP);
            String[] net=localIP.split("\\.");  
            int j=Integer.parseInt(net[2]);  
            int a=Integer.parseInt(net[0]);  
            int b=Integer.parseInt(net[1]);
            String command = "";
            if (os.startsWith("Linux")) {
            //Linux下使用nmap工具对本网段端口进行扫描
                command = "nmap -sP "+a+"."+b+"."+j+".0/24";
                System.out.println("command>>>>>>>>>>>>>>>>>>>>>>"+command);
                //command>>>>>>>>>>>>>>>>>>>>>>nmap -sP 192.168.2.0/24
            }
  
            Process p=Runtime.getRuntime().exec(command);  
            LineNumberReader br = new LineNumberReader(new InputStreamReader(  
                    p.getInputStream()));  
            StringBuffer sb = new StringBuffer();  
            String line;  
            while ((line = br.readLine()) != null) {  
                System.out.println(line);  
                sb.append(line).append("*");  
            }  
          System.out.println("*********************");
            System.out.println(sb.toString()); 
            /*Starting Nmap 5.51 ( http://nmap.org ) at 2018-04-25 09:16 EDT
        Nmap scan report for 192.168.2.1
        Host is up (0.00014s latency).
        MAC Address: 20:DC:E6:8B:D1:C8 (Unknown)
        Nmap scan report for 192.168.2.100
        Host is up (0.00085s latency).
        MAC Address: 64:00:6A:21:16:EB (Unknown)
        Nmap scan report for 192.168.2.104
        Host is up (0.0012s latency).
        MAC Address: 70:B3:D5:A9:7F:EE (Unknown)
        Nmap scan report for 192.168.2.105
        Host is up.
        Nmap scan report for 192.168.2.106
        Host is up (0.069s latency).
        MAC Address: DC:F0:90:84:A5:0E (Unknown)
        Nmap done: 256 IP addresses (5 hosts up) scanned in 9.84 seconds*/
            String str = sb.toString();
            str =  str.substring(str.indexOf("EDT*")+4, str.indexOf("*Nmap done:"));
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
            System.out.println(str);
            String [] lists = str.split("\\*");
            int l = 0;
            Map<String, Object> map = new HashMap<String, Object>();
            //对返回结果进行解析
            for(int i=0;i<lists.length;i++){
            l++;
            String s = lists[i];
            System.out.println(lists[i]);
            if(StringUtils.startsWith(s, "Nmap scan report for") && (l==1 || l==3)){
            if(l==3){l=1;}
            map = new HashMap<String, Object>();
            map.put("IP", s.substring(21));
            }else if(StringUtils.startsWith(s, "Host is up")){
            continue;
            }else if(StringUtils.startsWith(s, "MAC Address:")&& l==3){
            map.put("Mac", s.substring(13,30));
            result.add(map);
            l=0;
            }else {
            l=0;
    }
            }
            System.out.println(result.toString());
            //result = [{mac=20:DC:E6:8B:D1:C8, ip=192.168.2.1}, {mac=64:00:6A:21:16:EB, ip=192.168.2.100}, {mac=70:B3:D5:A9:7F:EE, ip=192.168.2.104}, {mac=DC:F0:90:84:A5:0E, ip=192.168.2.106}]
            p.destroy();  
            return result;
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
return null;
}
    
}
已标记关键词 清除标记
相关推荐
利用jmdns发现局域网设备,在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的ip地址,但是有些时候,你并不知道对方的ip地址,因为一般使用DHCP动态分配ip地址局域网内,各个主机的IP地址是由DHCP服务器来帮你分配IP地址的。所以在很多情况下,你要知道对方的IP地址是比较麻烦的。 鉴于发现这篇文章最近的浏览量比较多,晚上也有不少转载,特别声明一下,文章水平可能不大够,只是我当时的一些理解,所以希望大家以批判的角度来看,然后又什么问题欢迎讨论。真心不希望误导大家^_^ mDNS就是来解决这个问题的。通过一个约定俗成的端口号,5353。(这个端口号应该是由IETF组织约定的。)每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。 比如,A主机进入局域网,开启了mDNS服务,并向mDNS服务注册一下信息:我提供FTP服务,我的IP是192.168.1.101,端口是21。当B主机进入局域网,并向B主机的mDNS服务请求,我要找局域网内FTP服务器,B主机的mDNS就会去局域网内向其他的mDNS询问,并且最终告诉你,有一个IP地址为192.168.1.101,端口号是21的主机,也就是A主机提供FTP服务,所以B主机就知道了A主机的IP地址和端口号了。 大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。 在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务。很多Linux设备也提供这个服务。Windows的设备可能没有提供,但是如果安装了iTunes之类的软件的话,也提供了这个服务。 这样就可以利用这个服务开发一些局域网内的自动发现,然后提供一些局域网内交互的应用了。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页