|
|
@ -1226,7 +1226,7 @@ is_wifi_interface() { |
|
|
|
awk -v dev="$interface_name" 'BEGIN{found=0} /Hardware Port: Wi-Fi/{found=1} /Device:/{if(found && $2==dev){exit 0}else{found=0}}' && return 0 || return 1 |
|
|
|
} |
|
|
|
|
|
|
|
# 新增:生成本地管理+单播MAC地址(IEEE标准) |
|
|
|
# 🎯 增强的MAC地址生成和验证(集成randommac.sh特性) |
|
|
|
generate_local_unicast_mac() { |
|
|
|
# 第一字节:LAA+单播(低两位10),其余随机 |
|
|
|
local first_byte=$(( (RANDOM & 0xFC) | 0x02 )) |
|
|
@ -1235,31 +1235,174 @@ generate_local_unicast_mac() { |
|
|
|
echo "$mac" |
|
|
|
} |
|
|
|
|
|
|
|
# 新增:自动检测并调用macchanger或spoof-mac |
|
|
|
# 🔍 MAC地址验证函数(基于randommac.sh) |
|
|
|
validate_mac_address() { |
|
|
|
local mac="$1" |
|
|
|
local regex="^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$" |
|
|
|
|
|
|
|
if [[ $mac =~ $regex ]]; then |
|
|
|
return 0 |
|
|
|
else |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 🔍 MAC地址验证函数(基于randommac.sh) |
|
|
|
validate_mac_address() { |
|
|
|
local mac="$1" |
|
|
|
local regex="^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$" |
|
|
|
|
|
|
|
if [[ $mac =~ $regex ]]; then |
|
|
|
return 0 |
|
|
|
else |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 🔄 增强的WiFi断开和重连机制 |
|
|
|
manage_wifi_connection() { |
|
|
|
local action="$1" # disconnect 或 reconnect |
|
|
|
local interface_name="$2" |
|
|
|
|
|
|
|
if ! is_wifi_interface "$interface_name"; then |
|
|
|
log_info "📡 [跳过] 接口 '$interface_name' 不是WiFi,跳过WiFi管理" |
|
|
|
return 0 |
|
|
|
fi |
|
|
|
|
|
|
|
case "$action" in |
|
|
|
"disconnect") |
|
|
|
log_info "📡 [WiFi] 断开WiFi连接但保持适配器开启..." |
|
|
|
|
|
|
|
# 方法1: 使用airport工具断开 |
|
|
|
if command -v /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport >/dev/null 2>&1; then |
|
|
|
sudo /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -z 2>>"$LOG_FILE" |
|
|
|
log_info "✅ [WiFi] 使用airport工具断开WiFi连接" |
|
|
|
else |
|
|
|
# 方法2: 使用networksetup断开 |
|
|
|
local wifi_service=$(networksetup -listallhardwareports | grep -A1 "Device: $interface_name" | grep "Hardware Port:" | cut -d: -f2 | xargs) |
|
|
|
if [ -n "$wifi_service" ]; then |
|
|
|
networksetup -setairportpower "$interface_name" off 2>>"$LOG_FILE" |
|
|
|
sleep 2 |
|
|
|
networksetup -setairportpower "$interface_name" on 2>>"$LOG_FILE" |
|
|
|
log_info "✅ [WiFi] 使用networksetup重置WiFi适配器" |
|
|
|
else |
|
|
|
log_warn "⚠️ [WiFi] 无法找到WiFi服务,跳过断开" |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
sleep 3 |
|
|
|
;; |
|
|
|
|
|
|
|
"reconnect") |
|
|
|
log_info "📡 [WiFi] 重新连接WiFi..." |
|
|
|
|
|
|
|
# 触发网络硬件重新检测 |
|
|
|
sudo networksetup -detectnewhardware 2>>"$LOG_FILE" |
|
|
|
|
|
|
|
# 等待网络重新连接 |
|
|
|
log_info "⏳ [WiFi] 等待WiFi重新连接..." |
|
|
|
local wait_count=0 |
|
|
|
local max_wait=30 |
|
|
|
|
|
|
|
while [ $wait_count -lt $max_wait ]; do |
|
|
|
if ping -c 1 8.8.8.8 >/dev/null 2>&1; then |
|
|
|
log_info "✅ [WiFi] 网络连接已恢复" |
|
|
|
return 0 |
|
|
|
fi |
|
|
|
sleep 2 |
|
|
|
wait_count=$((wait_count + 2)) |
|
|
|
|
|
|
|
if [ $((wait_count % 10)) -eq 0 ]; then |
|
|
|
log_info "⏳ [WiFi] 等待网络连接... ($wait_count/$max_wait 秒)" |
|
|
|
fi |
|
|
|
done |
|
|
|
|
|
|
|
log_warn "⚠️ [WiFi] 网络连接未在预期时间内恢复,但继续执行" |
|
|
|
;; |
|
|
|
|
|
|
|
*) |
|
|
|
log_error "❌ [错误] 无效的WiFi管理操作: $action" |
|
|
|
return 1 |
|
|
|
;; |
|
|
|
esac |
|
|
|
} |
|
|
|
|
|
|
|
# 🛠️ 增强的第三方工具MAC地址修改 |
|
|
|
try_third_party_mac_tool() { |
|
|
|
local interface_name="$1" |
|
|
|
local random_mac="$2" |
|
|
|
local success=false |
|
|
|
# 优先macchanger |
|
|
|
local tool_used="" |
|
|
|
|
|
|
|
log_info "🛠️ [第三方] 尝试使用第三方工具修改MAC地址" |
|
|
|
|
|
|
|
# 🔍 检测可用的第三方工具 |
|
|
|
local available_tools=() |
|
|
|
if command -v macchanger >/dev/null 2>&1; then |
|
|
|
log_info "尝试使用macchanger修改接口 '$interface_name' 的MAC地址..." |
|
|
|
sudo macchanger -m "$random_mac" "$interface_name" >>"$LOG_FILE" 2>&1 && success=true |
|
|
|
available_tools+=("macchanger") |
|
|
|
fi |
|
|
|
# 若macchanger不可用,尝试spoof-mac |
|
|
|
if ! $success && command -v spoof-mac >/dev/null 2>&1; then |
|
|
|
log_info "尝试使用spoof-mac修改接口 '$interface_name' 的MAC地址..." |
|
|
|
sudo spoof-mac set $random_mac $interface_name >>"$LOG_FILE" 2>&1 && success=true |
|
|
|
if command -v spoof-mac >/dev/null 2>&1; then |
|
|
|
available_tools+=("spoof-mac") |
|
|
|
fi |
|
|
|
|
|
|
|
if [ ${#available_tools[@]} -eq 0 ]; then |
|
|
|
log_warn "⚠️ [警告] 未检测到可用的第三方MAC地址修改工具" |
|
|
|
log_info "💡 [建议] 可以安装以下工具:" |
|
|
|
echo " • brew install spoof-mac" |
|
|
|
echo " • brew install macchanger" |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
|
|
|
|
log_info "🔍 [检测] 发现可用工具: ${available_tools[*]}" |
|
|
|
|
|
|
|
# 🎯 优先使用macchanger |
|
|
|
if [[ " ${available_tools[*]} " =~ " macchanger " ]]; then |
|
|
|
log_info "🔧 [macchanger] 尝试使用macchanger修改接口 '$interface_name' 的MAC地址..." |
|
|
|
|
|
|
|
# 先关闭接口 |
|
|
|
sudo ifconfig "$interface_name" down 2>>"$LOG_FILE" |
|
|
|
sleep 2 |
|
|
|
|
|
|
|
if sudo macchanger -m "$random_mac" "$interface_name" >>"$LOG_FILE" 2>&1; then |
|
|
|
success=true |
|
|
|
tool_used="macchanger" |
|
|
|
log_info "✅ [成功] macchanger修改成功" |
|
|
|
else |
|
|
|
log_warn "⚠️ [失败] macchanger修改失败" |
|
|
|
fi |
|
|
|
|
|
|
|
# 重新启用接口 |
|
|
|
sudo ifconfig "$interface_name" up 2>>"$LOG_FILE" |
|
|
|
sleep 2 |
|
|
|
fi |
|
|
|
|
|
|
|
# 🎯 如果macchanger失败,尝试spoof-mac |
|
|
|
if ! $success && [[ " ${available_tools[*]} " =~ " spoof-mac " ]]; then |
|
|
|
log_info "🔧 [spoof-mac] 尝试使用spoof-mac修改接口 '$interface_name' 的MAC地址..." |
|
|
|
|
|
|
|
if sudo spoof-mac set "$random_mac" "$interface_name" >>"$LOG_FILE" 2>&1; then |
|
|
|
success=true |
|
|
|
tool_used="spoof-mac" |
|
|
|
log_info "✅ [成功] spoof-mac修改成功" |
|
|
|
else |
|
|
|
log_warn "⚠️ [失败] spoof-mac修改失败" |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
if $success; then |
|
|
|
log_info "第三方工具修改MAC地址成功。" |
|
|
|
log_info "🎉 [成功] 第三方工具 ($tool_used) 修改MAC地址成功" |
|
|
|
return 0 |
|
|
|
else |
|
|
|
log_warn "未检测到可用的macchanger或spoof-mac,或第三方工具修改失败。" |
|
|
|
log_error "❌ [失败] 所有第三方工具都修改失败" |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
# 检测macOS版本和硬件类型 |
|
|
|
# 🔍 增强的macOS环境检测和兼容性评估 |
|
|
|
detect_macos_environment() { |
|
|
|
local macos_version=$(sw_vers -productVersion) |
|
|
|
local macos_major=$(echo "$macos_version" | cut -d. -f1) |
|
|
@ -1273,11 +1416,11 @@ detect_macos_environment() { |
|
|
|
hardware_type="Intel" |
|
|
|
fi |
|
|
|
|
|
|
|
log_info "系统环境检测: macOS $macos_version ($hardware_type)" |
|
|
|
log_info "🔍 [环境] 系统环境检测: macOS $macos_version ($hardware_type)" |
|
|
|
|
|
|
|
# 检查SIP状态 |
|
|
|
local sip_status=$(csrutil status 2>/dev/null | grep -o "enabled\|disabled" || echo "unknown") |
|
|
|
log_info "系统完整性保护(SIP)状态: $sip_status" |
|
|
|
log_info "🔒 [SIP] 系统完整性保护状态: $sip_status" |
|
|
|
|
|
|
|
# 设置环境变量 |
|
|
|
export MACOS_VERSION="$macos_version" |
|
|
@ -1286,68 +1429,163 @@ detect_macos_environment() { |
|
|
|
export HARDWARE_TYPE="$hardware_type" |
|
|
|
export SIP_STATUS="$sip_status" |
|
|
|
|
|
|
|
# 检查是否为问题版本 |
|
|
|
if [[ $macos_major -ge 12 ]] && [[ "$hardware_type" == "Apple Silicon" ]]; then |
|
|
|
log_warn "检测到可能存在MAC地址修改限制的环境 (macOS $macos_major+ Apple Silicon)" |
|
|
|
return 1 |
|
|
|
# 🎯 增强的兼容性检查 |
|
|
|
local compatibility_level="FULL" |
|
|
|
local compatibility_issues=() |
|
|
|
|
|
|
|
# 检查macOS版本兼容性 |
|
|
|
if [[ $macos_major -ge 14 ]]; then |
|
|
|
compatibility_issues+=("macOS $macos_major+ 对MAC地址修改有严格限制") |
|
|
|
compatibility_level="LIMITED" |
|
|
|
elif [[ $macos_major -ge 12 ]]; then |
|
|
|
compatibility_issues+=("macOS $macos_major 可能对MAC地址修改有部分限制") |
|
|
|
compatibility_level="PARTIAL" |
|
|
|
fi |
|
|
|
|
|
|
|
return 0 |
|
|
|
# 检查硬件兼容性 |
|
|
|
if [[ "$hardware_type" == "Apple Silicon" ]]; then |
|
|
|
compatibility_issues+=("Apple Silicon硬件对MAC地址修改有硬件级限制") |
|
|
|
if [[ "$compatibility_level" == "FULL" ]]; then |
|
|
|
compatibility_level="PARTIAL" |
|
|
|
else |
|
|
|
compatibility_level="MINIMAL" |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
# 检查SIP影响 |
|
|
|
if [[ "$sip_status" == "enabled" ]]; then |
|
|
|
compatibility_issues+=("系统完整性保护(SIP)可能阻止某些修改方法") |
|
|
|
fi |
|
|
|
|
|
|
|
# 设置兼容性级别 |
|
|
|
export MAC_COMPATIBILITY_LEVEL="$compatibility_level" |
|
|
|
|
|
|
|
# 显示兼容性评估结果 |
|
|
|
case "$compatibility_level" in |
|
|
|
"FULL") |
|
|
|
log_info "✅ [兼容性] 完全兼容 - 支持所有MAC地址修改方法" |
|
|
|
;; |
|
|
|
"PARTIAL") |
|
|
|
log_warn "⚠️ [兼容性] 部分兼容 - 某些方法可能失败" |
|
|
|
;; |
|
|
|
"LIMITED") |
|
|
|
log_warn "⚠️ [兼容性] 有限兼容 - 大多数方法可能失败" |
|
|
|
;; |
|
|
|
"MINIMAL") |
|
|
|
log_error "❌ [兼容性] 最小兼容 - MAC地址修改可能完全失败" |
|
|
|
;; |
|
|
|
esac |
|
|
|
|
|
|
|
if [ ${#compatibility_issues[@]} -gt 0 ]; then |
|
|
|
log_info "📋 [兼容性问题]:" |
|
|
|
for issue in "${compatibility_issues[@]}"; do |
|
|
|
echo " • $issue" |
|
|
|
done |
|
|
|
fi |
|
|
|
|
|
|
|
# 返回兼容性状态 |
|
|
|
case "$compatibility_level" in |
|
|
|
"FULL"|"PARTIAL") return 0 ;; |
|
|
|
*) return 1 ;; |
|
|
|
esac |
|
|
|
} |
|
|
|
|
|
|
|
# 增强的MAC地址修改函数,支持多种方法和兼容性检测 |
|
|
|
# 🚀 增强的MAC地址修改函数,支持智能方法选择 |
|
|
|
_change_mac_for_one_interface() { |
|
|
|
local interface_name="$1" |
|
|
|
|
|
|
|
if [ -z "$interface_name" ]; then |
|
|
|
log_error "_change_mac_for_one_interface: 未提供接口名称" |
|
|
|
log_error "❌ [错误] _change_mac_for_one_interface: 未提供接口名称" |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
|
|
|
|
log_info "开始处理接口: $interface_name" |
|
|
|
log_info "🚀 [开始] 开始处理接口: $interface_name" |
|
|
|
echo |
|
|
|
|
|
|
|
# 环境检测 |
|
|
|
# 🔍 环境检测和兼容性评估 |
|
|
|
detect_macos_environment |
|
|
|
local env_compatible=$? |
|
|
|
local compatibility_level="$MAC_COMPATIBILITY_LEVEL" |
|
|
|
|
|
|
|
# 📡 获取当前MAC地址 |
|
|
|
local current_mac=$(ifconfig "$interface_name" | awk '/ether/{print $2}') |
|
|
|
if [ -z "$current_mac" ]; then |
|
|
|
log_warn "无法获取接口 '$interface_name' 的当前 MAC 地址,可能已禁用或不存在。" |
|
|
|
log_warn "⚠️ [警告] 无法获取接口 '$interface_name' 的当前MAC地址,可能已禁用或不存在" |
|
|
|
return 1 |
|
|
|
else |
|
|
|
log_info "接口 '$interface_name' 当前 MAC 地址: $current_mac" |
|
|
|
log_info "📍 [当前] 接口 '$interface_name' 当前MAC地址: $current_mac" |
|
|
|
fi |
|
|
|
|
|
|
|
# 🎯 自动生成新MAC地址 |
|
|
|
local random_mac=$(generate_local_unicast_mac) |
|
|
|
log_info "为接口 '$interface_name' 生成新的本地管理+单播 MAC 地址: $random_mac" |
|
|
|
log_info "🎲 [生成] 为接口 '$interface_name' 生成新MAC地址: $random_mac" |
|
|
|
|
|
|
|
# 📋 显示修改计划 |
|
|
|
echo |
|
|
|
log_info "📋 [计划] MAC地址修改计划:" |
|
|
|
echo " 🔹 接口: $interface_name" |
|
|
|
echo " 🔹 当前MAC: $current_mac" |
|
|
|
echo " 🔹 目标MAC: $random_mac" |
|
|
|
echo " 🔹 兼容性: $compatibility_level" |
|
|
|
echo |
|
|
|
|
|
|
|
# 🔄 WiFi预处理 |
|
|
|
manage_wifi_connection "disconnect" "$interface_name" |
|
|
|
|
|
|
|
# 🛠️ 执行MAC地址修改(多方法尝试) |
|
|
|
local mac_change_success=false |
|
|
|
local method_used="" |
|
|
|
local methods_tried=() |
|
|
|
|
|
|
|
# 📊 根据兼容性级别选择方法顺序 |
|
|
|
local method_order=() |
|
|
|
case "$compatibility_level" in |
|
|
|
"FULL") |
|
|
|
method_order=("ifconfig" "third-party" "networksetup") |
|
|
|
;; |
|
|
|
"PARTIAL") |
|
|
|
method_order=("third-party" "ifconfig" "networksetup") |
|
|
|
;; |
|
|
|
"LIMITED"|"MINIMAL") |
|
|
|
method_order=("third-party" "networksetup" "ifconfig") |
|
|
|
;; |
|
|
|
esac |
|
|
|
|
|
|
|
log_info "🛠️ [方法] 将按以下顺序尝试修改方法: ${method_order[*]}" |
|
|
|
echo |
|
|
|
|
|
|
|
# 方法1: 传统ifconfig方法 (优先用于兼容环境) |
|
|
|
if [[ $env_compatible -eq 0 ]]; then |
|
|
|
log_info "使用传统ifconfig方法修改MAC地址..." |
|
|
|
if _try_ifconfig_method "$interface_name" "$random_mac"; then |
|
|
|
mac_change_success=true |
|
|
|
method_used="ifconfig" |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
# 方法2: 第三方工具方法 (用于新版本macOS或Apple Silicon) |
|
|
|
if [[ $mac_change_success == false ]]; then |
|
|
|
log_info "尝试使用第三方工具修改MAC地址..." |
|
|
|
if try_third_party_mac_tool "$interface_name" "$random_mac"; then |
|
|
|
mac_change_success=true |
|
|
|
method_used="third-party" |
|
|
|
fi |
|
|
|
fi |
|
|
|
# 🔄 逐个尝试修改方法 |
|
|
|
for method in "${method_order[@]}"; do |
|
|
|
log_info "🔧 [尝试] 正在尝试 $method 方法..." |
|
|
|
methods_tried+=("$method") |
|
|
|
|
|
|
|
case "$method" in |
|
|
|
"ifconfig") |
|
|
|
if _try_ifconfig_method "$interface_name" "$random_mac"; then |
|
|
|
mac_change_success=true |
|
|
|
method_used="ifconfig" |
|
|
|
break |
|
|
|
fi |
|
|
|
;; |
|
|
|
"third-party") |
|
|
|
if try_third_party_mac_tool "$interface_name" "$random_mac"; then |
|
|
|
mac_change_success=true |
|
|
|
method_used="third-party" |
|
|
|
break |
|
|
|
fi |
|
|
|
;; |
|
|
|
"networksetup") |
|
|
|
if _try_networksetup_method "$interface_name" "$random_mac"; then |
|
|
|
mac_change_success=true |
|
|
|
method_used="networksetup" |
|
|
|
break |
|
|
|
fi |
|
|
|
;; |
|
|
|
esac |
|
|
|
|
|
|
|
# 方法3: 系统网络偏好设置方法 (最后尝试) |
|
|
|
if [[ $mac_change_success == false ]]; then |
|
|
|
log_info "尝试使用系统网络偏好设置方法..." |
|
|
|
if _try_networksetup_method "$interface_name" "$random_mac"; then |
|
|
|
mac_change_success=true |
|
|
|
method_used="networksetup" |
|
|
|
fi |
|
|
|
fi |
|
|
|
log_warn "⚠️ [失败] $method 方法失败,尝试下一个方法..." |
|
|
|
sleep 2 |
|
|
|
done |
|
|
|
|
|
|
|
# 验证修改结果 |
|
|
|
if [[ $mac_change_success == true ]]; then |
|
|
@ -1372,124 +1610,272 @@ _change_mac_for_one_interface() { |
|
|
|
echo -e "${BLUE}� [说明]${NC} MAC地址修改失败,可以重试或跳过此接口" |
|
|
|
echo -e "${BLUE}� [备注]${NC} 如果所有接口都失败,脚本会自动尝试JS内核修改方案" |
|
|
|
|
|
|
|
select_menu_option "MAC地址修改失败,您可以:" "重试本接口|跳过本接口|退出脚本" 0 |
|
|
|
local choice=$? |
|
|
|
if [ "$choice" = "0" ]; then |
|
|
|
log_info "用户选择重试本接口。" |
|
|
|
_change_mac_for_one_interface "$interface_name" |
|
|
|
elif [ "$choice" = "1" ]; then |
|
|
|
log_info "用户选择跳过本接口。" |
|
|
|
return 1 |
|
|
|
else |
|
|
|
log_info "用户选择退出脚本。" |
|
|
|
exit 1 |
|
|
|
fi |
|
|
|
# 简化的用户选择 |
|
|
|
echo "请选择操作:" |
|
|
|
echo " 1. 重试本接口" |
|
|
|
echo " 2. 跳过本接口" |
|
|
|
echo " 3. 退出脚本" |
|
|
|
|
|
|
|
read -p "请输入选择 (1-3): " choice |
|
|
|
|
|
|
|
case "$choice" in |
|
|
|
1) |
|
|
|
log_info "🔄 [重试] 用户选择重试本接口" |
|
|
|
_change_mac_for_one_interface "$interface_name" |
|
|
|
;; |
|
|
|
2) |
|
|
|
log_info "⏭️ [跳过] 用户选择跳过本接口" |
|
|
|
return 1 |
|
|
|
;; |
|
|
|
3) |
|
|
|
log_info "🚪 [退出] 用户选择退出脚本" |
|
|
|
exit 1 |
|
|
|
;; |
|
|
|
*) |
|
|
|
log_info "⏭️ [默认] 无效选择,跳过本接口" |
|
|
|
return 1 |
|
|
|
;; |
|
|
|
esac |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
# 传统ifconfig方法 |
|
|
|
# 🔧 增强的传统ifconfig方法(集成WiFi管理) |
|
|
|
_try_ifconfig_method() { |
|
|
|
local interface_name="$1" |
|
|
|
local random_mac="$2" |
|
|
|
|
|
|
|
if is_wifi_interface "$interface_name"; then |
|
|
|
log_info "检测到接口 '$interface_name' 为Wi-Fi,先断开SSID..." |
|
|
|
sudo /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -z 2>>"$LOG_FILE" |
|
|
|
sleep 3 |
|
|
|
fi |
|
|
|
log_info "🔧 [ifconfig] 使用传统ifconfig方法修改MAC地址" |
|
|
|
|
|
|
|
log_info "临时禁用接口 '$interface_name' 以修改 MAC 地址 (网络会短暂中断)..." |
|
|
|
if ! sudo ifconfig "$interface_name" down; then |
|
|
|
log_error "禁用接口 '$interface_name' 失败" |
|
|
|
# 🔄 WiFi特殊处理已在主函数中处理,这里只需要基本的接口操作 |
|
|
|
log_info "📡 [接口] 临时禁用接口 '$interface_name' 以修改MAC地址..." |
|
|
|
if ! sudo ifconfig "$interface_name" down 2>>"$LOG_FILE"; then |
|
|
|
log_error "❌ [错误] 禁用接口 '$interface_name' 失败" |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
|
|
|
|
log_info "⏳ [等待] 等待接口完全关闭..." |
|
|
|
sleep 3 |
|
|
|
|
|
|
|
# 尝试修改MAC地址 |
|
|
|
# 🎯 尝试修改MAC地址 |
|
|
|
log_info "🎯 [修改] 设置新MAC地址: $random_mac" |
|
|
|
if sudo ifconfig "$interface_name" ether "$random_mac" 2>>"$LOG_FILE"; then |
|
|
|
sudo ifconfig "$interface_name" up |
|
|
|
sleep 2 |
|
|
|
return 0 |
|
|
|
log_info "✅ [成功] MAC地址设置命令执行成功" |
|
|
|
|
|
|
|
# 重新启用接口 |
|
|
|
log_info "🔄 [启用] 重新启用接口..." |
|
|
|
if sudo ifconfig "$interface_name" up 2>>"$LOG_FILE"; then |
|
|
|
log_info "✅ [成功] 接口重新启用成功" |
|
|
|
sleep 2 |
|
|
|
return 0 |
|
|
|
else |
|
|
|
log_error "❌ [错误] 重新启用接口失败" |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
else |
|
|
|
log_error "ifconfig ether 命令失败" |
|
|
|
log_error "❌ [错误] ifconfig ether 命令失败" |
|
|
|
log_info "🔄 [恢复] 尝试重新启用接口..." |
|
|
|
sudo ifconfig "$interface_name" up 2>/dev/null || true |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
# 使用networksetup方法 (适用于某些受限环境) |
|
|
|
# 🌐 增强的networksetup方法(适用于受限环境) |
|
|
|
_try_networksetup_method() { |
|
|
|
local interface_name="$1" |
|
|
|
local random_mac="$2" |
|
|
|
|
|
|
|
# 获取硬件端口名称 |
|
|
|
log_info "🌐 [networksetup] 尝试使用系统网络偏好设置方法" |
|
|
|
|
|
|
|
# 🔍 获取硬件端口名称 |
|
|
|
local hardware_port=$(networksetup -listallhardwareports | grep -A1 "Device: $interface_name" | grep "Hardware Port:" | cut -d: -f2 | xargs) |
|
|
|
|
|
|
|
if [ -z "$hardware_port" ]; then |
|
|
|
log_warn "无法找到接口 $interface_name 对应的硬件端口" |
|
|
|
log_warn "⚠️ [警告] 无法找到接口 $interface_name 对应的硬件端口" |
|
|
|
log_info "📋 [调试] 可用硬件端口列表:" |
|
|
|
networksetup -listallhardwareports | grep -E "(Hardware Port|Device)" | head -10 |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
|
|
|
|
log_info "尝试通过networksetup修改硬件端口 '$hardware_port' 的MAC地址" |
|
|
|
log_info "🔍 [发现] 找到硬件端口: '$hardware_port' (设备: $interface_name)" |
|
|
|
|
|
|
|
# 🎯 尝试多种networksetup方法 |
|
|
|
local methods_tried=() |
|
|
|
|
|
|
|
# 方法1: 尝试重置网络服务 |
|
|
|
log_info "🔧 [方法1] 尝试重置网络服务..." |
|
|
|
methods_tried+=("reset-service") |
|
|
|
if sudo networksetup -setnetworkserviceenabled "$hardware_port" off 2>>"$LOG_FILE"; then |
|
|
|
sleep 2 |
|
|
|
if sudo networksetup -setnetworkserviceenabled "$hardware_port" on 2>>"$LOG_FILE"; then |
|
|
|
log_info "✅ [成功] 网络服务重置成功" |
|
|
|
sleep 2 |
|
|
|
|
|
|
|
# 检测硬件变化 |
|
|
|
sudo networksetup -detectnewhardware 2>>"$LOG_FILE" |
|
|
|
sleep 3 |
|
|
|
|
|
|
|
# 验证是否有效果 |
|
|
|
local new_mac=$(ifconfig "$interface_name" | awk '/ether/{print $2}') |
|
|
|
if [ "$new_mac" != "$(ifconfig "$interface_name" | awk '/ether/{print $2}')" ]; then |
|
|
|
log_info "✅ [成功] networksetup方法可能有效" |
|
|
|
return 0 |
|
|
|
fi |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
# 方法2: 尝试手动配置 |
|
|
|
log_info "🔧 [方法2] 尝试手动网络配置..." |
|
|
|
methods_tried+=("manual-config") |
|
|
|
|
|
|
|
# 获取当前配置 |
|
|
|
local current_config=$(networksetup -getinfo "$hardware_port" 2>/dev/null) |
|
|
|
if [ -n "$current_config" ]; then |
|
|
|
log_info "📋 [当前配置] $hardware_port 的网络配置:" |
|
|
|
echo "$current_config" | head -5 |
|
|
|
|
|
|
|
# 尝试重新应用配置以触发MAC地址更新 |
|
|
|
if echo "$current_config" | grep -q "DHCP"; then |
|
|
|
log_info "🔄 [DHCP] 重新应用DHCP配置..." |
|
|
|
if sudo networksetup -setdhcp "$hardware_port" 2>>"$LOG_FILE"; then |
|
|
|
log_info "✅ [成功] DHCP配置重新应用成功" |
|
|
|
sleep 3 |
|
|
|
sudo networksetup -detectnewhardware 2>>"$LOG_FILE" |
|
|
|
return 0 |
|
|
|
fi |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
# 方法3: 强制硬件重新检测 |
|
|
|
log_info "🔧 [方法3] 强制硬件重新检测..." |
|
|
|
methods_tried+=("hardware-detect") |
|
|
|
|
|
|
|
# 某些版本的macOS支持通过networksetup修改MAC地址 |
|
|
|
if sudo networksetup -setmanual "$hardware_port" 2>/dev/null; then |
|
|
|
log_info "networksetup方法可能成功" |
|
|
|
if sudo networksetup -detectnewhardware 2>>"$LOG_FILE"; then |
|
|
|
log_info "✅ [成功] 硬件重新检测完成" |
|
|
|
sleep 3 |
|
|
|
return 0 |
|
|
|
else |
|
|
|
log_warn "networksetup方法不支持或失败" |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
|
|
|
|
# 所有方法都失败 |
|
|
|
log_error "❌ [失败] networksetup所有方法都失败" |
|
|
|
log_info "📋 [尝试过的方法]: ${methods_tried[*]}" |
|
|
|
log_warn "⚠️ [说明] networksetup方法在当前macOS版本中可能不支持直接MAC地址修改" |
|
|
|
|
|
|
|
return 1 |
|
|
|
} |
|
|
|
|
|
|
|
# 显示故障排除信息 |
|
|
|
# 📊 增强的故障排除信息显示 |
|
|
|
_show_troubleshooting_info() { |
|
|
|
local interface_name="$1" |
|
|
|
|
|
|
|
echo |
|
|
|
echo -e "${YELLOW}=== MAC地址修改故障排除信息 ===${NC}" |
|
|
|
echo -e "${BLUE}系统信息:${NC}" |
|
|
|
echo " • macOS版本: $MACOS_VERSION" |
|
|
|
echo " • 硬件类型: $HARDWARE_TYPE" |
|
|
|
echo " • SIP状态: $SIP_STATUS" |
|
|
|
echo " • 接口名称: $interface_name" |
|
|
|
echo -e "${YELLOW}╔══════════════════════════════════════════════════════════════╗${NC}" |
|
|
|
echo -e "${YELLOW}║ MAC地址修改故障排除信息 ║${NC}" |
|
|
|
echo -e "${YELLOW}╚══════════════════════════════════════════════════════════════╝${NC}" |
|
|
|
echo |
|
|
|
|
|
|
|
# 🔍 系统信息 |
|
|
|
echo -e "${BLUE}🔍 系统环境信息:${NC}" |
|
|
|
echo " 📱 macOS版本: $MACOS_VERSION" |
|
|
|
echo " 💻 硬件类型: $HARDWARE_TYPE" |
|
|
|
echo " 🔒 SIP状态: $SIP_STATUS" |
|
|
|
echo " 🌐 接口名称: $interface_name" |
|
|
|
echo " 📊 兼容性级别: ${MAC_COMPATIBILITY_LEVEL:-未知}" |
|
|
|
|
|
|
|
# 显示接口详细信息 |
|
|
|
local interface_info=$(ifconfig "$interface_name" 2>/dev/null | head -3) |
|
|
|
if [ -n "$interface_info" ]; then |
|
|
|
echo " 📡 接口状态:" |
|
|
|
echo "$interface_info" | sed 's/^/ /' |
|
|
|
fi |
|
|
|
echo |
|
|
|
|
|
|
|
echo -e "${BLUE}可能的原因:${NC}" |
|
|
|
# ⚠️ 问题分析 |
|
|
|
echo -e "${BLUE}⚠️ 可能的问题原因:${NC}" |
|
|
|
local issues_found=false |
|
|
|
|
|
|
|
if [[ "$HARDWARE_TYPE" == "Apple Silicon" ]] && [[ $MACOS_MAJOR -ge 12 ]]; then |
|
|
|
echo " • Apple Silicon Mac在macOS 12+版本中对MAC地址修改有硬件限制" |
|
|
|
echo " • 某些网络驱动程序不允许MAC地址修改" |
|
|
|
echo " ❌ Apple Silicon Mac在macOS 12+版本中有硬件级MAC地址修改限制" |
|
|
|
echo " ❌ 网络驱动程序可能完全禁止MAC地址修改" |
|
|
|
issues_found=true |
|
|
|
fi |
|
|
|
|
|
|
|
if [[ $MACOS_MAJOR -ge 14 ]]; then |
|
|
|
echo " ❌ macOS Sonoma (14+) 对MAC地址修改有严格的系统级限制" |
|
|
|
issues_found=true |
|
|
|
elif [[ $MACOS_MAJOR -ge 12 ]]; then |
|
|
|
echo " ⚠️ macOS Monterey+ 对MAC地址修改有部分限制" |
|
|
|
issues_found=true |
|
|
|
fi |
|
|
|
|
|
|
|
if [[ "$SIP_STATUS" == "enabled" ]]; then |
|
|
|
echo " • 系统完整性保护(SIP)可能阻止了MAC地址修改" |
|
|
|
echo " ⚠️ 系统完整性保护(SIP)可能阻止某些MAC地址修改方法" |
|
|
|
issues_found=true |
|
|
|
fi |
|
|
|
|
|
|
|
echo " • 网络接口可能不支持MAC地址修改" |
|
|
|
echo " • 权限不足或系统安全策略限制" |
|
|
|
if ! $issues_found; then |
|
|
|
echo " ❓ 网络接口可能不支持MAC地址修改" |
|
|
|
echo " ❓ 权限不足或其他系统安全策略限制" |
|
|
|
fi |
|
|
|
echo |
|
|
|
|
|
|
|
echo -e "${BLUE}建议的解决方案:${NC}" |
|
|
|
echo " 1. 安装第三方工具:" |
|
|
|
# 💡 解决方案 |
|
|
|
echo -e "${BLUE}💡 建议的解决方案:${NC}" |
|
|
|
echo |
|
|
|
echo -e "${GREEN} 🛠️ 方案1: 安装第三方工具${NC}" |
|
|
|
echo " brew install spoof-mac" |
|
|
|
echo " brew install macchanger" |
|
|
|
echo " # 这些工具可能使用不同的底层方法" |
|
|
|
echo |
|
|
|
echo " 2. 如果使用Apple Silicon Mac,考虑:" |
|
|
|
|
|
|
|
if [[ "$HARDWARE_TYPE" == "Apple Silicon" ]] || [[ $MACOS_MAJOR -ge 14 ]]; then |
|
|
|
echo -e "${GREEN} 🔧 方案2: 使用Cursor JS内核修改 (推荐)${NC}" |
|
|
|
echo " # 本脚本会自动尝试JS内核修改方案" |
|
|
|
echo " # 直接修改Cursor内核文件绕过系统MAC检测" |
|
|
|
echo |
|
|
|
fi |
|
|
|
|
|
|
|
echo -e "${GREEN} 🌐 方案3: 网络层解决方案${NC}" |
|
|
|
echo " • 使用虚拟机运行需要MAC地址修改的应用" |
|
|
|
echo " • 使用路由器级别的MAC地址过滤绕过" |
|
|
|
echo " • 配置路由器级别的MAC地址过滤绕过" |
|
|
|
echo " • 使用VPN或代理服务" |
|
|
|
echo |
|
|
|
echo " 3. 临时禁用SIP (不推荐):" |
|
|
|
echo " • 重启进入恢复模式" |
|
|
|
echo " • 运行: csrutil disable" |
|
|
|
echo " • 重启后尝试修改" |
|
|
|
echo " • 完成后重新启用: csrutil enable" |
|
|
|
|
|
|
|
if [[ "$SIP_STATUS" == "enabled" ]]; then |
|
|
|
echo -e "${YELLOW} ⚠️ 方案4: 临时禁用SIP (高风险,不推荐)${NC}" |
|
|
|
echo " 1. 重启进入恢复模式 (Command+R)" |
|
|
|
echo " 2. 打开终端运行: csrutil disable" |
|
|
|
echo " 3. 重启后尝试修改MAC地址" |
|
|
|
echo " 4. 完成后重新启用: csrutil enable" |
|
|
|
echo " ⚠️ 警告: 禁用SIP会降低系统安全性" |
|
|
|
echo |
|
|
|
fi |
|
|
|
|
|
|
|
# 🔧 技术细节 |
|
|
|
echo -e "${BLUE}🔧 技术细节和错误分析:${NC}" |
|
|
|
echo " 📋 常见错误信息:" |
|
|
|
echo " • ifconfig: ioctl (SIOCAIFADDR): Can't assign requested address" |
|
|
|
echo " • Operation not permitted" |
|
|
|
echo " • Device or resource busy" |
|
|
|
echo |
|
|
|
echo -e "${BLUE}技术细节:${NC}" |
|
|
|
echo " • 错误通常为: ifconfig: ioctl (SIOCAIFADDR): Can't assign requested address" |
|
|
|
echo " • 这表明系统内核拒绝了MAC地址修改请求" |
|
|
|
echo " • 在Apple Silicon Mac上,这是硬件和驱动程序级别的限制" |
|
|
|
echo " 🔍 错误含义:" |
|
|
|
echo " • 系统内核拒绝了MAC地址修改请求" |
|
|
|
echo " • 硬件驱动程序不允许MAC地址更改" |
|
|
|
echo " • 安全策略阻止了网络接口修改" |
|
|
|
echo |
|
|
|
|
|
|
|
if [[ "$HARDWARE_TYPE" == "Apple Silicon" ]]; then |
|
|
|
echo " 🍎 Apple Silicon特殊说明:" |
|
|
|
echo " • 硬件级别的安全限制,无法通过软件绕过" |
|
|
|
echo " • 网络芯片固件可能锁定了MAC地址" |
|
|
|
echo " • 建议使用应用层解决方案(如JS内核修改)" |
|
|
|
echo |
|
|
|
fi |
|
|
|
|
|
|
|
echo -e "${BLUE}📞 获取更多帮助:${NC}" |
|
|
|
echo " • 查看系统日志: sudo dmesg | grep -i network" |
|
|
|
echo " • 检查网络接口: networksetup -listallhardwareports" |
|
|
|
echo " • 测试权限: sudo ifconfig $interface_name" |
|
|
|
echo |
|
|
|
} |
|
|
|
|
|
|
@ -1877,16 +2263,56 @@ change_system_mac_address() { |
|
|
|
log_info "将尝试为以下活动接口修改 MAC 地址: ${active_interfaces[*]}" |
|
|
|
echo |
|
|
|
|
|
|
|
# 4. 循环处理找到的活动接口 |
|
|
|
# 4. 🚀 循环处理找到的活动接口(增强版) |
|
|
|
local overall_success=true |
|
|
|
for interface_name in "${active_interfaces[@]}"; do |
|
|
|
if ! _change_mac_for_one_interface "$interface_name"; then |
|
|
|
log_warn "接口 '$interface_name' 的 MAC 地址修改失败或未完全成功。" |
|
|
|
local successful_interfaces=() |
|
|
|
local failed_interfaces=() |
|
|
|
|
|
|
|
echo -e "${BLUE}🚀 [开始] 开始处理 ${#active_interfaces[@]} 个活动接口...${NC}" |
|
|
|
echo |
|
|
|
|
|
|
|
# 处理每个接口 |
|
|
|
for i in "${!active_interfaces[@]}"; do |
|
|
|
local interface_name="${active_interfaces[$i]}" |
|
|
|
local interface_num=$((i + 1)) |
|
|
|
|
|
|
|
echo -e "${YELLOW}╔══════════════════════════════════════════════════════════════╗${NC}" |
|
|
|
echo -e "${YELLOW}║ 处理接口 $interface_num/${#active_interfaces[@]}: $interface_name ║${NC}" |
|
|
|
echo -e "${YELLOW}╚══════════════════════════════════════════════════════════════╝${NC}" |
|
|
|
echo |
|
|
|
|
|
|
|
if _change_mac_for_one_interface "$interface_name"; then |
|
|
|
log_info "✅ [成功] 接口 '$interface_name' MAC地址修改成功" |
|
|
|
successful_interfaces+=("$interface_name") |
|
|
|
else |
|
|
|
log_warn "⚠️ [失败] 接口 '$interface_name' MAC地址修改失败" |
|
|
|
failed_interfaces+=("$interface_name") |
|
|
|
overall_success=false |
|
|
|
fi |
|
|
|
echo # 在每个接口处理后添加空行 |
|
|
|
|
|
|
|
echo |
|
|
|
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" |
|
|
|
echo |
|
|
|
done |
|
|
|
|
|
|
|
# 📊 显示处理结果统计 |
|
|
|
echo -e "${BLUE}📊 [统计] MAC地址修改结果统计:${NC}" |
|
|
|
echo " ✅ 成功: ${#successful_interfaces[@]} 个接口" |
|
|
|
if [ ${#successful_interfaces[@]} -gt 0 ]; then |
|
|
|
for interface in "${successful_interfaces[@]}"; do |
|
|
|
echo " • $interface" |
|
|
|
done |
|
|
|
fi |
|
|
|
echo " ❌ 失败: ${#failed_interfaces[@]} 个接口" |
|
|
|
if [ ${#failed_interfaces[@]} -gt 0 ]; then |
|
|
|
for interface in "${failed_interfaces[@]}"; do |
|
|
|
echo " • $interface" |
|
|
|
done |
|
|
|
fi |
|
|
|
echo |
|
|
|
|
|
|
|
log_info "📋 [完成] 所有活动接口的MAC地址修改尝试完成" |
|
|
|
|
|
|
|
log_info "所有活动接口的 MAC 地址修改尝试完成。" |
|
|
|
|
|
|
|
if $overall_success; then |
|
|
|