如何获取具有特定设备名称的连接设备的所有 IP 地址?

如何获取具有特定设备名称的连接设备的所有 IP 地址?

我正在制作用于自动化的 Bash 脚本,想要获取具有特定设备名称的连接设备的所有 IP 地址?

例如,我有 10 台设备连接到 Wi-Fi。所有设备都具有相同的设备名称(例如“Jon's Phone”)。我需要从这些设备获取所有 IP,并将其用作 bash 脚本中的变量,以便稍后可以将 ADB 命令应用于每个 IP。

  • ( arp -a) 仅提供所有已连接设备的列表,但没有设备名称。
  • ( nmap) 也没有给我设备名称。

这是我的尝试:

#!/bin/bash
for ip in 192.168.1.{1..254}; do
     list=nmap -R $ip | grep "Jon's Phone" & <=This don't work
     list=nmap -A -v --dns-servers 192.168.1.1 $ip | grep "Jon's Phone" & <=This don't work
     adb connect $list
     echo $list
done

答案1

这有点复杂,但这是最终产品

nmap -sn 192.168.1.* | gawk 'match($0, /Nmap scan report for (.*) \((([0-9]{1,3}\.?){4})\)/, a) {print a[2]}'

工作原理如下

nmap 命令

nmap -sn -192.168.1.*
星号的作用与通配符的作用相同。该命令的输出将如下所示

Starting Nmap 7.80 ( https://nmap.org ) at 2021-11-18 09:41 MST
Nmap scan report for _gateway (192.168.1.1)
Host is up (0.024s latency).
Nmap scan report for pixel-5.lan (192.168.1.35)
Host is up (0.14s latency).
Nmap scan report for users-mbp-3.lan (192.168.1.23)
Host is up (0.16s latency).
Nmap scan report for brwa8a795cdb114.lan (192.168.1.44)
Host is up (0.015s latency).
Nmap scan report for iphone.lan (192.168.86.19)
Host is up (0.16s latency).
Nmap done: 256 IP addresses (5 hosts up) scanned in 8.46 seconds

我从这里得到这个命令这篇 ServerFault 帖子

gawk 命令

Gawk 基本上就是 awk。它允许您使用具有以下形式的匹配函数:
match(string, /regex/, output_variable)
输出变量是一个数组,其中第 0 个元素是刚刚处理的字符串,其余元素来自捕获组。因此,一个更简单的例子是:
nmap -sn 192.168.1.* | gawk 'match($0, /Nmap scan report for (.*)/, a) {print a[1]}
这将打印

_gateway (192.168.1.1)
pixel-5.lan (192.168.1.35)
users-mbp-3.lan (192.168.1.23)
brwa8a795cdb114.lan (192.168.1.44)
iphone.lan (192.168.1.19)

这是gawk 文档match。如果你想了解它,可以参考。

正则表达式

Nmap scan report for (.*) \((([0-9]{1,3}\.?){4})\)
让我们详细分析一下。

Nmap scan report for (.*):这部分会匹配,并拉出“pixel-5.lan”部分。

[0-9]{1,3}\.?:此匹配一到三位数,然后匹配句点(如果存在)。因此,它将匹配“192。”或“19”等。

([0-9]{1,3}\.?){4}:这应该匹配一个 IP 地址。它匹配了[0-9]{1,3}\.?四次。因此,它会查找带有可选句点的 1-3 位数字,四次。这意味着它也会匹配 1921681.1,但 nmap 会正确格式化 IP 地址,因此这实际上不是问题。

\((([0-9]{1,3}\.?){4})\):现在我们将所有 IP 内容包装在捕获组和文字括号中。捕获组的编号方式是按照首次找到的顺序。因此,当我们有嵌套捕获组时,最外层的捕获组首先编号。

Nmap scan report for (.*) \((([0-9]{1,3}\.?){4})\):最后,我们将所有内容放在一起。需要注意的是,名称将成为第一个捕获组,IP 将成为第二个捕获组,IP 的各个部分将在其后。

相关内容