使用 nmap 查找网络中的打印机的最佳方法是什么?是否可以将打印机 IP 保存到文件中?
答案1
如果您出于某种原因对进行操作系统指纹识别持怀疑态度,您可以进行更有针对性的端口扫描:
nmap -p 9100,515,631 192.168.1.1/24 -oX printers.xml
这将扫描打印机和打印系统的常用端口。
- 9100 = 大多数打印机的 RAW 端口,也称为直接 IP 端口
- 515 = LPR/LPD 端口,适用于大多数打印机以及较旧的打印服务器
- 631 = IPP 端口,适用于大多数现代打印机和基于 CUPS 的打印服务器
输出为 XML 格式。
答案2
此回复直接回答了您的第一个问题。对于第二个问题,了解该命令将使您能够将打印机 IP 地址放入文件中。因此,我们开始吧:
nmap -p 515,631,9100 -oG - 10.81.129.0/24 | gawk '/open/{print $2}' | xargs --delimiter='\n' nmap -sU -p 161 -oG - | gawk '/open/{print $2}' | xargs --replace=$ipaddress snmpget -v 1 -O v -c public $ipaddress system.sysDescr.0 | sed 's/STRING:\s//'
流程说明
- 它扫描网络,寻找正在监听默认打印机端口的网络实体。
- 使用上一步的结果,它将检查这些设备是否支持 SNMP。
- 对于每个具有 SNMP 支持的设备,它会向网络实体查询设备描述。
指令分解
nmap-网络扫描。(Nmap网站)
-p 515,631,9100
扫描 TCP 端口 515、631 和 9100。-oG -
使用 grep-able 输出格式。-sU -p 161
扫描 UDP 端口 161。
呆呆地或者awk-处理列式文本数据。默认情况下,空格将行分隔为列。(维基百科)
gawk '/regexp/'
使用 gawk 的常规表达式来过滤掉与该常规表达式匹配的行。gawk '{<code>}'
使用 awk 类 C 输入语言来操作输出。gawk '{/open/print $2}'
搜索与“open”匹配的行并打印第二列。
響鳴-根据给定的输入构建并执行命令。默认情况下,空格将行分隔为参数。(维基百科)
--delimiter='\n'
使用新行 (\n) 而不是空格来分隔参数。--replace=$ipaddress
对于每一行,将参数存储到$ip地址。
SNMP获取或者snmpwalk-使用 SNMP GET 请求查询网络实体的信息。(网络管理平台,有关 SNMP 的更多信息,请参阅维基百科)
-c public
将社区字符串设置为公开。-v 1
将 SNMP 版本设置为 1。-O v
不要打印 OID。system.sysDescr.0
要查询的变量。此特定变量的描述:“实体的文本描述。此值应包括系统硬件类型、软件操作系统和网络软件的全名和版本标识。必须仅包含可打印的 ASCII 字符。”
sed-解析并转换文本。(维基百科)
's/day/night/'
在一行中查找字符串 day 的第一次出现,并将其替换为 night。's/STRING:\s//'
寻找STRING:\s并将其替换为空。这将删除STRING:\s来自输入。\s代表空格。
涉及一些 UNIX 支持的命令。我亲自使用 Cygwin 在 Windows 机器上使此链运行以获取这些命令。
答案3
最简单的方法是使用以下方法进行扫描nmap -O
:nmap 通常会根据操作系统正确确定一台机器是否是打印机。
nmap -O 192.168.1.1/24 -oG - | grep printer >> outfile
应该将其设置为每行一个条目,并将其转储到名为“outfile”的文件中。显然,将 IP 范围更改为您要扫描的任何范围