学校项目Bash IP检测脚本无法生成ping结果HTML报告求助
故障原因&修复方案
核心问题
你当前脚本无法生成完整HTML报告的原因如下:
- 预定义的
htmlsite变量是固定写死的测试内容,没有动态拼接每个IP的检测结果 - 所有IP检测完成后,没有将最终拼接好的HTML内容写入你传入的第二个参数指定的输出文件
- 邮件发送逻辑仅记录了最后一次ping的结果,没有存储所有IP的检测数据
修复点说明
- 调整HTML模板结构,初始化时仅保留头部、样式和表格表头部分,表格主体留空后续动态追加
- 每次循环检测完IP有效性和连通性后,将对应IP和状态的表格行追加到HTML内容变量中
- 所有IP处理完成后,拼接HTML尾部闭合标签,将完整内容写入第二个参数指定的HTML文件
- 修复邮件生成逻辑,将所有检测结果写入邮件内容,发送完成后自动清理临时邮件文件
修复后完整脚本
#!/bin/bash # 颜色定义 reset="\033[0;m" BIGreen="\e[1;92m" BIRed="\e[1;91m" BICyan="\e[1;96m" BIPurple="\e[1;95m" BIWhite="\e[1;97m" BIYellow="\e[1;93m" # 参数数量要求 args="2" # 日期 dateresult="$(date)" # 初始化HTML头部模板 html_content="<!DOCTYPE html> <html lang=\"en\"> <head> <meta charset=\"UTF-8\"> <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> <title>IP检测报告 $dateresult</title> <style> body{ margin: auto; padding: 20px; } h1{ text-align: center; } .date{ text-align: center; margin-bottom: 20px; } table{ border: solid 1px black; border-collapse: collapse; margin: auto; width: 80%; } td,th{ border: solid 1px black; padding: 8px; text-align: center; } .ok{ color: green; font-weight: bold; } .fail{ color: red; font-weight: bold; } .unknown{ color: orange; font-weight: bold; } </style> </head> <body> <h1>INFO SERVEUR</h1> <div class=\"date\">检测时间:$dateresult</div> <table> <tr> <th>IP</th> <th>STATUS</th> </tr>" # 初始化邮件内容 mail_content="IP检测报告 检测时间:$dateresult\n\n" # 参数校验 if [ $# -ne $args ] then clear printf "=========================================================================================================\n" printf "\n$BIYellow/!\ $BIRed 发生错误 $BIYellow/!\ \n" printf $BICyan"\n请传入两个参数,格式如下:\n" printf $BIGreen"\n=> 第一个参数:存储待检测IP的文件路径\n" printf $BIGreen"=> 第二个参数:生成的HTML报告文件名(无需加后缀)\n" printf "\n=> 示例:\n" printf $BIWhite"\n=> ./pinger.sh list.txt ip_report\n\n" printf $reset"=========================================================================================================\n\n" exit 1 fi # 待检测IP文件存在性校验 if [ ! -e $1 ] then clear printf $BIRed"\n░██╗░░░░░░░██╗░█████╗░██████╗░███╗░░██╗██╗███╗░░██╗░██████╗░\n" printf "░██║░░██╗░░██║██╔══██╗██╔══██╗████╗░██║██║████╗░██║██╔════╝░\n" printf "░╚██╗████╗██╔╝███████║██████╔╝██╔██╗██║██║██╔██╗██║██║░░██╗░\n" printf "░░████╔═████║░██╔══██║██╔══██╗██║╚████║██║██║╚████║██║░░╚██╗\n" printf "░░╚██╔╝░╚██╔╝░██║░░██║██║░░██║██║░╚███║██║██║░╚███║╚██████╔╝\n" printf "░░░╚═╝░░░╚═╝░░╚═╝░░╚═╝╚═╝░░╚═╝╚═╝░░╚══╝╚═╝╚═╝░░╚══╝░╚═════╝░\n" printf "\n错误:文件 $BIWhite/| $BIRed"$1" $BIWhite|\ "$BIRed"不存在\n\n" exit 1 fi # 开始检测 clear printf $BIPurple"\n\n" printf "██████╗░████████╗░██████╗ ░██████╗██╗░█████╗░\n" sleep 0.1 printf "██╔══██╗╚══██╔══╝██╔════╝ ██╔════╝██║██╔══██╗\n" sleep 0.1 printf "██████╦╝░░░██║░░░╚█████╗░ ╚█████╗░██║██║░░██║\n" sleep 0.1 printf "██╔══██╗░░░██║░░░░╚═══██╗ ░╚═══██╗██║██║░░██║\n" sleep 0.1 printf "██████╦╝░░░██║░░░██████╔╝ ██████╔╝██║╚█████╔╝\n" sleep 0.1 printf "╚═════╝░░░░╚═╝░░░╚═════╝░ ╚═════╝░╚═╝░╚════╝░\n\n" sleep 0.1 printf $BIWhite"=> ======================= ENT MAROILLES ========================\n\n" printf $BIWhite"=> 检测时间 : $dateresult\n\n" # 遍历IP列表 for ping in $(cat $1) do IP=$(echo ${ping} | xargs) # 去掉首尾空格 # 拆分IP段 oct1="$(echo $IP | cut -d"." -f1)" oct2="$(echo $IP | cut -d"." -f2)" oct3="$(echo $IP | cut -d"." -f3)" oct4="$(echo $IP | cut -d"." -f4)" status="" status_class="" # 校验IP格式合法性 if [ -z "$oct1" ] || [ $oct1 -lt 0 ] || [ $oct1 -gt 255 ] || \ [ -z "$oct2" ] || [ $oct2 -lt 0 ] || [ $oct2 -gt 255 ] || \ [ -z "$oct3" ] || [ $oct3 -lt 0 ] || [ $oct3 -gt 255 ] || \ [ -z "$oct4" ] || [ $oct4 -lt 0 ] || [ $oct4 -gt 255 ] then echo -e "=> "$BIRed"$ping : "$BIYellow"[ UNKNOWN IP ]"$reset"" status="UNKNOWN IP" status_class="unknown" else # 执行ping检测 ping -w 1 -c 1 $ping > /dev/null 2>&1 if [ $? -eq 0 ] then printf "=> $BIWhite$ping : "$BIGreen"[ OK ]\n"$reset"" status="OK" status_class="ok" else printf "=> $BIWhite$ping : "$BIRed"[ NOT OK ]\n"$reset"" status="NOT OK" status_class="fail" fi fi # 追加到HTML内容 html_content="$html_content <tr> <td>$IP</td> <td class=\"$status_class\">$status</td> </tr>" # 追加到邮件内容 mail_content="$mail_content$IP : $status\n" done # 拼接HTML尾部 html_content="$html_content </table> </body> </html>" printf $BIWhite"\n=> ============================ 检测结束 =============================\n" # 生成HTML报告 output_file="$2.html" echo "$html_content" > $output_file printf "=> HTML报告已生成:$output_file\n" # 生成邮件内容并发送 echo -e "$mail_content" > mail.txt printf "\n=> 请输入接收报告的邮箱地址 => " read email sendmail $email < mail.txt printf "=> 检测结果已发送至:$email\n" # 清理临时文件 rm -f mail.txt
使用说明
运行方式和你之前的说明一致:./pinger.sh 待检测IP列表文件 生成的HTML报告名称
执行完成后会在当前目录生成对应名称的.html报告文件,同时会把检测结果发送到你输入的邮箱。
内容的提问来源于stack exchange,提问作者Enzo
相关产品推荐
相关产品推荐

