note/tech/naive.sh
2025-11-19 10:16:05 +08:00

146 lines
6.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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