用脚本检测并重启网络设备

wen 实用脚本 1

本文目录导读:

用脚本检测并重启网络设备

  1. Linux服务器网络检测与重启脚本
  2. Windows网络检测与重启脚本 (PowerShell)
  3. 路由器/交换机检测重启脚本 (SSH方式)
  4. 定时任务配置 (crontab)
  5. Python版本的网络监控脚本
  6. 使用说明
  7. 注意事项

我来为您提供几个不同场景下检测并重启网络设备的脚本。

Linux服务器网络检测与重启脚本

#!/bin/bash
# 网络检测与重启脚本
# 文件名: network_monitor.sh
# 配置参数
PING_TARGET="8.8.8.8"  # ping测试的目标地址
PING_COUNT=3            # ping次数
LOG_FILE="/var/log/network_monitor.log"
TIMEOUT=5               # 超时时间(秒)
# 日志函数
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 检测网络连接
check_network() {
    if ping -c $PING_COUNT -W $TIMEOUT $PING_TARGET > /dev/null 2>&1; then
        return 0
    else
        return 1
    fi
}
# 重启网络服务
restart_network() {
    log_message "正在重启网络服务..."
    # 尝试多种方式重启网络
    if systemctl restart network 2>/dev/null; then
        log_message "通过 systemctl 重启网络成功"
    elif service networking restart 2>/dev/null; then
        log_message "通过 service 重启网络成功"
    elif ifdown eth0 && ifup eth0 2>/dev/null; then
        log_message "通过 ifdown/ifup 重启网络成功"
    else
        log_message "ERROR: 网络重启失败"
        return 1
    fi
    # 等待网络恢复
    sleep 5
    # 验证网络是否恢复
    if check_network; then
        log_message "网络已成功恢复"
        return 0
    else
        log_message "ERROR: 网络未能恢复,需要人工干预"
        return 1
    fi
}
# 主循环
log_message "网络监控脚本启动"
while true; do
    if check_network; then
        log_message "网络连接正常"
    else
        log_message "警告: 网络连接异常,尝试重启..."
        restart_network
    fi
    # 每60秒检查一次
    sleep 60
done

Windows网络检测与重启脚本 (PowerShell)

# Windows网络检测与重启脚本
# 文件名: network_monitor.ps1
# 配置参数
$PingTarget = "8.8.8.8"
$LogFile = "C:\Logs\network_monitor.log"
$CheckInterval = 60  # 检查间隔(秒)
# 日志函数
function Write-Log {
    param([string]$Message)
    $TimeStamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$TimeStamp - $Message" | Out-File -FilePath $LogFile -Append
    Write-Host "$TimeStamp - $Message"
}
# 检测网络连接
function Test-Network {
    try {
        $result = Test-Connection -ComputerName $PingTarget -Count 2 -Quiet
        return $result
    }
    catch {
        return $false
    }
}
# 重启网络适配器
function Restart-NetworkAdapter {
    Write-Log "正在重启网络适配器..."
    try {
        # 获取网络适配器
        $adapters = Get-NetAdapter | Where-Object {$_.Status -eq "Up"}
        foreach ($adapter in $adapters) {
            Write-Log "重启适配器: $($adapter.Name)"
            Restart-NetAdapter -Name $adapter.Name -Confirm:$false
        }
        Write-Log "网络适配器重启完成"
        Start-Sleep -Seconds 10
        # 验证网络
        if (Test-Network) {
            Write-Log "网络已恢复"
            return $true
        } else {
            Write-Log "警告: 网络未能自动恢复"
            return $false
        }
    }
    catch {
        Write-Log "ERROR: 重启网络适配器失败: $_"
        return $false
    }
}
# 主循环
Write-Log "网络监控脚本启动"
while ($true) {
    if (Test-Network) {
        Write-Log "网络连接正常"
    } else {
        Write-Log "警告: 网络连接异常"
        Restart-NetworkAdapter
    }
    Start-Sleep -Seconds $CheckInterval
}

路由器/交换机检测重启脚本 (SSH方式)

#!/bin/bash
# 路由器/交换机检测重启脚本
# 需要安装 sshpass 或配置SSH密钥
# 配置参数
ROUTER_IP="192.168.1.1"
SSH_USER="admin"
SSH_PASS="your_password"  # 建议使用SSH密钥替代密码
PING_TARGET="8.8.8.8"
LOG_FILE="/var/log/router_monitor.log"
# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 检测网络
check_network() {
    ping -c 2 -W 3 $PING_TARGET > /dev/null 2>&1
    return $?
}
# SSH执行命令
ssh_exec() {
    sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 \
        $SSH_USER@$ROUTER_IP "$1" 2>/dev/null
}
# 重启路由器
reboot_router() {
    log "准备重启路由器 $ROUTER_IP"
    # 发送重启命令 (不同厂商命令不同)
    # Cisco
    ssh_exec "reload"
    # 华为
    # ssh_exec "reboot"
    # 其他品牌请根据实际情况修改
    log "重启命令已发送"
    # 等待路由器重启
    log "等待路由器重启 (预计60秒)..."
    sleep 60
    # 验证网络恢复
    local retry_count=0
    while [ $retry_count -lt 6 ]; do
        if check_network; then
            log "路由器重启成功,网络已恢复"
            return 0
        fi
        retry_count=$((retry_count + 1))
        log "等待网络恢复... (第${retry_count}次尝试)"
        sleep 10
    done
    log "ERROR: 路由器重启后网络仍未恢复"
    return 1
}
# 主程序
log "开始监控网络..."
if check_network; then
    log "网络连接正常"
else
    log "网络连接异常,尝试重启路由器..."
    reboot_router
fi

定时任务配置 (crontab)

# 每5分钟执行一次网络检测
*/5 * * * * /path/to/network_monitor.sh
# 或者使用更简单的检测脚本
*/5 * * * * ping -c 2 8.8.8.8 > /dev/null || /sbin/service network restart

Python版本的网络监控脚本

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import time
import subprocess
import logging
from datetime import datetime
class NetworkMonitor:
    def __init__(self):
        self.ping_target = "8.8.8.8"
        self.log_file = "/var/log/network_monitor.log"
        self.setup_logging()
    def setup_logging(self):
        logging.basicConfig(
            filename=self.log_file,
            level=logging.INFO,
            format='%(asctime)s - %(levelname)s - %(message)s'
        )
    def check_network(self):
        try:
            result = subprocess.run(
                ['ping', '-c', '2', '-W', '3', self.ping_target],
                capture_output=True,
                timeout=10
            )
            return result.returncode == 0
        except:
            return False
    def restart_network(self):
        logging.warning("网络异常,尝试重启网络服务...")
        try:
            # 尝试重启网络服务
            commands = [
                ['systemctl', 'restart', 'network'],
                ['service', 'networking', 'restart'],
                ['ifdown', 'eth0'], ['ifup', 'eth0']
            ]
            for cmd in commands:
                try:
                    subprocess.run(cmd, check=True, timeout=30)
                    logging.info(f"执行命令成功: {' '.join(cmd)}")
                    break
                except:
                    continue
            time.sleep(10)
            if self.check_network():
                logging.info("网络已恢复")
                return True
            else:
                logging.error("网络未能自动恢复")
                return False
        except Exception as e:
            logging.error(f"重启网络失败: {str(e)}")
            return False
    def run(self, interval=60):
        logging.info("网络监控脚本启动")
        while True:
            if self.check_network():
                pass  # 网络正常,不做操作
            else:
                logging.warning("检测到网络异常")
                self.restart_network()
            time.sleep(interval)
if __name__ == "__main__":
    monitor = NetworkMonitor()
    monitor.run()

使用说明

  1. 设置执行权限

    chmod +x network_monitor.sh
  2. 测试执行

    ./network_monitor.sh
  3. 添加开机启动

    # 添加到 /etc/rc.local
    /path/to/network_monitor.sh &
  4. 配置系统服务 (systemd):

    # /etc/systemd/system/network-monitor.service
    [Unit]
    Description=Network Monitor Service
    After=network.target
    [Service]
    Type=simple
    ExecStart=/path/to/network_monitor.sh
    Restart=always
    [Install]
    WantedBy=multi-user.target

注意事项

  1. 安全性:不要在脚本中硬编码密码,建议使用SSH密钥认证
  2. 监控频率:合理设置检查间隔,避免过于频繁
  3. 日志管理:定期清理日志文件,避免磁盘空间占用
  4. 权限问题:可能需要root权限执行网络重启操作
  5. 厂商差异:不同网络设备的重启命令不同,请根据实际情况修改

需要根据您的具体网络设备和环境调整脚本中的命令和参数。

抱歉,评论功能暂时关闭!