Linux双网卡绑定状态验证脚本

前景

公司内交换机切换,需提前验证服务器系统主备网卡绑定状态

脚本

需提前配置好YUM源或已安装lldpd服务

#!/bin/bash



# 安装必要工具
install_lldpad() {
    if ! command -v lldptool >/dev/null 2>&1; then
        echo "安装lldpad服务..."
        yum install -y lldpad >/dev/null 2>&1
        echo "启动lldpad服务..."
        systemctl start lldpad >/dev/null 2>&1
    fi
}

# 可靠的低级LLDP解析
parse_lldp_output() {
    local lldp_output="$1"
    local chassis_id=""
    local port_id=""
    local sys_name=""

    # 使用IFS读行进行精确解析
    while IFS= read -r line; do
        # 提取Management Address MAC
        if [[ "$line" =~ "Management Address TLV" ]]; then
            read -r mac_line
            if [[ "$mac_line" =~ MAC:[[:space:]]*([0-9a-f:]{17}) ]]; then
                chassis_id="${BASH_REMATCH[1]}"
            fi
        fi
        
        # 提取Port ID
        if [[ "$line" =~ "Port ID TLV" ]]; then
            read -r port_line
            # 精确匹配Ifname格式
            if [[ "$port_line" =~ Ifname:[[:space:]]*(.+) ]]; then
                port_id="${BASH_REMATCH[1]}"
            fi
        fi
        
        # 提取System Name
        if [[ "$line" =~ "System Name TLV" ]]; then
            read -r sys_line
            sys_name="${sys_line}"
        fi
    done <<< "$lldp_output"
    
    echo "$chassis_id $port_id $sys_name"
}

# 专业的bond处理函数
process_bond() {
    local bond="$1"
    local bond_file="/proc/net/bonding/$bond"
    
    # 确保bond文件存在
    [[ -f "$bond_file" ]] || return

    # 精确解析bond信息
    local mode=$(grep "Bonding Mode" "$bond_file" | awk -F': ' '{print $2}')
    local slaves=$(awk '/Slave Interface:/{slave=$3} /MII Status: up$/{if(slave) print slave}' "$bond_file")
    local up_count=$(echo "$slaves" | wc -l)
    
    # 输出关键信息
    echo "================================================================="
    printf "%-15s: %s\n" "Bond接口" "$bond"
    printf "%-15s: %s\n" "绑定模式" "$mode"
    printf "%-15s: %d\n" "UP网卡数量" "$up_count"
    printf "%-15s: %s\n" "网卡名称" "$(echo $slaves | tr '\n' ' ')"
    echo "================================================================="

    # 处理所有从网卡
    for slave in $slaves; do
        [[ -d "/sys/class/net/$slave" ]] || continue
        
        # 配置并获取LLDP信息
        lldptool set-lldp -i "$slave" adminStatus=rxtx >/dev/null 2>&1
        raw_output=$(lldptool -t -n -i "$slave" 2>&1)
        
        # 精确解析
        read -r chassis_id port_id sys_name <<< "$(parse_lldp_output "$raw_output")"
        
        # 最终检查修正(基于您的实际输出)
        if [[ "$port_id" == "Ifname:" ]]; then
            # 从原始输出重新提取
            port_id=$(grep -A1 "Port ID TLV" <<< "$raw_output" | tail -1 | awk '{print $1}')
        fi

        # 格式化输出
        printf "%-15s: %s\n" "网卡名称" "$slave"
        printf "%-15s: %s\n" "真实MAC地址" "${chassis_id:-未获取到}"
        printf "%-15s: %s\n" "交换机端口" "${port_id:-未获取到}"
        printf "%-15s: %s\n" "交换机名称" "${sys_name:-未获取到}"
        echo "----------------------------------------"
    done
    echo # 分隔空行
}

### 主程序 ###

# 安装必要服务
install_lldpad

# 检测所有bond接口
bonds=$(find /proc/net/bonding/ -maxdepth 1 -type f -printf "%f\n" 2>/dev/null)
[[ -z "$bonds" ]] && exit

# 处理每个bond接口
for bond in $bonds; do
    process_bond "$bond"
done

 

原创文章,作者:AIRF,如若转载,请注明出处:http://www.ai-rf.com/index.php/2025/07/02/linux%e5%8f%8c%e7%bd%91%e5%8d%a1%e7%bb%91%e5%ae%9a%e7%8a%b6%e6%80%81%e9%aa%8c%e8%af%81%e8%84%9a%e6%9c%ac/

(0)
AIRFAIRF
上一篇 2025年6月18日
下一篇 2025年7月7日

相关推荐

  • Python自动化Cc压测攻击脚本V2

    仅供压测自己服务器使用,不得用于非法攻击 CCATK-V1 使用socks4 / 5代理攻击http服务器的脚本。 删除了混合代理洪水 新特性: 快速套接字重用 改进的CC模式 随…

    2023年8月31日
  • Linux系统的Swap Buffer和Cache

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态。在一个 CoreOS 的系统上,free命令的显示内容大概是这样一个状态: core@localhost ~ $…

    Linux 2022年10月1日
  • Redhat 7 LVM xfs文件系统修复

    一.情况描述 服务器重启操作系统后自动进入急救模式(单用户模式),进入后ip a查看lo网卡,df -h查看分区发现只存在lv_root,报错图如下 XFS(sdb1): Inte…

    Linux 2021年11月21日
  • 【Linux通用】Centos系列跳过首次登陆新建用户

    前言 在安装系统后,登录的时候总是让新建一个普通用户,很是烦人,于是想办法解决一下   方法一 在CentOS上,图形化登录(如GNOME)通常要求您创建一个用户来登录。…

    2023年6月21日
  • Linux中grep命令很少人知道的10种高级用法

    在Linux世界中,grep命令是一种强大的文本搜索工具。它不仅可以简单地匹配字符串,还可以通过使用一些高级技巧来实现更复杂的搜索操作。本文将向你介绍grep命令的10种高级用法,…

    C_C++_C# 2024年1月24日
  • Iptables怎么防止常见网络攻击

    什么是syn,ddos,ping SYN (Synchronize): 在 TCP(传输控制协议)中,SYN 是握手过程的一部分。当客户端尝试与服务器建立连接时,它发送一个带有 S…

    C_C++_C# 2023年12月16日
  • Linux性能优化

    性能优化 性能指标 高并发和响应快对应着性能优化的两个核心指标:吞吐和延时 应用负载角度:直接影响了产品终端的用户体验 系统资源角度:资源使用率、饱和度等 性能问题的本质就是系统资…

    2023年11月20日
  • 运维人员必须知道的10个系统进程

    前言 在日常运维工作中,经常会看到一些奇怪的系统进程占用资源比较高,但是又不敢随意的Kill这些进程 而这些系统级的内核进程都是会用中括号括起来的,它们会执行一些系统的辅助功能(如…

    2023年12月16日
  • UNIX系列之AIX克隆系统盘

    前景提示: 未曾有Nim环境,且网络环境原因无法使用Nim安装,故采取使用克隆盘的方式进行安装 首先使用光盘正常安装一台机器,并按照基线文档更新 完成后从其他机器拔新盘并插入,插入…

    C_C++_C# 2021年11月21日
  • Nginx的负载均衡实现

    环境 主机 ip 用途 软件 web1 192.168.50.60 nginx-1 httpd web2 192.168.50.61 nginx-2 httpd proxy 192…

    C_C++_C# 2023年12月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注