#!/bin/sh ############# # 脚本说明: # 1. 执行./naive.sh start,启动naiveproxy # 2. 执行./naive.sh stop,停止naiveproxy # 3. 执行脚本会创建文件夹naiveproxy,并下载naiveproxy到naiveproxy目录下 # 4. 脚本会自动判断当前环境是M1还是x86,下载对应的naiveproxy # 5. 脚本会自动创建配置文件config.json,并写入配置 # 6. 脚本会自动检测设定的端口是否被占用,如果被占用,则杀掉占用进程 # 7. 脚本会自动检测naiveproxy进程是否存在,如果存在,则杀掉进程 ############# # 定义变量 SOCKS_PORT="1080" HTTP_PORT="1099" PAC_URL="https://pac.disbaidu.com/gfw.pac" PAC2_URL="https://pac.disbaidu.com/gfw2.pac" NAIVE_DOWNLOAD_ARM64="https://sync.disbaidu.com/naive/naiveproxy-mac-arm64.tar.xz" NAIVE_DOWNLOAD_X64="https://sync.disbaidu.com/naive/naiveproxy-mac-x64.tar.xz" CONFIG_PROXY_URL="https://onghan:onghan@o.disbaidu.com" # 这个也建议作为变量 # 判断是否mac系统 if [ "$(uname)" != "Darwin" ]; then echo "当前系统不是MacOS。" exit 1 fi SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) cd "$SCRIPT_DIR" || { echo "错误:无法切换到脚本所在的目录。"; exit 1; } # 判断当前是否存在naiveproxy目录,如果不存在,则创建 if [ ! -d "naiveproxy" ]; then mkdir -p naiveproxy || { echo "错误:无法创建 naiveproxy 目录。"; exit 1; } echo "创建$(pwd)/naiveproxy目录" fi cd naiveproxy || { echo "错误:无法切换到 naiveproxy 目录。"; exit 1; } # 判断是否存在naive文件,如果不存在,则下载 if [ ! -f "naive" ]; then echo "naive文件不存在,开始下载" # 判断当前环境是M1还是x86,下载对应的naiveproxy if [ $(uname -m) = "arm64" ]; then echo "当前环境是M1,下载M1版naiveproxy" curl -L -o naive.tar.xz "$NAIVE_DOWNLOAD_ARM64" else echo "当前环境是x86,下载x86版naiveproxy" curl -L -o naive.tar.xz "$NAIVE_DOWNLOAD_X64" fi # 解压naive文件 echo "解压naive文件" tar -xf naive.tar.xz mv naiveproxy-* naivetmp cp naivetmp/naive naive rm -rf naivetmp rm naive.tar.xz fi # 判断config.json文件是否存在,如果不存在,创建配置文件并写入配置 if [ ! -f "config.json" ]; then echo "config.json文件不存在,创建配置文件并写入配置" echo '{ "listen": ["socks://127.0.0.1:'"$SOCKS_PORT"'","http://127.0.0.1:'"$HTTP_PORT"'"], "proxy": "'"$CONFIG_PROXY_URL"'", "log": "o.log"}' >config.json sleep 2 fi # 检测第一个参数是否为启动参数或是空,如果是,则启动naiveproxy if [ "$1" = "start" ] || [ -z "$1" ]; then echo "启动naiveproxy" # 启动naiveproxy # 是否存在naive进程,如果存在,则杀掉进程 if pgrep -f "naive"; then echo "naiveproxy进程存在,杀掉进程" killall naive sleep 2 fi # 检测socks的端口是否被占用,如果被占用,则杀掉占用进程 if lsof -i:"$SOCKS_PORT" | grep -q "LISTEN"; then echo "注意:$SOCKS_PORT 端口被占用。" read -r -p "是否杀掉占用 $SOCKS_PORT 端口的进程?(y/N) " response if [[ "$response" =~ ^([yY])$ ]]; then echo "杀掉占用 $SOCKS_PORT 端口的进程" lsof -i:"$SOCKS_PORT" | awk '{print $2}' | xargs kill -9 sleep 2 else echo "用户取消,不杀掉占用 $SOCKS_PORT 端口的进程。脚本退出。" exit 1 # 如果端口被占用且用户选择不杀掉,通常脚本无法继续,所以选择退出 fi fi # 检测http端口是否被占用,如果被占用,则杀掉占用进程 if lsof -i:"$HTTP_PORT" | grep -q "LISTEN"; then echo "注意:$HTTP_PORT 端口被占用。" read -r -p "是否杀掉占用 $HTTP_PORT 端口的进程?(y/N) " response if [[ "$response" =~ ^([yY])$ ]]; then echo "杀掉占用 $HTTP_PORT 端口的进程" lsof -i:"$HTTP_PORT" | awk '{print $2}' | xargs kill -9 sleep 2 else echo "用户取消,不杀掉占用 $SOCKS_PORT 端口的进程。脚本退出。" exit 1 # 如果端口被占用且用户选择不杀掉,通常脚本无法继续,所以选择退出 fi fi echo "开始启动naive 代理..." nohup "$SCRIPT_DIR"/naiveproxy/naive "$SCRIPT_DIR"/naiveproxy/config.json >/dev/null 2>&1 & sleep 2 # 测试socks代理是否正常工作 REQUESTS=$(curl -x socks5h://127.0.0.1:"$SOCKS_PORT" -m 5 -sL https://pac-9d7.pages.dev/access) if [ -z "$REQUESTS" ]; then echo "naiveproxy启动失败!" osascript -e 'tell app "System Events" to display dialog "代理启动失败!" buttons {"OK"}' exit 1 fi # 测试http代理是否正常工作 REQUESTS=$(curl -x http://127.0.0.1:"$HTTP_PORT" -m 5 -sL https://pac-9d7.pages.dev/access) if [ -z "$REQUESTS" ]; then echo "naiveproxy启动失败!" osascript -e 'tell app "System Events" to display dialog "代理启动失败!" buttons {"OK"}' exit 1 fi if pgrep -f "naive"; then # 设置pac自动代理 echo "设置PAC的http代理。。。" networksetup -setautoproxyurl Wi-Fi "$PAC_URL" echo "naiveproxy启动成功!" osascript -e 'tell app "System Events" to display dialog "代理启动成功,已设置PAC代理。直接打开浏览器就可以自由上网。\n本地代理为:http://127.0.0.1:'"$HTTP_PORT"'\n代理测试结果:'"$REQUESTS"'" buttons {"OK"}' exit 0 else echo "naiveproxy启动失败!" exit 1 fi elif [ "$1" = "stop" ]; then # 取消pac自动代理 networksetup -setautoproxystate Wi-Fi off echo "停止naiveproxy" # 停止naiveproxy if pgrep -f "naive"; then killall naive else echo "naiveproxy进程不存在" fi # 检测设定的端口是否被占用,如果被占用,则杀掉占用进程 if lsof -i:"$SOCKS_PORT" | grep -q "LISTEN"; then echo "$SOCKS_PORT端口被占用,杀掉占用进程" lsof -i:"$SOCKS_PORT" | awk '{print $2}' | xargs kill -9 fi osascript -e 'tell app "System Events" to display dialog "已关闭代理服务器,关闭PAC代理。" buttons {"OK"}' else echo "参数错误,请输入 ./naive start或 ./naive stop" fi