如何用脚本实现MTR批量追踪同网段主机并筛选2跳目标
我来给你详细讲讲这两个问题的实现思路和具体脚本,都是实际工作中常用的方案:
1. 用脚本实现MTR对多台主机执行路由追踪
要批量跑MTR,核心就是循环遍历目标主机列表,调用MTR的非交互式模式生成报告,还可以把结果单独保存方便后续分析。MTR的--report参数可以直接生成汇总报告,不用交互式操作,非常适合脚本调用。
这里给你一个bash脚本的例子:
#!/bin/bash # 可以直接定义目标主机数组,或者从文件读取 TARGETS=("192.168.1.1" "172.16.10.5" "10.0.0.1") # 如果主机很多,推荐从文件读取:TARGETS=$(cat ./hosts_list.txt) # 循环处理每个目标主机 for host in "${TARGETS[@]}"; do echo "=== 正在对 $host 执行路由追踪 ===" # 生成MTR报告并保存到单独文件,--report-cycles指定发送的数据包数量 mtr --report --report-cycles 10 "$host" > "mtr_result_$host.txt" # 同时在控制台输出结果 cat "mtr_result_$host.txt" echo -e "\n" done
脚本说明:
- 每个主机的MTR结果会保存成
mtr_result_<主机地址>.txt文件,方便后续复盘 - 如果目标主机数量较多,把主机列表写到
hosts_list.txt(每行一个主机地址),用while read host; do ... done < hosts_list.txt的方式循环会更灵活 - 可以根据需求调整
--report-cycles的数值,数值越小速度越快,但结果的准确性会略有下降
2. 扫描172.16.0.0/16网段,找出仅需2跳可达的主机
直接对172.16.0.0/16的65536个地址跑MTR效率极低,所以建议分两步走:先快速探测存活主机,再对存活主机执行MTR并解析跳数。这里用fping做快速存活探测(比原生ping快很多),再用awk解析MTR报告里的跳数。
具体脚本如下:
#!/bin/bash # 定义目标网段 SUBNET="172.16.0.0/16" # 临时保存存活主机的文件 ALIVE_HOSTS="/tmp/alive_hosts.txt" # 第一步:快速探测网段内的存活主机 echo "正在探测网段 $SUBNET 内的存活主机..." fping -a -g "$SUBNET" 2>/dev/null > "$ALIVE_HOSTS" # 检查是否有存活主机 if [ ! -s "$ALIVE_HOSTS" ]; then echo "网段内未发现存活主机" exit 1 fi echo "开始对存活主机执行MTR,筛选2跳可达的目标..." echo "=== 2跳可达的主机列表 ===" # 第二步:对每个存活主机执行MTR,解析跳数 while read host; do # 提取MTR报告中目标主机对应的跳数(最后一行的Hop数值) hop_count=$(mtr --report --report-cycles 3 "$host" | awk '/^[0-9]+/ {last_hop=$1} END {print last_hop}') # 判断跳数是否为2 if [ "$hop_count" -eq 2 ]; then echo "$host" fi done < "$ALIVE_HOSTS" # 清理临时文件 rm "$ALIVE_HOSTS"
补充说明:
- 如果系统没有安装
fping,可以用nmap替代存活探测:nmap -sn "$SUBNET" | grep "Nmap scan report for" | awk '{print $5}' > "$ALIVE_HOSTS",只是速度会慢一些 - 扫描/16网段耗时较长,建议后台执行脚本:
./scan_script.sh > 2hop_hosts.txt & - 部分系统需要root权限执行MTR或fping,遇到权限问题加上
sudo即可
内容的提问来源于stack exchange,提问作者user1150125
相关产品推荐
相关产品推荐

