当前位置: 首页 > news >正文

[运维] 服务器本地网络可用性检查脚本

引言

在日常活动中,我遇到过一个令人头疼的问题。测试使用的远程终端在第二天继续使用时可能就发生无法与外网通信的情况,往往连上终端后在拉取资源时才能发现。这导致每次使用前都需要手动检查网络状况,增加了不必要的麻烦。为了简化这一过程,我决定编写一个脚本,实现一键网络检测。
本文将介绍这样一个简单的 Shell 脚本,用于检查服务器内外网络的连接状态。该脚本不仅可以检查预设的内部和外部网络节点,还可以接受用户输入的额外 IP 地址进行检测。

脚本代码

#!/bin/bash# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color# 定义要测试的IP地址
INTERNAL_IP="127.0.0.1"
EXTERNAL_IP1="223.5.5.5"  # 阿里云公共DNS
EXTERNAL_IP2="8.8.8.8"    # 谷歌公共DNS# 获取当前服务器的主要IP地址
DEFAULT_ROUTE=$(ip route | grep default | awk '{print $3}')
DEFAULT_INTERFACE=$(ip route | grep default | awk '{print $5}')
SERVER_IP=$(ip addr show $DEFAULT_INTERFACE | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n 1)# 获取本地网关
GATEWAY_IP1=$DEFAULT_ROUTE# 提示用户输入额外检测的IP地址
read -p "请输入需要额外检测的IP地址(留空则按回车跳过): " EXTRA_IP# 用数组存储测试结果
results=()# 函数:检查网络连接
check_connection() {local ip=$1local name=$2if ! [[ $ip =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; thenecho -e "${RED}输入的IP格式有误,不检测${NC}"results+=("$name: 失败 (IP: $ip)")returnfilocal ping_output=$(ping -c 4 $ip 2>/dev/null)local exit_code=$?local result=$(echo "$ping_output" | tail -1 | awk -F '/' '{print $5}')if [ $exit_code -ne 0 ] || [ -z "$result" ]; thenecho -e "${RED}无法连接到 ${name} (${ip})${NC}"results+=("$name: 失败 (IP: $ip)")elseecho -e "${GREEN}成功连接到 ${name} (${ip}) - 平均响应时间: ${result}ms${NC}"results+=("$name: 成功 (IP: $ip)")fi
}# 打印标题
echo -e "${GREEN}开始网络连接检查...${NC}"
echo -e "${GREEN}当前服务器IP地址: ${SERVER_IP}${NC}"# 检查额外指定的IP地址
if [ -n "$EXTRA_IP" ]; thencheck_connection $EXTRA_IP "额外检测的IP地址"
elseecho -e "${NC}未指定额外的IP地址,不检测${NC}"
fi# 检查内部网络
check_connection $INTERNAL_IP "内部网络"# 检查本地网关
check_connection $GATEWAY_IP1 "本地网关"# 检查外部网络(阿里云公共DNS)
check_connection $EXTERNAL_IP1 "外部网络 (阿里云)"# 检查外部网络(谷歌公共DNS)
check_connection $EXTERNAL_IP2 "外部网络 (谷歌)"# 结束语
all_success=true
for result in "${results[@]}"; doif [[ $result == *"失败"* ]]; thenall_success=falsebreakfi
doneif [ "$all_success" = true ]; thenecho -e "\n${GREEN}所有节点网络正常。${NC}"
elseecho -e "\n${RED}以下节点存在网络问题:${NC}"for result in "${results[@]}"; doif [[ $result == *"失败"* ]]; thenecho -e "${RED}${result}${NC}"fidone
fiecho -e "\n${GREEN}网络连接检查完成。${NC}"

主要模块详解

  1. 定义要测试的IP地址

    INTERNAL_IP="127.0.0.1"
    EXTERNAL_IP1="223.5.5.5"  # 阿里云公共DNS
    EXTERNAL_IP2="8.8.8.8"    # 谷歌公共DNS
    

    详解:通过常用的网络地址来检验服务器内外网的连通性。127.0.0.1 是本地环回地址,用于检查内部网络连接。223.5.5.58.8.8.8 分别是阿里云和谷歌的公共DNS服务器,用于检查外部网络连接。

  2. 获取当前服务器的主要IP地址

    DEFAULT_ROUTE=$(ip route | grep default | awk '{print $3}')
    DEFAULT_INTERFACE=$(ip route | grep default | awk '{print $5}')
    SERVER_IP=$(ip addr show $DEFAULT_INTERFACE | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n 1)
    

    详解:这部分代码通过解析路由表和网络接口信息,获取当前服务器的主要IP地址。

    • DEFAULT_ROUTE 获取默认网关的IP地址。
    • DEFAULT_INTERFACE 获取默认网关使用的网络接口名称,为下一步获取主机IP提供便利。
    • SERVER_IP 获取主机IP。
  3. 构建功能函数:检查网络连接

    check_connection() {local ip=$1local name=$2if ! [[ $ip =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; thenecho -e "${RED}输入的IP格式有误,不检测${NC}"results+=("$name: 失败 (IP: $ip)")returnfilocal ping_output=$(ping -c 4 $ip 2>/dev/null)local exit_code=$?local result=$(echo "$ping_output" | tail -1 | awk -F '/' '{print $5}')if [ $exit_code -ne 0 ] || [ -z "$result" ]; thenecho -e "${RED}无法连接到 ${name} (${ip})${NC}"results+=("$name: 失败 (IP: $ip)")elseecho -e "${GREEN}成功连接到 ${name} (${ip}) - 平均响应时间: ${result}ms${NC}"results+=("$name: 成功 (IP: $ip)")fi
    }
    

    详解:这个函数负责检查给定IP地址的网络连接状态,并将结果记录到 results 数组中。

    • local ip=$1local name=$2:将传入的参数分别赋值给局部变量 ipname
    • if ! [[ $ip =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then:检查是否为标准IPv4地址格式。如果不正确,输出错误信息并返回。
    • local ping_output=$(ping -c 4 $ip 2>/dev/null):使用 ping 命令发送4次ICMP请求,并捕获输出。
    • local exit_code=$?:获取 ping 命令的退出状态码。
    • local result=$(echo "$ping_output" | tail -1 | awk -F '/' '{print $5}'):从 ping 输出中提取平均响应时间。
    • if [ $exit_code -ne 0 ] || [ -z "$result" ]; then:如果 ping 命令执行失败,exit_code 状态码不为0;如果 ping 命令没有返回有效的响应时间,result提取的平均响应时间将为空字符串;这两种结果都定义为失败,如果失败,输出错误信息并记录结果;否则,输出成功信息并记录结果。
  4. 整体结果判断

    all_success=true
    for result in "${results[@]}"; doif [[ $result == *"失败"* ]]; thenall_success=falsebreakfi
    doneif [ "$all_success" = true ]; thenecho -e "\n${GREEN}所有节点网络正常。${NC}"
    elseecho -e "\n${RED}以下节点存在网络问题:${NC}"for result in "${results[@]}"; doif [[ $result == *"失败"* ]]; thenecho -e "${RED}${result}${NC}"fidone
    fiecho -e "\n${GREEN}网络连接检查完成。${NC}"
    

    详解:根据 results 数组中的内容,输出检查结果和总结信息。

    • all_success=true:初始化一个布尔变量 all_success,表示所有节点是否都成功连接。
    • for result in "${results[@]}"; do:遍历 results 数组,检查是否有失败的记录。
    • if [ "$all_success" = true ]; then:如果所有节点都成功连接,输出成功信息;否则,输出失败的节点列表。
    • echo -e "\n${GREEN}网络连接检查完成。${NC}":输出检查完成的信息。

使用效果演示

[root@halo ~]# sh check_network.sh                             # 指定正常检测 
请输入需要额外检测的IP地址(留空则按回车跳过): 192.168.1.215   
开始网络连接检查...
当前服务器IP地址: 192.168.111.130
成功连接到 额外检测的IP地址 (192.168.1.215) - 平均响应时间: 1.020ms
成功连接到 内部网络 (127.0.0.1) - 平均响应时间: 0.083ms
成功连接到 本地网关 (192.168.111.2) - 平均响应时间: 0.588ms
成功连接到 外部网络 (阿里云) (223.5.5.5) - 平均响应时间: 16.654ms
成功连接到 外部网络 (谷歌) (8.8.8.8) - 平均响应时间: 53.729ms所有节点网络正常。
网络连接检查完成。[root@halo ~]# sh check_network.sh                             # 输入检测IP有误 
请输入需要额外检测的IP地址(留空则按回车跳过): hello
开始网络连接检查...
当前服务器IP地址: 192.168.111.130
输入的IP格式有误,不检测
成功连接到 内部网络 (127.0.0.1) - 平均响应时间: 0.073ms
成功连接到 本地网关 (192.168.111.2) - 平均响应时间: 0.406ms
成功连接到 外部网络 (阿里云) (223.5.5.5) - 平均响应时间: 16.665ms
成功连接到 外部网络 (谷歌) (8.8.8.8) - 平均响应时间: 53.524ms以下节点存在网络问题:
额外检测的IP地址: 失败 (IP: hello)
网络连接检查完成。[root@halo ~]# sh check_network.sh                             # 指定检测IP无法通信 
请输入需要额外检测的IP地址(留空则按回车跳过): 192.168.1.888
开始网络连接检查...
当前服务器IP地址: 192.168.111.130
无法连接到 额外检测的IP地址 (192.168.1.888)
成功连接到 内部网络 (127.0.0.1) - 平均响应时间: 0.068ms
成功连接到 本地网关 (192.168.111.2) - 平均响应时间: 0.857ms
成功连接到 外部网络 (阿里云) (223.5.5.5) - 平均响应时间: 14.097ms
成功连接到 外部网络 (谷歌) (8.8.8.8) - 平均响应时间: 47.028ms以下节点存在网络问题:
额外检测的IP地址: 失败 (IP: 192.168.1.888)
网络连接检查完成。

结语

通过这次尝试,我编写了一个简单的 Shell 脚本,用于检查服务器的网络连接状态。这个脚本帮助我在工作前快速检测服务器网络连接情况,及时发现和定位问题。希望这个小工具能为你在日常工作中带来便利。如果你有任何问题或建议,欢迎在评论区留言分享!希望这篇文章对你有所帮助!


相关文章:

[运维] 服务器本地网络可用性检查脚本

引言 在日常活动中&#xff0c;我遇到过一个令人头疼的问题。测试使用的远程终端在第二天继续使用时可能就发生无法与外网通信的情况&#xff0c;往往连上终端后在拉取资源时才能发现。这导致每次使用前都需要手动检查网络状况&#xff0c;增加了不必要的麻烦。为了简化这一过…...

MYSQL-显示信息关于服务器插件语法(二十五)

13.7.5.25 SHOW PLUGINS 语句 SHOW PLUGINSSHOW PLUGINS 显示信息 关于服务器插件。 SHOW PLUGINS 输出示例&#xff1a; mysql> SHOW PLUGINS\G *************************** 1. row ***************************Name: binlogStatus: ACTIVEType: STORAGE ENGINE Librar…...

【线下培训】龙信受邀参加开封市公安局举办的电子数据取证培训班

文章关键词&#xff1a;电子数据取证、手机取证、云取证、国产化取证 为了提升开封市公安机关在互联网电子数据取证分析方面的专业能力&#xff0c;龙信为开封市公安机关量身打造了一场高质量的电子数据取证分析技能培训课程。 本次培训课程不仅涵盖了电子数据取证的基础理论、…...

软件测试工程师面试整理 —— 编程与自动化!

在软件测试领域&#xff0c;编程与自动化是提升测试效率、覆盖率和可靠性的关键因素。掌握编程技术和自动化测试框架&#xff0c;能够帮助测试人员有效地执行大量重复性测试任务&#xff0c;并迅速反馈软件的质量状况。以下是编程与自动化在测试中的主要应用及相关技术介绍&…...

【鸿蒙新闻】10月29日警用鸿蒙开发者大会在北京胜利召开,开启智慧应用新时代!

10月29日&#xff0c;在公安部科技信息化局、公安部装备财务局指导下&#xff0c;由公安部第一研究所主办&#xff0c;鼎桥通信技术有限公司、OpenHarmony生态委员会及公共安全专委会协办的警用鸿蒙开发者大会在北京胜利召开。会议以“拥抱警鸿创新生态 开启智慧应用新时代”为…...

java.io.IOException: Too many open files

java.io.IOException: Too many open files 前言&#xff1a; 项目最近报 java.io.IOException: Too many open files 问题&#xff0c;大概意思是&#xff1a;意味着你的应用程序尝试打开的文件描述符数量超过了系统允许的最大数量&#xff0c;在linux中每个进程打开的文件描…...

ElementUI el-form表单多层数组的校验

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; ElementUI el-form表单多层数组的校验 页面效果&#xff1a; 数据结构&#xff1a; addform: {code: ,type: ,value: ,state: 1,remark: ,fieldList: [{fieldCode: ,resolverEntities: [{resolverType: , re…...

常见的向量范数、矩阵范数和对偶范数-对偶范数详细证明过程

文章目录 对偶范数一般定义&#xff1a; p p p-范数和 q q q-范数的对偶性特例 1&#xff1a;无穷范数和 1 范数的对偶性特例 2&#xff1a;2 范数的对偶是自身特例 3&#xff1a;有限范数与 0 范数的对偶关系&#xff08;稀疏性&#xff09;特例 4&#xff1a;核范数&#xff…...

Android 滴滴面经

Android 滴滴面经 文章目录 Android 滴滴面经一面二面三面 一面 Activity的启动的四种模式&#xff0c;四种启动模式的应用场景&#xff0c;单例模式的启动场景&#xff0c;我回答的是闹钟&#xff0c;反问&#xff1a;在单例模式下闹钟运行时点击back键&#xff0c;是回退到闹…...

angular登录按钮输入框监听

说明&#xff1a;angular实现简单的登录页面&#xff0c;监听输入框的值&#xff0c;打印出来&#xff0c;按钮监听&#xff0c;打印数据 效果图: step1:E:\projectgood\ajnine\untitled4\src\app\app.config.ts import { ApplicationConfig, provideZoneChangeDetection } …...

硅谷甄选(10)用户管理

用户管理模块 9.1 静态搭建 主要是el-form、el-pagination <template><el-card style"height: 80px"><el-form :inline"true" class"form"><el-form-item label"用户名:"><el-input placeholder"请…...

Unity XR Interaction Toolkit 开发教程(2):导入 SDK【3.0 以上版本】

文章目录 &#x1f4d5;课程总结&#x1f4d5;安装 Unity 编辑器与打包模块&#x1f4d5;导入 OpenXR&#x1f4d5;导入 XR Interaction Toolkit&#x1f4d5;打包发布 获取完整课程以及答疑&#xff0c;工程文件下载&#xff1a; https://www.spatialxr.tech/ 视频试看链接&a…...

element-plus校验单个form对象合法性

在 Vue 中&#xff0c;循环生成的表单列表&#xff0c;并且每个表单中包含多个对象&#xff0c;使用 v-for 来创建这些表单&#xff0c;并且使用动态 prop 路径来验证单个对象是否满足必填校验。 <template><el-form ref"formRef" :model"form" …...

Linux常见命令合集

目录 1.ls 列出指定目录下的文件和和文件夹 2.cd change directory 切换目录 3. cat 查看文件 4.more 分屏查看文件 5.tail从后往前查看指定文件 6.mkdir 创建目录 7.rm强制删除指定目录和文件 8.cp复制文件和目录 9.mv移动和重命名命令 10.tar命令打包和拆包 重点是…...

__init__.py __all__和 __name__的作用及其用法

__ init__.py 的作用及其用法&#xff1a; 包下的__init__.py 所在目录是一个模块包,本身也是一个模块,可用于定义模糊导入时要导入的内容。当我们导入一个包的时候&#xff0c;包下的__init__.py中的代码会自动执行&#xff0c;因此在某些大的项目被使用频率较高的模块&#x…...

js操作数组的方法 / js操作字符串的方法

操纵数组的方法 常见的有10种 push() -在数组末尾添加一个或多个元素&#xff0c;并返回新的长度。 pop() -删除数组的最后一个元素&#xff0c;并返回那个元素。 shift() -删除数组的第一个元素&#xff0c;并返回那个元素。 unshift() -在数组的开始添加一个或多个元素&…...

Docker 部署RocketMQ

FROM: Docker安装RocketMQ教程_docker 安装rocketmq-CSDN博客...

Linux(Cent OS)环境离线安装mkfontscale mkfontdir命令 解决java项目在linux系统下无法获取中文字体问题

https://download.csdn.net/download/mlc19860417/89938093 1 附件下载 1.libfontenc-1.1.3-3.amzn2.0.2.x86_64.rpm 2.libXfont-1.5.2-1.amzn2.0.2.x86_64.rpm 3.xorg-x11-font-utils-7.5-20.amzn2.0.2.x86_64.rpm 4.fontpackages-filesystem-1.44-8.amzn2.noarch.rpm 5.sti…...

计算堆栈中的剩余数字

更多关于刷题的内容欢迎订阅我的专栏华为刷题笔记 该专栏题目包含两部分&#xff1a; 100 分值部分题目 200 分值部分题目 所有题目都会陆续更新&#xff0c;订阅防丢失 题目描述&#xff1a; 向一个空栈中依次存入正整数&#xff0c; 假设入栈元素 n ( 1 < n < 2…...

笔记:mysql升级 5.6至5.7

说明 一台已有数据的机器&#xff0c;停机升级&#xff0c;从MySQL Server5.6.48&#xff0c;升级到 5.7.38。 环境介绍 10.24.10.247&#xff0c;Mysql 5.6.48 CentOS Linux release 7.9.2009 (Core) 32G内存、500G数据盘/home&#xff1b; 实际数据量约120M&#xff0c;2个…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...

大模型真的像人一样“思考”和“理解”吗?​

Yann LeCun 新研究的核心探讨&#xff1a;大语言模型&#xff08;LLM&#xff09;的“理解”和“思考”方式与人类认知的根本差异。 核心问题&#xff1a;大模型真的像人一样“思考”和“理解”吗&#xff1f; 人类的思考方式&#xff1a; 你的大脑是个超级整理师。面对海量信…...

基于Python的气象数据分析及可视化研究

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...