本文目录导读:

我来提供一个完整的网络环境切换脚本方案,包含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 版使用方法:
- 以管理员身份运行 PowerShell
- 执行策略允许脚本:
Set-ExecutionPolicy RemoteSigned - 运行脚本:
.\network-switch.ps1 -Environment 办公 .\network-switch.ps1 -ShowStatus
Linux 版使用方法:
- 添加执行权限:
chmod +x network-switch.sh - 运行脚本:
sudo ./network-switch.sh 办公 sudo ./network-switch.sh -h
扩展功能建议
- 配置文件分离:将配置放在单独的JSON/YAML文件中
- 多网卡支持:允许选择特定网络接口
- VPN切换:集成VPN连接管理
- WiFi切换:支持无线网络连接管理
- 诊断工具:添加网络诊断功能
- 日志记录:记录切换历史
这个脚本可以根据你的具体需求进行定制修改,需要添加其他功能吗?