如何解决airodump-ng无法按timeout设置5秒后停止的问题?
解决airodump-ng无法被timeout终止且输出无法正确保存的问题
问题分析
你遇到的核心问题有两个:一是timeout无法终止airodump-ng进程,二是输出无法正确存入变量用于whiptail展示。根源在于:
airodump-ng会通过标准错误流输出部分终端内容,默认timeout无法完整监控这类进程状态;sudo放在timeout内部时,timeout没有足够权限向root运行的airodump-ng发送终止信号;- 用数组赋值
netwroks=($(...))会破坏输出的换行格式,还存在变量名拼写错误(netwroks应为networks)。
解决方案1:调整权限与输出重定向
把sudo放在timeout外层,确保timeout能管理root进程,同时合并标准错误到标准输出,完整捕获所有内容:
function aircrack() { sudo airmon-ng check kill name=($(sudo /usr/sbin/airmon-ng )) sudo airmon-ng start ${name[5]} name=($(sudo /usr/sbin/airmon-ng )) # 修正变量名,调整sudo与timeout顺序,合并输出流 networks=$(sudo timeout 5s airodump-ng ${name[5]} 2>&1) }
sudo timeout ...:让timeout以root权限运行,可正常向airodump-ng发送终止信号;2>&1:将标准错误输出合并到标准输出,避免扫描状态信息丢失;- 去掉数组括号
():用普通变量保存多行原始输出,适配whiptail的展示需求。
解决方案2:手动后台运行+强制终止(兜底方案)
如果timeout仍失效,可手动控制进程生命周期:
function aircrack() { sudo airmon-ng check kill name=($(sudo /usr/sbin/airmon-ng )) sudo airmon-ng start ${name[5]} name=($(sudo /usr/sbin/airmon-ng )) # 后台启动airodump-ng,输出写入临时文件 sudo airodump-ng ${name[5]} 2>&1 > /tmp/airodump_scan.log & local airodump_pid=$! # 等待5秒 sleep 5 # 强制终止进程(忽略不存在进程的错误) sudo kill -9 $airodump_pid 2>/dev/null # 读取扫描结果到变量 networks=$(cat /tmp/airodump_scan.log) # 清理临时文件 rm -f /tmp/airodump_scan.log }
- 用
&将进程后台运行,$!获取其PID; sudo kill -9强制终止进程,确保彻底停止;- 临时文件存储输出,避免后台进程直接输出到变量的异常。
适配whiptail展示
获取到networks变量后,可通过以下命令在whiptail中展示完整扫描结果:
whiptail --title "无线网络扫描结果" --textbox <(echo "$networks") 25 80 --scrolltext
内容的提问来源于stack exchange,提问作者Nate-ar
相关产品推荐
相关产品推荐

