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

学校项目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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:03