如何编写一键切换网络环境脚本

wen 实用脚本 2

本文目录导读:

如何编写一键切换网络环境脚本

  1. Windows 版本 (PowerShell)
  2. Linux 版本 (Bash)
  3. 使用说明
  4. 扩展功能建议

我来提供一个完整的网络环境切换脚本方案,包含Windows和Linux两个版本:

Windows 版本 (PowerShell)

# network-switch.ps1
# 一键切换网络环境脚本
param(
    [Parameter(Mandatory=$true)]
    [ValidateSet("办公", "家庭", "开发", "测试")]
    [string]$Environment,
    [switch]$ShowStatus
)
# 网络配置字典
$networkConfigs = @{
    "办公" = @{
        IP = "192.168.1.100"
        Mask = "255.255.255.0"
        Gateway = "192.168.1.1"
        DNS1 = "114.114.114.114"
        DNS2 = "8.8.8.8"
        Proxy = $true
        ProxyServer = "proxy.company.com:8080"
    }
    "家庭" = @{
        IP = "192.168.0.100"
        Mask = "255.255.255.0"
        Gateway = "192.168.0.1"
        DNS1 = "223.5.5.5"
        DNS2 = "119.29.29.29"
        Proxy = $false
    }
    "开发" = @{
        IP = "10.0.0.100"
        Mask = "255.255.255.0"
        Gateway = "10.0.0.1"
        DNS1 = "8.8.8.8"
        DNS2 = "1.1.1.1"
        Proxy = $false
    }
    "测试" = @{
        DHCP = $true
        Proxy = $false
    }
}
# 获取网络适配器名称
function Get-NetworkAdapter {
    $adapters = Get-NetAdapter | Where-Object {$_.Status -eq "Up"}
    if ($adapters.Count -eq 0) {
        Write-Host "未找到活动网络适配器!" -ForegroundColor Red
        exit 1
    }
    if ($adapters.Count -gt 1) {
        Write-Host "找到多个活动网络适配器:" -ForegroundColor Yellow
        for ($i = 0; $i -lt $adapters.Count; $i++) {
            Write-Host "$i. $($adapters[$i].Name)"
        }
        $index = Read-Host "请输入适配器编号 [0-$($adapters.Count-1)]"
        return $adapters[$index]
    }
    return $adapters[0]
}
# 设置静态IP
function Set-StaticIP {
    param(
        [string]$AdapterName,
        [hashtable]$Config
    )
    Write-Host "设置静态IP..." -ForegroundColor Cyan
    New-NetIPAddress -InterfaceAlias $AdapterName `
        -IPAddress $Config.IP `
        -PrefixLength 24 `
        -DefaultGateway $Config.Gateway -ErrorAction SilentlyContinue
    Set-DnsClientServerAddress -InterfaceAlias $AdapterName `
        -ServerAddresses ($Config.DNS1, $Config.DNS2)
}
# 设置DHCP
function Set-DHCP {
    param([string]$AdapterName)
    Write-Host "切换到DHCP模式..." -ForegroundColor Cyan
    Set-NetIPInterface -InterfaceAlias $AdapterName -Dhcp Enabled
    Set-DnsClientServerAddress -InterfaceAlias $AdapterName -ResetServerAddresses
    Remove-NetRoute -InterfaceAlias $AdapterName -ErrorAction SilentlyContinue
}
# 代理设置
function Set-Proxy {
    param(
        [bool]$Enable,
        [string]$Server = ""
    )
    $registryPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
    if ($Enable) {
        Set-ItemProperty -Path $registryPath -Name ProxyEnable -Value 1
        Set-ItemProperty -Path $registryPath -Name ProxyServer -Value $Server
        Write-Host "代理已启用: $Server" -ForegroundColor Green
    } else {
        Set-ItemProperty -Path $registryPath -Name ProxyEnable -Value 0
        Write-Host "代理已禁用" -ForegroundColor Green
    }
    # 刷新系统代理设置
    $internetSetting = New-Object -ComObject InternetExplorer.Application
    $internetSetting.Visible = $false
    $internetSetting.Quit()
}
# 显示当前状态
function Show-Status {
    Write-Host "`n========== 当前网络状态 ==========" -ForegroundColor Cyan
    Get-NetIPConfiguration | Format-Table InterfaceAlias, IPv4Address, IPv4DefaultGateway
    Get-DnsClientServerAddress | Where-Object {$_.AddressFamily -eq 2} | Format-Table InterfaceAlias, ServerAddresses
    $proxyStatus = Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
    Write-Host "代理状态: $($(if($proxyStatus.ProxyEnable) {"启用 - $($proxyStatus.ProxyServer)"} else {"禁用"}))"
}
# 主逻辑
Clear-Host
Write-Host "网络环境切换工具" -ForegroundColor Green
Write-Host "====================" -ForegroundColor Green
# 如果指定了显示状态
if ($ShowStatus) {
    Show-Status
    exit 0
}
# 获取网络适配器
$adapter = Get-NetworkAdapter
Write-Host "使用适配器: $($adapter.Name)" -ForegroundColor Yellow
# 获取配置
$config = $networkConfigs[$Environment]
# 应用网络配置
try {
    if ($config.DHCP) {
        Set-DHCP $adapter.Name
    } else {
        Set-StaticIP -AdapterName $adapter.Name -Config $config
    }
    # 设置代理
    Set-Proxy -Enable $config.Proxy -Server $config.ProxyServer
    Write-Host "`n成功切换到 [$Environment] 环境!" -ForegroundColor Green
    # 测试网络连接
    Start-Sleep -Seconds 3
    $pingResult = Test-Connection -ComputerName 8.8.8.8 -Count 3
    if ($pingResult) {
        Write-Host "网络连接正常!" -ForegroundColor Green
    } else {
        Write-Host "警告: 网络连接可能存在问题!" -ForegroundColor Yellow
    }
} catch {
    Write-Host "切换失败: $($_.Exception.Message)" -ForegroundColor Red
}
# 显示最终状态
Show-Status

Linux 版本 (Bash)

#!/bin/bash
# network-switch.sh
# 一键切换网络环境脚本
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 网络配置
declare -A CONFIGS
CONFIGS[办公]="eth0|192.168.1.100|255.255.255.0|192.168.1.1|114.114.114.114,8.8.8.8|proxy.company.com:8080"
CONFIGS[家庭]="eth0|192.168.0.100|255.255.255.0|192.168.0.1|223.5.5.5,119.29.29.29|"
CONFIGS[开发]="wlan0|10.0.0.100|255.255.255.0|10.0.0.1|8.8.8.8,1.1.1.1|"
CONFIGS[DNS]="eth0|192.168.1.100|255.255.255.0|192.168.1.1|8.8.8.8,1.1.1.1|"
# 显示帮助
usage() {
    echo "使用方法: $0 [环境名称]"
    echo "可用环境: 办公, 家庭, 开发, DNS"
    echo "示例: $0 办公"
}
# 检查root权限
check_root() {
    if [ "$EUID" -ne 0 ]; then 
        echo -e "${RED}请使用sudo运行此脚本${NC}"
        exit 1
    fi
}
# 备份网络配置
backup_config() {
    INTERFACE=$1
    echo -e "${BLUE}备份网络配置...${NC}"
    cp /etc/network/interfaces /etc/network/interfaces.bak 2>/dev/null
    cp /etc/resolv.conf /etc/resolv.conf.bak 2>/dev/null
}
# 设置DNS
set_dns() {
    DNS_LIST=$1
    echo -e "${BLUE}设置DNS服务器...${NC}"
    # 检测系统类型
    if [ -f /etc/resolvconf/resolv.conf.d/head ]; then
        # Debian/Ubuntu
        echo "# 由网络切换脚本生成" > /etc/resolvconf/resolv.conf.d/head
        IFS=',' read -ra DNS_ARRAY <<< "$DNS_LIST"
        for dns in "${DNS_ARRAY[@]}"; do
            echo "nameserver $dns" >> /etc/resolvconf/resolv.conf.d/head
        done
        resolvconf -u
    elif [ -f /etc/systemd/resolved.conf ]; then
        # Systemd系统
        IFS=',' read -ra DNS_ARRAY <<< "$DNS_LIST"
        DNS_CONFIG=""
        for dns in "${DNS_ARRAY[@]}"; do
            DNS_CONFIG="$DNS_CONFIG $dns"
        done
        sed -i "s/#DNS=.*/DNS=$DNS_CONFIG/" /etc/systemd/resolved.conf
        systemctl restart systemd-resolved
    fi
    # 兼容直接修改/etc/resolv.conf
    echo "# 由网络切换脚本生成" > /etc/resolv.conf
    IFS=',' read -ra DNS_ARRAY <<< "$DNS_LIST"
    for dns in "${DNS_ARRAY[@]}"; do
        echo "nameserver $dns" >> /etc/resolv.conf
    done
}
# 设置静态IP
set_static_ip() {
    INTERFACE=$1
    IP=$2
    MASK=$3
    GATEWAY=$4
    echo -e "${BLUE}设置静态IP: $IP...${NC}"
    if [ -d /etc/network/interfaces.d ]; then
        # Debian/Ubuntu风格
        cat > /etc/network/interfaces.d/$INTERFACE << EOF
auto $INTERFACE
iface $INTERFACE inet static
    address $IP
    netmask $MASK
    gateway $GATEWAY
EOF
    elif [ -f /etc/sysconfig/network-scripts/ifcfg-$INTERFACE ]; then
        # CentOS/RHEL风格
        cat > /etc/sysconfig/network-scripts/ifcfg-$INTERFACE << EOF
DEVICE=$INTERFACE
BOOTPROTO=static
ONBOOT=yes
IPADDR=$IP
NETMASK=$MASK
GATEWAY=$GATEWAY
EOF
    fi
    # 立即生效
    ip addr flush dev $INTERFACE
    ip addr add $IP/$MASK dev $INTERFACE
    ip route add default via $GATEWAY dev $INTERFACE
}
# 切换DHCP
set_dhcp() {
    INTERFACE=$1
    echo -e "${BLUE}切换到DHCP模式...${NC}"
    if [ -d /etc/network/interfaces.d ]; then
        cat > /etc/network/interfaces.d/$INTERFACE << EOF
auto $INTERFACE
iface $INTERFACE inet dhcp
EOF
    elif [ -f /etc/sysconfig/network-scripts/ifcfg-$INTERFACE ]; then
        sed -i 's/BOOTPROTO=.*/BOOTPROTO=dhcp/' /etc/sysconfig/network-scripts/ifcfg-$INTERFACE
    fi
    # 立即生效
    dhclient -r $INTERFACE 2>/dev/null
    dhclient $INTERFACE
}
# 设置代理
set_proxy() {
    PROXY=$1
    if [ -n "$PROXY" ]; then
        export http_proxy="http://$PROXY"
        export https_proxy="http://$PROXY"
        export HTTP_PROXY="http://$PROXY"
        export HTTPS_PROXY="http://$PROXY"
        # 写入shell配置
        echo "export http_proxy='http://$PROXY'" >> ~/.bashrc
        echo "export https_proxy='http://$PROXY'" >> ~/.bashrc
        echo -e "${GREEN}代理已启用: $PROXY${NC}"
    else
        unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
        sed -i '/http_proxy/d' ~/.bashrc
        sed -i '/https_proxy/d' ~/.bashrc
        echo -e "${GREEN}代理已禁用${NC}"
    fi
}
# 测试网络
test_network() {
    echo -e "${BLUE}测试网络连接...${NC}"
    if ping -c 3 8.8.8.8 &> /dev/null; then
        echo -e "${GREEN}网络连接正常✓${NC}"
        return 0
    else
        echo -e "${RED}网络连接失败✗${NC}"
        return 1
    fi
}
# 显示状态
show_status() {
    echo -e "\n${BLUE}========== 当前网络状态 ==========${NC}"
    ip addr show
    echo -e "\n${BLUE}路由表:${NC}"
    ip route show
    echo -e "\n${BLUE}DNS配置:${NC}"
    cat /etc/resolv.conf
    echo -e "\n${BLUE}代理状态:${NC}"
    echo "HTTP_PROXY: ${http_proxy:-未设置}"
    echo "HTTPS_PROXY: ${https_proxy:-未设置}"
}
# 主函数
main() {
    # 检查root权限
    check_root
    # 没有参数时显示帮助
    if [ $# -eq 0 ]; then
        usage
        exit 1
    fi
    ENV=$1
    # 检查环境是否存在
    if [ -z "${CONFIGS[$ENV]}" ]; then
        echo -e "${RED}未知环境: $ENV${NC}"
        usage
        exit 1
    fi
    # 解析配置
    IFS='|' read -ra CONFIG_PARTS <<< "${CONFIGS[$ENV]}"
    INTERFACE=${CONFIG_PARTS[0]}
    IP=${CONFIG_PARTS[1]}
    MASK=${CONFIG_PARTS[2]}
    GATEWAY=${CONFIG_PARTS[3]}
    DNS_LIST=${CONFIG_PARTS[4]}
    PROXY=${CONFIG_PARTS[5]:-""}
    echo -e "\n${GREEN}切换到[$ENV]环境...${NC}\n"
    # 备份当前配置
    backup_config $INTERFACE
    # 应用配置
    if [ "$IP" = "dhcp" ]; then
        set_dhcp $INTERFACE
    elif [ -n "$IP" ]; then
        set_static_ip $INTERFACE $IP $MASK $GATEWAY
    fi
    # 设置DNS
    if [ -n "$DNS_LIST" ]; then
        set_dns $DNS_LIST
    fi
    # 设置代理
    set_proxy $PROXY
    # 重启网络服务
    echo -e "${BLUE}重启网络服务...${NC}"
    systemctl restart networking 2>/dev/null || \
    systemctl restart NetworkManager 2>/dev/null || \
    service networking restart 2>/dev/null
    # 测试网络
    sleep 2
    test_network
    # 显示状态
    show_status
    echo -e "\n${GREEN}环境切换完成!${NC}"
}
# 运行主函数
main "$@"

使用说明

Windows 版使用方法:

  1. 以管理员身份运行 PowerShell
  2. 执行策略允许脚本:Set-ExecutionPolicy RemoteSigned
  3. 运行脚本:
    .\network-switch.ps1 -Environment 办公
    .\network-switch.ps1 -ShowStatus

Linux 版使用方法:

  1. 添加执行权限:chmod +x network-switch.sh
  2. 运行脚本:
    sudo ./network-switch.sh 办公
    sudo ./network-switch.sh -h

扩展功能建议

  1. 配置文件分离:将配置放在单独的JSON/YAML文件中
  2. 多网卡支持:允许选择特定网络接口
  3. VPN切换:集成VPN连接管理
  4. WiFi切换:支持无线网络连接管理
  5. 诊断工具:添加网络诊断功能
  6. 日志记录:记录切换历史

这个脚本可以根据你的具体需求进行定制修改,需要添加其他功能吗?

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