2011-07-15 17:51:44 +0000 2011-07-15 17:51:44 +0000
65
65
Advertisement

在 Linux

Advertisement

中显示局域网上的计算机列表 我是一个 Web 开发人员,想在安全问题上得到更好的处理。我想找出一种方法(在Linux/Debian发行版上)来列出我的上网本所在的同一局域网内的所有计算机。我试过 “arp -n",但我觉得这不是一个完整的列表,因为我的iPhone和我的上网本是在同一个wi-fi路由器上,而这并没有出现。有没有什么更好的方法可以得到一个完整的机器列表,这些机器都是共享同一个网关?

Advertisement

答案 (11)

61
61
61
2011-07-15 17:55:50 +0000

获取【nmap】(http://nmap.org/download.html)。这是Trinity在The Matrix中使用的程序,你可以做一个扫描,找到所有连接到你所在的局域网的设备等等。 这里是参考指南。

41
41
41
2014-12-09 15:56:20 +0000

我就是用的这个,nmap,还有你要扫描的网络的CIDR区块地址。首先你需要安装nmap,因为你的发行版可能没有预装nmap。 地址是:

sudo apt-get install nmap
ifconfig

用-sP参数运行nmap,除了检查主机是否在线外,不会再扫描:

wlan1 Link encap:Ethernet HWaddr 00:1f:3b:03:d2:bf  
          inet addr:192.168.1.104 Bcast:192.168.0.255 Mask:255.255.255.0
          inet6 addr: fe80::21f:3bff:fe03:d2bf/64 Scope:Link
          ...

nmap的输出是这样的:

192.168.1.0/24

就这样,如果你需要更多的帮助,请看nmap官方文档](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing),或者运行:

sudo nmap -sP 192.168.1.0/24
18
Advertisement
18
18
2011-07-15 19:12:18 +0000

arp -n 只显示你的局域网内的机器已经和你的机器进行了通话。你可以通过ping广播地址和全主机多播地址来让这个列表更好地填充:

“all ones"(二进制)广播地址。请注意,大多数IP栈会把它翻译成你所连接的所有子网的子网广播地址:

ping 255.255.255.255

你当前子网的子网广播地址。所以假设你在192.168.1.0/24上:

ping 192.168.1.255

"所有主机 "的组播地址。我很喜欢这个方法,因为它更有可能找到配置在其他IP子网的主机,而这些主机恰好和你连接在同一个以太网局域网上:

ping 224.0.0.1

注意,这个方法和我在其他答案中提到的其他方法都只寻找当前网络上的IP可访问的主机。这可能是你所需要关心的,但攻击者有可能在不通过IP可见的情况下窥探网络,或者对网络做坏事。

8
8
8
2017-04-03 21:54:39 +0000

ip neighhosts。**在此基础上,你可以建立一个Python脚本:

#!/usr/bin/env python

"""List all hosts with their IP adress of the current network."""

import os

out = os.popen('ip neigh').read().splitlines()
for i, line in enumerate(out, start=1):
    ip = line.split(' ')[0]
    h = os.popen('host {}'.format(ip)).read()
    hostname = h.split(' ')[-1]
    print("{:>3}: {} ({})".format(i, hostname.strip(), ip))
wget https://gist.githubusercontent.com/MartinThoma/699ae445b8a08b5afd16f7d6f5e5d0f8/raw/577fc32b57a7f9e66fdc9be60e7e498bbec7951a/neighbors.py

下载(或者干脆就是arp………..我以前没看到过这个

4
Advertisement
4
4
2016-05-10 08:21:24 +0000

你可以尝试用一个小的linux shell脚本ping所有给定的子网,例如

$ for ip in $(seq 1 254); do ping -c 1 192.168.1.$ip>/dev/null; [$? -eq 0] && echo "192.168.1.$ip UP" || : ; done
4
4
4
2013-12-18 01:44:36 +0000

我觉得现有的答案还不够满意,所以想试一试。毕竟FAQ中建议提供【链接的上下文】(https://superuser.com/questions/how-to-answer).

nmap很不错,如果用起来有点混乱的话。以下是我运行的发现本地网络设备的方法,主要是可以复制粘贴的。nmap -sP(或nmap -sn)通过ping进行扫描。还有其他的'主机发现'的选项,比如用nmap -sLnmap -Pn.

方式#1.

ehtesh@x200arch:~$ # my wireless interface is listed as wlp3s0. Yours could be wlan0 or eth1.
ehtesh@x200arch:~$ ip addr show wlp3s0 | grep "inet "
    inet 172.18.72.53/22 brd 172.18.75.255 scope global wlp3s0
ehtesh@x200arch:~$ arp -a
? (172.18.72.1) at c8:4c:75:76:bd:74 [ether] on wlp3s0
ehtesh@x200arch:~$ nmap -sP 172.18.72.0/24
Starting Nmap 6.41SVN ( http://nmap.org ) at 2013-12-17 20:08 EST
Nmap scan report for 172.18.72.2
Host is up (0.017s latency).
<... 15 IP addresses snipped ...>
Nmap scan report for 172.18.72.253
Host is up (0.13s latency).
Nmap done: 256 IP addresses (17 hosts up) scanned in 5.74 seconds
ehtesh@x200arch:~$ arp -a | sort -n -k 1,1                            
? (172.18.72.126) at ec:35:86:4a:37:d2 [ether] on wlp3s0
? (172.18.72.148) at 10:9a:dd:b8:79:71 [ether] on wlp3s0
? (172.18.72.178) at 9c:20:7b:7b:08:ba [ether] on wlp3s0
? (172.18.72.1) at c8:4c:75:76:bd:74 [ether] on wlp3s0
? (172.18.72.253) at b8:78:2e:19:05:0b [ether] on wlp3s0
? (172.18.72.2) at 00:14:1c:da:e1:c2 [ether] on wlp3s0
? (172.18.72.40) at d8:c7:c8:ca:f9:88 [ether] on wlp3s0
? (172.18.72.43) at d8:c7:c8:ce:0f:60 [ether] on wlp3s0
? (172.18.72.44) at d8:c7:c8:ce:0f:68 [ether] on wlp3s0
? (172.18.72.45) at 6c:f3:7f:c6:71:16 [ether] on wlp3s0
? (172.18.72.46) at 6c:f3:7f:c4:4c:b3 [ether] on wlp3s0
? (172.18.72.47) at d8:c7:c8:ca:f9:88 [ether] on wlp3s0
? (172.18.72.48) at 24:de:c6:c6:b6:78 [ether] on wlp3s0
? (172.18.72.49) at 24:de:c6:c6:b6:e6 [ether] on wlp3s0
? (172.18.72.51) at 00:9c:02:d0:4c:4e [ether] on wlp3s0
? (172.18.72.54) at 00:23:76:99:99:bf [ether] on wlp3s0
? (172.18.72.62) at 8c:70:5a:0d:06:18 [ether] on wlp3s0
? (172.18.72.63) at 7c:e9:d3:51:86:55 [ether] on wlp3s0
? (172.18.72.64) at a0:88:b4:47:eb:c8 [ether] on wlp3s0

方式#2. 我知道这个方法可行,但我不能说这是不是正确的方法。

ehtesh@x200arch:~$ #ifconfig | grep broadcast
ehtesh@x200arch:~$ ip address show wlp3s0 | grep brd
    link/ether 00:1e:65:bf:1b:42 brd ff:ff:ff:ff:ff:ff
    inet 172.18.72.53/22 brd 172.18.75.255 scope global wlp3s0
ehtesh@x200arch:~$ ping -b -c 3 -i 20 172.18.75.255
<... similar output to above ...>

&001

我很乐意知道是否有更有效的方法。在那之前,我还是坚持用这个方法。

3
Advertisement
3
3
2011-07-15 18:16:48 +0000
3
3
3
2019-05-23 17:18:32 +0000

你可以使用 fping* sudo apt-get install fping (在类似于 debian 的操作系统中)。

fping类似于 ping,但在ping多个主机时性能更好。-r 1标志告诉fping只执行一轮。2>1部分允许grep过滤输出。使用sudo**可以看到MAC地址。

3
Advertisement
3
3
2017-11-08 13:22:31 +0000

1. 如果广播和nmap不可用,可供选择的解决方案:

seq 254 | xargs -iIP -P255 ping -c1 192.168.2.IP |grep time=
arp -a

**2a.或者直接问你的域名服务器*:

seq 254| awk '{print "192.168.2."$1}' |nslookup | grep name

2b.不使用awk

echo -e 192.168.2.{1..10}"\n" |nslookup |grep name

1.并行ping 192.168.2.0/24子网中所有pingable Network-Devices(以减少运行时间)。

2.不检查活动连接或当前连接,而是列出本地域服务保留的所有连接,即使是真正的老连接。

更详细的解释:

  • arp创建1到254的所有号码(对于100到150的所有号码:seq 254
  • seq 100 150调用xargs,并将 “IP"(ping)替换成stdin中的-iIPuence号,所以192. 168.2.IP改成192.168.2.1为第一个seq号,seq指定了-P应该启动的并发进程数,我选择了+1作为地址(=254)im感兴趣的地址。
  • ping用xargs修改的ip地址(xargs)和只ping一次(ping)。在这种情况下,你必须在192.168.2.IP参数上使用与xargs指定的标识符相同的标识符-c1
  • -i去掉每一行包含多余的信息,我们只对答案感兴趣,它提供了一个往返时间(=got a response)
  • IP显示有效的name(ip)对

我把这个叫做我的pingall命令,并在grep time=中的别名中使用。

alias pingall='seq 254 | xargs -iIP -P255 ping -c1 192.168.2.IP |grep time='
3
3
3
2016-07-25 17:31:07 +0000

要扫描一系列IP地址的状态,这个很好,也很简单:

sudo nmap -sn 192.168.1.2-20
-sn: Ping Scan - disable port scan

哪里: &001

注:

  • 在之前的Nmap版本中,-sn被称为-sP

我是在Mac OS X(基于BSD)上做的。我不知道Linux版本是否有什么区别。

2
Advertisement
2
2
2016-10-20 10:28:47 +0000

对于一个更紧凑的连接设备列表:

nmap -sL 192.168.0.* | grep \(1

说明。

Advertisement
Advertisement