You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本需按Ctrl+C才输出MAC地址结果的技术问题

问题原因分析

你的脚本出现这种情况,核心原因有两个:

  1. netdiscover 默认是持续运行的ARP扫描工具,不会自动终止,会一直占用输出文件 /tmp/discover.txt,直到你手动按下Ctrl+C终止它,此时文件才会被关闭,后续的cat和grep命令才能完成执行,for循环才会开始输出内容。
  2. 你写的管道 sudo netdiscover -P > /tmp/discover.txt | sleep 10 是无效的——netdiscover的标准输出已经被重定向到文件,管道没有实际数据流转,sleep 10只是和netdiscover并行运行10秒,但不会终止扫描进程。

两种解决方案

方案一:让netdiscover自动停止后批量处理

给netdiscover添加参数让它自动终止扫描,比如指定扫描时长(-t参数,单位秒)或ARP请求次数(-c参数),这样扫描完成后会自动退出,无需手动终止:

#!/bin/bash

# 扫描10秒后自动停止,输出写入临时文件
sudo netdiscover -P -t 10 > /tmp/discover.txt

# 提取MAC地址并逐个输出
for i in $(grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' /tmp/discover.txt); do 
    echo "testing $i"
done

# 可选:扫描完成后清理临时文件
rm /tmp/discover.txt

方案二:实时输出扫描到的MAC地址

如果想在扫描过程中实时展示新发现的MAC,无需等待扫描结束,可以直接通过管道处理输出,同时禁用缓冲确保实时输出:

#!/bin/bash

# 直接管道流转输出,用stdbuf禁用grep的块缓冲,实时传递结果
sudo netdiscover -P | stdbuf -o0 grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' | while read -r mac; do
    echo "testing $mac"
done

这里用while read代替for循环,避免命令替换$(...)需要等待全部输出完成才展开的问题,stdbuf -o0让grep每匹配到一个MAC就立即输出。


内容的提问来源于stack exchange,提问作者boog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:26:04