Bash脚本需按Ctrl+C才输出MAC地址结果的技术问题
问题原因分析
你的脚本出现这种情况,核心原因有两个:
netdiscover默认是持续运行的ARP扫描工具,不会自动终止,会一直占用输出文件/tmp/discover.txt,直到你手动按下Ctrl+C终止它,此时文件才会被关闭,后续的cat和grep命令才能完成执行,for循环才会开始输出内容。- 你写的管道
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
相关产品推荐
相关产品推荐

