如何验证Cisco交换机ARP输出文件有效性并自动重试SSH命令
如何实现Cisco交换机ARP输出的有效性检查与自动重试逻辑?
可以用Bash脚本实现该逻辑,核心是每次执行SSH命令后对输出文件做两项验证:表头合法性、最后一行IP及格式合法性,不满足则重复执行直至符合要求。
完整脚本示例
#!/bin/bash # 配置目标参数 SWITCH="myswitch" OUTPUT_FILE="myswitch.txt" VALID_IPS=("1.1.1.254" "1.1.1.253") # 验证ARP输出是否符合要求的函数 validate_arp_output() { # 检查文件是否存在且非空 if [ ! -s "$OUTPUT_FILE" ]; then echo "错误:输出文件为空或不存在" return 1 fi # 验证表头格式(匹配Cisco 'show ip arp'标准表头,可按需调整正则) HEADER_LINE=$(head -n 1 "$OUTPUT_FILE") if ! echo "$HEADER_LINE" | grep -qE "^Protocol\s+Address\s+Age \(min\)\s+Hardware Addr\s+Type\s+Interface$"; then echo "错误:表头格式不符合要求" return 1 fi # 获取最后一行有效数据(跳过空行) LAST_LINE=$(tail -n 1 "$OUTPUT_FILE" | sed '/^[[:space:]]*$/d') if [ -z "$LAST_LINE" ]; then echo "错误:最后一行无有效数据" return 1 fi # 提取并验证IP合法性 IP=$(echo "$LAST_LINE" | awk '{print $2}') if [[ ! " ${VALID_IPS[@]} " =~ " ${IP} " ]]; then echo "错误:最后一行IP $IP 不在合法列表中" return 1 fi # 验证最后一行格式是否匹配两种合法示例 if ! echo "$LAST_LINE" | grep -qE "^Internet\s+$IP\s+0\s+Incomplete\s+ARPA$" && \ ! echo "$LAST_LINE" | grep -qE "^Internet\s+$IP\s+[0-9]+\s+([0-9a-fA-F]{2}\.){5}[0-9a-fA-F]{2}\s+ARPA\s+Vlan[0-9]+$"; then echo "错误:最后一行格式不符合要求" return 1 fi # 所有验证通过 return 0 } # 循环执行并验证,直到符合要求 while true; do echo "正在获取ARP信息..." ssh "$SWITCH" 'show ip arp' > "$OUTPUT_FILE" if validate_arp_output; then echo "ARP输出验证通过!" break else echo "验证失败,10秒后重试..." sleep 10 fi done
关键逻辑说明
- 参数配置:开头的变量可根据实际环境修改,
VALID_IPS定义了允许的最后一行IP范围。 - 表头验证:通过正则匹配Cisco交换机
show ip arp的标准表头,若你的设备表头有差异,可自行调整正则表达式。 - 最后一行验证:
- 提取最后一行的IP,检查是否在合法列表内;
- 用正则匹配两种合法格式:一种是ARP未完成(Incomplete)的简化格式,另一种是包含MAC地址和VLAN接口的完整格式。
- 自动重试:通过
while true循环实现持续重试,验证失败后等待10秒再重新执行SSH命令,直到验证通过。
使用注意事项
- 确保本地机器已配置SSH免密登录到目标交换机,避免每次执行都需要输入密码;
- 若网络不稳定,可调整
sleep的等待时长; - 可按需添加重试次数限制(比如最多重试5次后退出),避免无限循环。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

