我有一个项目,我知道网络上只有一台计算机和一台打印机。我想要做的是检测打印机何时连接到网络。我也知道电脑是192.168.3.1
。然而,使用 DHCP,我将不知道打印机地址(是的,可以将其设置为静态以使其更容易,但是,“他们”不喜欢这样。“他们”希望它是动态的)
我拥有的是一个执行以下操作并且有效的脚本。
nmap -sP 192.168.3.0/24 \
| awk '/192.168.3/ && !/192.168.3.1$/' \
| sed 's/Nmap scan report for //'
Nmap输出
Nmap scan report for 192.168.3.1
Host is up (0.014s latency).
Nmap scan report for 192.168.3.100
Host is up (0.012s latency).
Nmap done: 256 IP addresses (2 hosts up) scanned in 2.54 seconds
脚本输出
192.168.3.100
只需几秒钟即可工作,但有更好/更干净/更快的方法吗?
答案1
您可以使用以下awk
命令来完成此操作:
nmap -sP 192.168.3.0/24 \
| awk '/192.168.3/ && !/192.168.3.1$/{print $NF}'
这表明awk
打印匹配行的最后一个字段
答案2
如果您知道自己对部分子网不感兴趣,则无需扫描整个子网。 (避开计算机意味着您不需要丢弃其结果。)
nmap -oG - -sn 192.168.3.2-254 | awk '$NF=="Up" {print $2}'
或者如果您更喜欢使用 XML 输出而不是grep
输出
nmap -oX - -sP 192.168.3.2-254 | xmlstarlet sel -t -m '//address[@addrtype="ipv4"]' -v '@addr' -n
如果您的版本需要,请使用-sP
而不是较新的版本。-sn
nmap
顺便说一句,虽然您的系统管理员可能希望您的打印机使用 DHCP,但他们应该没有理由不安排它拥有一个已知的不变地址。 (我对网络上的打印机执行此操作,以便打印机软件无需担心 IP 地址意外更改。)有时,这称为“粘性”地址,以将其与静态(非 DHCP)地址或伪随机动态 (DHCP) 地址。
您确定 DHCP 服务器本身不在您的子网上吗?否则,您的打印机将如何获得其动态地址?
答案3
也许一个更有效的解决方案仅使用grep
(需要 GNU grep 或支持 perl 正则表达式的 grep):
nmap -sP 192.168.3.0/24 \
| grep -o -P '192.168.3.(?!1$)[0-9]+'
这是 grep -o (仅)与任何以192.168.3
除了以下开头的 IP 相匹配的 IP 地址192.168.3.1
答案4
获得打印机的 IP 地址后,您可以使用 获取主机名nmblookup -A 'IP address'
。如果将来 IP 发生变化,这应该会有所帮助,因为您将向网络请求具有此名称的计算机,而不是尝试通过 IP 地址查找计算机。