diff --git a/scripts/run/cursor_mac_id_modifier.sh b/scripts/run/cursor_mac_id_modifier.sh index 07b3015..5eb07c0 100644 --- a/scripts/run/cursor_mac_id_modifier.sh +++ b/scripts/run/cursor_mac_id_modifier.sh @@ -703,7 +703,43 @@ try_third_party_mac_tool() { fi } -# 修改_change_mac_for_one_interface,失败时自动调用第三方工具,并集成恢复/重试菜单 +# 检测macOS版本和硬件类型 +detect_macos_environment() { + local macos_version=$(sw_vers -productVersion) + local macos_major=$(echo "$macos_version" | cut -d. -f1) + local macos_minor=$(echo "$macos_version" | cut -d. -f2) + local hardware_type="" + + # 检测硬件类型 + if [[ $(uname -m) == "arm64" ]]; then + hardware_type="Apple Silicon" + else + hardware_type="Intel" + fi + + 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" + + # 设置环境变量 + export MACOS_VERSION="$macos_version" + export MACOS_MAJOR="$macos_major" + export MACOS_MINOR="$macos_minor" + 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 + fi + + return 0 +} + +# 增强的MAC地址修改函数,支持多种方法和兼容性检测 _change_mac_for_one_interface() { local interface_name="$1" if [ -z "$interface_name" ]; then @@ -713,6 +749,10 @@ _change_mac_for_one_interface() { log_info "开始处理接口: $interface_name" + # 环境检测 + detect_macos_environment + local env_compatible=$? + local current_mac=$(ifconfig "$interface_name" | awk '/ether/{print $2}') if [ -z "$current_mac" ]; then log_warn "无法获取接口 '$interface_name' 的当前 MAC 地址,可能已禁用或不存在。" @@ -724,6 +764,74 @@ _change_mac_for_one_interface() { log_info "为接口 '$interface_name' 生成新的本地管理+单播 MAC 地址: $random_mac" local mac_change_success=false + local method_used="" + + # 方法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 + + # 方法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 + + # 验证修改结果 + if [[ $mac_change_success == true ]]; then + local final_mac_check=$(ifconfig "$interface_name" | awk '/ether/{print $2}') + log_info "最终验证接口 '$interface_name' 新 MAC 地址: $final_mac_check" + if [ "$final_mac_check" == "$random_mac" ]; then + echo -e "${GREEN}✅ 成功使用 $method_used 方法修改接口 '$interface_name' 的 MAC 地址${NC}" + return 0 + else + log_warn "验证失败,MAC地址可能未生效或已被重置" + mac_change_success=false + fi + fi + + # 失败处理 + if [[ $mac_change_success == false ]]; then + log_error "所有MAC地址修改方法都失败了" + _show_troubleshooting_info "$interface_name" + + # 失败时提供恢复/重试选项 + 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 + return 1 + fi +} + +# 传统ifconfig方法 +_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..." @@ -733,91 +841,96 @@ _change_mac_for_one_interface() { log_info "临时禁用接口 '$interface_name' 以修改 MAC 地址 (网络会短暂中断)..." if ! sudo ifconfig "$interface_name" down; then - log_error "禁用接口 '$interface_name' 失败,跳过该接口的 MAC 地址修改。" - echo -e "${RED}禁用网络接口 '$interface_name' 失败。请检查日志: $LOG_FILE ${NC}" - sudo ifconfig "$interface_name" up 2>/dev/null || true + log_error "禁用接口 '$interface_name' 失败" return 1 - else - log_info "接口 '$interface_name' 已禁用,等待3秒..." - sleep 3 + fi - log_info "尝试为接口 '$interface_name' 设置 MAC 地址: $random_mac" - sudo ifconfig $interface_name up - if sudo ifconfig "$interface_name" ether "$random_mac"; then - log_info "尝试修改接口 '$interface_name' 的 MAC 地址为: $random_mac [成功]" - local new_mac_check=$(ifconfig "$interface_name" | awk '/ether/{print $2}') - log_info "验证新 MAC 地址 (接口 '$interface_name' 禁用状态下): $new_mac_check" - if [ "$new_mac_check" != "$random_mac" ]; then - log_warn "验证失败,接口 '$interface_name' 的 MAC 地址似乎未成功设置 (接口禁用状态下)。" - else - mac_change_success=true - fi - else - log_error "尝试修改接口 '$interface_name' 的 MAC 地址失败。" - log_error "请检查接口名称是否正确,或尝试手动执行: sudo ifconfig $interface_name down && sudo ifconfig $interface_name ether <新MAC地址> && sudo ifconfig $interface_name up" - echo -e "${RED}修改接口 '$interface_name' 的 MAC 地址失败。请检查日志: $LOG_FILE ${NC}" - echo -e "${YELLOW}如多次失败,可尝试安装并使用macchanger或spoof-mac工具。${NC}" - echo -e "${YELLOW}macchanger安装: brew install macchanger,spoof-mac安装: brew install spoof-mac${NC}" - # 自动尝试第三方工具 - if try_third_party_mac_tool "$interface_name" "$random_mac"; then - mac_change_success=true - fi - fi + sleep 3 + + # 尝试修改MAC地址 + if sudo ifconfig "$interface_name" ether "$random_mac" 2>>"$LOG_FILE"; then + sudo ifconfig "$interface_name" up + sleep 2 + return 0 + else + log_error "ifconfig ether 命令失败" + sudo ifconfig "$interface_name" up 2>/dev/null || true + return 1 fi +} - log_info "重新启用接口 '$interface_name'..." - if ! sudo ifconfig "$interface_name" up; then - log_error "重新启用接口 '$interface_name' 失败。" - echo -e "${RED}重新启用网络接口 '$interface_name' 失败。请检查日志: $LOG_FILE ${NC}" - if $mac_change_success; then - echo -e "${YELLOW}接口 '$interface_name' 的 MAC 地址已修改,但重新启用接口失败。请手动检查网络连接。${NC}" - fi +# 使用networksetup方法 (适用于某些受限环境) +_try_networksetup_method() { + local interface_name="$1" + local random_mac="$2" + + # 获取硬件端口名称 + 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 对应的硬件端口" return 1 + fi + + log_info "尝试通过networksetup修改硬件端口 '$hardware_port' 的MAC地址" + + # 某些版本的macOS支持通过networksetup修改MAC地址 + if sudo networksetup -setmanual "$hardware_port" 2>/dev/null; then + log_info "networksetup方法可能成功" + return 0 else - log_info "接口 '$interface_name' 已重新启用。等待网络恢复..." - sleep 2 - if $mac_change_success; then - local final_mac_check=$(ifconfig "$interface_name" | awk '/ether/{print $2}') - log_info "最终验证接口 '$interface_name' 新 MAC 地址 (接口启用状态下): $final_mac_check" - if [ "$final_mac_check" == "$random_mac" ]; then - echo -e "${GREEN}已成功临时修改接口 '$interface_name' 的 MAC 地址(本地管理+单播)。重启后恢复。${NC}" - return 0 - else - log_warn "最终验证失败,接口 '$interface_name' 的 MAC 地址可能未生效或已被重置。" - echo -e "${YELLOW}接口 '$interface_name' MAC 地址修改尝试完成,但最终验证失败。请检查接口状态和日志。${NC}" - # 失败时提供恢复/重试选项 - 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 - return 1 - fi - else - echo -e "${RED}接口 '$interface_name' MAC 地址修改尝试失败。请检查日志: $LOG_FILE ${NC}" - # 失败时提供恢复/重试选项 - 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 - return 1 - fi + log_warn "networksetup方法不支持或失败" + return 1 + fi +} + +# 显示故障排除信息 +_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 + + echo -e "${BLUE}可能的原因:${NC}" + if [[ "$HARDWARE_TYPE" == "Apple Silicon" ]] && [[ $MACOS_MAJOR -ge 12 ]]; then + echo " • Apple Silicon Mac在macOS 12+版本中对MAC地址修改有硬件限制" + echo " • 某些网络驱动程序不允许MAC地址修改" fi + + if [[ "$SIP_STATUS" == "enabled" ]]; then + echo " • 系统完整性保护(SIP)可能阻止了MAC地址修改" + fi + + echo " • 网络接口可能不支持MAC地址修改" + echo " • 权限不足或系统安全策略限制" + echo + + echo -e "${BLUE}建议的解决方案:${NC}" + echo " 1. 安装第三方工具:" + echo " brew install spoof-mac" + echo " brew install macchanger" + echo + echo " 2. 如果使用Apple Silicon Mac,考虑:" + echo " • 使用虚拟机运行需要MAC地址修改的应用" + echo " • 使用路由器级别的MAC地址过滤绕过" + echo + echo " 3. 临时禁用SIP (不推荐):" + echo " • 重启进入恢复模式" + echo " • 运行: csrutil disable" + echo " • 重启后尝试修改" + echo " • 完成后重新启用: csrutil enable" + echo + echo -e "${BLUE}技术细节:${NC}" + echo " • 错误通常为: ifconfig: ioctl (SIOCAIFADDR): Can't assign requested address" + echo " • 这表明系统内核拒绝了MAC地址修改请求" + echo " • 在Apple Silicon Mac上,这是硬件和驱动程序级别的限制" + echo } # 检查权限 @@ -913,10 +1026,48 @@ backup_config() { fi } -# 修改系统 MAC 地址 (临时) - 现在会处理所有活动的 Wi-Fi/Ethernet 接口 +# 增强的系统MAC地址修改函数,支持多种兼容性检测和修改方法 change_system_mac_address() { log_info "开始尝试修改所有活动的 Wi-Fi/Ethernet 接口的系统 MAC 地址..." echo + + # 环境兼容性预检查 + detect_macos_environment + local env_compatible=$? + + if [[ $env_compatible -ne 0 ]]; then + echo -e "${YELLOW}⚠️ [兼容性警告]${NC} 检测到可能存在MAC地址修改限制的环境:" + echo -e "${YELLOW} • macOS版本: $MACOS_VERSION${NC}" + echo -e "${YELLOW} • 硬件类型: $HARDWARE_TYPE${NC}" + echo -e "${YELLOW} • SIP状态: $SIP_STATUS${NC}" + echo + echo -e "${BLUE}💡 [建议]${NC} 在此环境中,传统的ifconfig方法可能失败。" + echo -e "${BLUE} 脚本将自动尝试多种兼容性方法,包括第三方工具。${NC}" + echo + + # 检查第三方工具可用性 + local tools_available=false + if command -v spoof-mac >/dev/null 2>&1; then + echo -e "${GREEN}✅ 检测到 spoof-mac 工具${NC}" + tools_available=true + fi + if command -v macchanger >/dev/null 2>&1; then + echo -e "${GREEN}✅ 检测到 macchanger 工具${NC}" + tools_available=true + fi + + if [[ $tools_available == false ]]; then + echo -e "${YELLOW}⚠️ 未检测到第三方MAC修改工具${NC}" + echo -e "${BLUE}💡 建议安装: brew install spoof-mac 或 brew install macchanger${NC}" + echo + read -p "是否继续尝试修改?(y/n): " continue_choice + if [[ ! "$continue_choice" =~ ^(y|yes)$ ]]; then + log_info "用户选择跳过MAC地址修改" + return 1 + fi + fi + fi + echo -e "${YELLOW}[警告]${NC} 即将尝试修改您所有活动的 Wi-Fi 或以太网接口的 MAC 地址。" echo -e "${YELLOW}[警告]${NC} 此更改是 ${RED}临时${NC} 的,将在您重启 Mac 后恢复为原始地址。" echo -e "${YELLOW}[警告]${NC} 修改 MAC 地址可能会导致临时的网络中断或连接问题。"