获取局域网内ip

获取局域网内ip是进行局域网通信的必然要求,这里使用ping并解析其返回值获取局域网内ip
不过效率不高,,只是简单实现功能


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTextPane;

public class GainAllIp extends JFrame {
	JTextPane text;
	Map<String, String> pingMap = new HashMap<String, String>();
	StringBuilder str = new StringBuilder();

	class PingIpThread extends Thread {
		public String ip;

		public PingIpThread(String ip) {
			this.ip = ip;
		}

		public void run() {
			try {			// 获取ip的进程,-w 280是等待每次回复的超时时间 -n 1发送回显请求数
				Process process = Runtime.getRuntime().exec(
						"ping " + ip + " -w 280 -n 1");
				InputStream is = process.getInputStream();
				InputStreamReader reader = new InputStreamReader(is, "gbk");
				BufferedReader in = new BufferedReader(reader);
				String line = in.readLine();
				while (line != null) {
					if (line != null && !line.equals("")) {
						//System.out.println(line);
						if (line.substring(0, 2).equals("来自")
								|| (line.length() > 10 && line.substring(0, 10)
										.equals("Reply from"))) {
							pingMap.put(ip, "true");
						}
					}
					line = in.readLine();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public void gainIp() {
		this.setTitle("获取局域网全部ip");
		this.setVisible(true);
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		this.setBounds(100, 100, 1000,500);
		this.setLayout(null);
		JButton[] buttons = new JButton[2];
		buttons[0] = new JButton("获取所有IP");
		buttons[1] = new JButton("退出");
		buttons[0].setBounds(10, 10, 150, 30);
		buttons[1].setBounds(180, 10, 90, 30);
		this.add(buttons[0]);
		this.add(buttons[1]);
		text = new JTextPane();
		text.setBounds(10, 50, 1000, 450);
		this.add(text);
		buttons[0].addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				InetAddress address = null;
				try {
					address = InetAddress.getLocalHost();// 获取本机InetAddress对象
					String hostAddress = address.getHostAddress();// 获取本机ip
					int n = hostAddress.lastIndexOf(".");
					String wd = hostAddress.substring(0, n + 1);// 获取网段
					for (int i = 1; i <= 255; i++) {
						String ip = wd + i;
						PingIpThread thread = new PingIpThread(ip);
						thread.run();
						
					}
					Set<String> set = pingMap.keySet();
					Iterator<String> it = set.iterator();

					while (it.hasNext()) {
						String key = it.next();
						String value = pingMap.get(key);
						if (value.equals("true")) {
							System.out.println(key);
							str.append(key + "\n");
						}
					}
					if (str != null) {
						text.setText(str.toString());
					}
				} catch (UnknownHostException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		buttons[1].addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
		});
	}

	public static void main(String[] args) {
		new GainAllIp().gainIp();
	}
}

<think>好的,我现在需要回答用户关于在Kali Linux中获取局域网IP对应MAC地址的命令的问题。用户提到了arp-scan和nmap,可能还有其他工具。首先,我应该回忆这些工具的基本用法,并结合提供的引用资料来确保准确性。 首先,用户给出的引用中有提到arp-scan命令,比如引用[2]和引用[3]。特别是引用[2]中的例子是使用arp-scan并指定接口eth0。引用[4]提到nmap用于主机发现和端口扫描,包括UDP扫描。而用户需要的是获取IP和MAC的对应关系,所以可能需要ARP扫描或者使用nmap的主机发现功能。 接下来,我需要整理这些工具的典型用法。对于arp-scan,基本命令可能包括指定接口,如arp-scan -l,但可能需要sudo权限。引用[2]中的例子是arp-fingerprint -o "-I eth0" IP地址,但这里用户可能需要直接使用arp-scan命令,比如arp-scan --interface=eth0 --localnet。另外,nmap的-sn选项用于主机发现,不扫描端口,这样可以快速获取存活主机的IP和MAC,如nmap -sn 192.168.1.0/24。 还要注意权限问题,可能需要sudo。例如,arp-scan通常需要root权限,而nmap的某些扫描选项也可能需要。此外,用户可能想知道这些命令的输出结果如何展示IP和MAC地址。例如,arp-scan的输出会直接列出IP和MAC,而nmap的-sn扫描在结果中也会显示MAC地址,尤其是当扫描本地网络时。 另外,用户可能对arp命令本身有疑问,但arp命令只能显示缓存中的条目,可能不完整。因此推荐使用主动扫描的工具如arp-scan或nmap。 最后,根据引用[4],nmap的-sU是UDP扫描,但这里用户需要的是ARP扫描,所以可能更相关的是使用-sn或-Pn等选项。需要确保给出的命令示例正确,并引用正确的来源。例如,引用[4]提到使用nmap进行主机发现,所以可以引用该处。 现在需要将这些信息结构化,分点回答,确保每个工具的命令正确,并附上引用标记。同时生成相关问题,可能涉及其他工具或更详细的参数使用。</think>在Kali Linux中获取局域网IP地址与MAC地址的映射关系,可通过以下工具实现: --- ### 1. **`arp-scan` 命令** **原理**:通过主动发送ARP请求包扫描局域网设备,直接获取IP和MAC地址的对应关系。 **基础命令**: ```bash sudo arp-scan --interface=eth0 --localnet ``` - `--interface=eth0`:指定网卡接口(如无线网卡可能是`wlan0`),需根据实际接口名调整[^2]。 - `--localnet`:自动识别当前局域网网段(如`192.168.1.0/24`),无需手动输入IP范围。 **示例输出**: ``` 192.168.1.1 00:11:22:33:44:55 Vendor Name 192.168.1.101 aa:bb:cc:dd:ee:ff Vendor Name ``` --- ### 2. **`nmap` 命令** **原理**:使用主机发现模式(`-sn`)发送ARP请求,探测存活主机并返回IP和MAC地址。 **基础命令**: ```bash sudo nmap -sn 192.168.1.0/24 ``` - `-sn`:仅执行主机发现,不扫描端口[^4]。 - `192.168.1.0/24`:指定扫描的局域网子网,需根据实际网络调整。 **示例输出**: ``` Nmap scan report for 192.168.1.1 Host is up (0.0012s latency). MAC Address: 00:11:22:33:44:55 (Vendor Name) ``` --- ### 3. **`arp` 命令** **原理**:查看本地ARP缓存表(仅包含已通信设备的记录,可能不完整)。 **基础命令**: ```bash arp -a ``` **示例输出**: ``` _gateway (192.168.1.1) at 00:11:22:33:44:55 [ether] on eth0 ``` --- ### 对比与推荐 | 工具 | 优点 | 缺点 | |------------|-------------------------------|---------------------------| | `arp-scan` | 结果最全面,支持自定义参数 | 需手动安装(`apt install arp-scan`) | | `nmap` | 功能丰富,支持后续端口扫描 | 输出信息较复杂 | | `arp` | 无需额外安装 | 仅显示缓存记录,可能缺失 | --- ### 注意事项 - **权限**:`arp-scan`和`nmap`通常需要`sudo`权限[^2]。 - **接口选择**:若未指定接口(如`eth0`),可能因默认网卡错误导致扫描失败。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值