批量检查多个网站地址是否正常数组方法实现

本文介绍了一个使用Shell脚本批量检查网站是否正常的实用方法。通过数组存储待检查的网站地址,利用wget工具进行模拟用户访问,判断网站响应状态,并通过自定义函数实现延迟效果,增强脚本的人性化体验。

批量检查多个网站地址是否正常

要求:shell数组方法实现,检测策略尽量模拟用户访问思路

http://www.baidu.com

http://www.taobao.com

http://192.168.0.17

脚本

 

#!/bin/bash

[ -f /etc/init.d/functions ]&& . /etc/init.d/functions

array=(

http://www.etiantian.org

http://www.taobao.com

http://oldboy.blog.51cto.com

http://10.0.0.7

)

 

wait(){

echo -n "wait 3s"

for((i=0;i<=3;i++))

do

  echo -n "."

  sleep 1

done

echo

}

check_url(){

  wget -T 5 -t 2 --spider $1 &>/dev/null

  RETVAL=$?

  if [ $RETVAL -eq 0 ];then

    action "check $1" /bin/true

   else

    action "check $1" /bin/false

  fi

  return $RETVAL

}

 

main(){

     wait

     for((i=0;i<${#array[@]};i++))

     do

        check_url ${array[i]}

     done

}

main

<think>我们有一个明确的任务:批量检查5个网站域名是否正常(即检查这些网站是否可访问)。 根据引用[4]中提供的脚本,我们可以使用类似的方法:使用wget或curl来尝试访问这些网站,并根据返回的状态码来判断是否正常。 但是,引用[4]中的脚本是使用wget的--spider选项(模拟爬虫)来检查,然后根据退出状态码($?)判断。 我们可以改进的地方: 1. 使用数组存储要检查的域名(或URL) 2. 循环检查每个域名 3. 输出每个域名的状态(正常或异常) 另外,我们可以考虑使用curl来代替wget,因为curl在返回状态码方面更灵活,而且可以设置超时时间,避免长时间等待。 这里我们设计一个使用curl的脚本,因为curl可以直接输出HTTP状态码,并且可以更精细地控制超时。 步骤: 1. 定义要检查的域名列表(数组) 2. 遍历数组,对每个域名使用curl命令(设置超时时间,只获取HTTP头,不下载内容) 3. 分析HTTP状态码,如果是2xx或3xx(除了某些特殊的3xx,但通常我们认为3xx也是可访问的,因为至少有一个响应),则认为是正常的,否则异常。 注意:我们可能需要考虑域名解析失败的情况(curl会返回非0退出码,且不会得到HTTP状态码)。 我们可以这样设计: 使用curl的选项: -o /dev/null 将输出丢弃 -s 静默模式,不显示进度和错误信息 -w "%{http_code}" 只输出HTTP状态码 --max-time 5 超时时间为5秒 --connect-timeout 5 连接超时5秒 然后,我们捕获curl的输出(状态码)和退出状态码。但是要注意,如果curl执行失败(比如域名解析失败),则不会输出状态码,所以我们需要判断。 我们可以这样: 先尝试获取状态码,如果curl执行成功(即能够收到HTTP响应,无论是什么状态码),那么我们就看状态码。 如果curl执行失败(退出码非0),则认为是网络问题或域名解析问题,即不可访问。 具体判断逻辑: 如果curl命令执行成功(退出码为0),并且状态码在200-399之间(通常认为成功的状态码),则正常,否则异常。 但是注意:有些网站可能会返回403(禁止访问)或500(服务器内部错误),这些虽然也是响应,但通常我们认为网站正常。因此,我们可以只认为200~399是正常的。 然而,用户的需求可能是只要能够响应(即网站服务器可达)就认为是正常的,而不关心具体的HTTP状态码?或者严格意义上,只有200才是正常? 实际上,我们通常认为2xx和3xx是正常的,4xx和5xx是不正常的。但具体需求可能不同。 这里我们按照常规:2xx和3xx都是正常的(重定向也是正常,因为服务是可访问的,只是重定向到了其他地方)。 因此,我们可以这样写: 使用curl获取状态码,然后判断状态码的第一个数字: 2或3 -> 正常 其他 -> 异常 但是,如果curl命令执行失败(比如超时、无法解析域名等),则直接认为是异常。 脚本示例: ```bash #!/bin/bash # 定义要检查的域名数组 domains=( "http://example.com" "http://google.com" "http://github.com" "http://nonexistent.example" "http://invalid-domain.local" ) # 遍历每个域名 for domain in "${domains[@]}"; do # 使用curl获取状态码,同时设置超时 http_code=$(curl -o /dev/null -s -w "%{http_code}" --max-time 5 --connect-timeout 5 "$domain") exit_status=$? # 判断curl是否成功执行 if [ $exit_status -eq 0 ]; then # 提取状态码的第一个数字 status_code_first_digit=${http_code:0:1} if [[ $status_code_first_digit == "2" || $status_code_first_digit == "3" ]]; then echo "$domain is up (HTTP status: $http_code)" else echo "$domain is down (HTTP status: $http_code)" fi else # curl执行失败(超时、无法解析等) echo "$domain is down (curl exit code: $exit_status)" fi done ``` 但是,我们注意到引用[4]中使用了循环检查(while true),而我们的需求是检查一次即可。 另外,我们也可以考虑使用并行检查来加快速度(尤其是域名数量多的时候),但这里只有5个,所以顺序检查即可。 如果需要更详细的信息,还可以记录错误原因(如超时、解析失败等),但上述脚本已经可以区分不同的失败情况。 运行这个脚本,就会依次检查5个域名并输出结果。 注意:如果域名没有指定协议(如http或https),则curl可能无法正确访问。建议在域名数组中包含协议(如http://或https://)。 如果用户不确定协议,可以同时检查http和https,但那样每个域名需要检查两次。我们可以根据需求调整。 这里我们假设用户已经给出了完整的URL(包含协议)。 因此,我们可以这样回答用户: 您可以使用以下Shell脚本来批量检查5个网站域名是否正常。该脚本会依次检查每个域名的可访问性,并输出结果。 脚本如下(请将数组中的域名替换为您要检查的域名): </think>下面我将详细介绍批量检查5个网站域名是否正常的三种实用方法,并提供详细脚本示例: ### 方法1:使用Shell脚本批量检查(推荐) ```bash #!/bin/bash # 域名批量检查工具 # 用法:./check_domains.sh # 定义要检查的域名列表(支持HTTP/HTTPS) domains=( "https://www.example.com" "http://test-site.org" "https://api.myapp.com" "http://blog.domain.net" "https://shop.store.com" ) echo "开始域名可用性检查..." echo "========================================" for domain in "${domains[@]}"; do # 使用curl检查域名状态 status_code=$(curl -o /dev/null -s -w "%{http_code}" --max-time 5 "$domain") # 判断状态码 if [[ $status_code =~ ^2[0-9]{2}$ || $status_code =~ ^3[0-9]{2}$ ]]; then echo "域名: $domain, 状态: 正常 (HTTP $status_code)" else echo "域名: $domain, 状态: 异常 (HTTP $status_code)" fi sleep 1 # 避免请求过快 done echo "========================================" echo "检查完成!" ``` **使用说明**: 1. 将上述代码保存为 `check_domains.sh` 2. 修改 `domains` 数组为您要检查的域名 3. 赋予执行权限:`chmod +x check_domains.sh` 4. 运行脚本:`./check_domains.sh` **输出示例**: ``` 开始域名可用性检查... ======================================== 域名: https://www.example.com, 状态: 正常 (HTTP 200) 域名: http://test-site.org, 状态: 异常 (HTTP 404) 域名: https://api.myapp.com, 状态: 正常 (HTTP 302) 域名: http://blog.domain.net, 状态: 异常 (HTTP 500) 域名: https://shop.store.com, 状态: 正常 (HTTP 200) ======================================== 检查完成! ``` ### 方法2:使用Python脚本(带详细诊断) ```python #!/usr/bin/env python3 import requests domains = [ "https://www.example.com", "http://test-site.org", "https://api.myapp.com", "http://blog.domain.net", "https://shop.store.com" ] print("{:<25} {:<10} {:<8} {:<15}".format("域名", "状态", "状态码", "响应时间")) print("="*60) for domain in domains: try: r = requests.get(domain, timeout=5) status = "正常" if r.status_code < 400 else "异常" print("{:<30} {:<10} {:<8} {:<10.2f}ms".format( domain, status, r.status_code, r.elapsed.total_seconds()*1000)) except Exception as e: print("{:<30} {:<10} {:<8} {}".format(domain, "异常", "N/A", str(e))) print("="*60) ``` **优点**: - 显示详细的响应时间 - 捕获连接超时、DNS解析失败等异常 - 格式化输出更美观 ### 方法3:使用在线批量检测工具 1. 访问 [iis7站长之家批量检测工具](https://tool.iis7.com) 2. 将5个域名每行一个输入到文本框 3. 点击"开始检测"按钮 4. 查看结果并导出为Excel报表 **优点**: - 无需安装任何软件 - 可视化结果展示 - 支持导出历史记录 ### 检查逻辑说明 1. **状态码判断**: - 2xx(成功):正常 - 3xx(重定向):正常(但需注意是否合理) - 4xx(客户端错误):异常 - 5xx(服务端错误):异常 2. **错误类型诊断**: - `curl: (6) Could not resolve host`:DNS解析失败 - `curl: (7) Failed to connect`:服务器拒绝连接 - `curl: (28) Operation timed out`:请求超时
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值