├── .github └── workflows │ ├── check_cron.yaml │ └── reset.yaml ├── LICENSE ├── README.md ├── check_cron.sh └── install-socks5.sh /.github/workflows/check_cron.yaml: -------------------------------------------------------------------------------- 1 | name: Execute SSH Commands 2 | 3 | on: 4 | workflow_dispatch: # 手动触发工作流 5 | schedule: 6 | - cron: "30 0,13 * * *" # 每天 北京时间 早8点30分 晚9点30分 各运行一次 7 | 8 | jobs: 9 | execute-commands: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Set up SSHPass 13 | run: sudo apt-get update && sudo apt-get install -y sshpass 14 | 15 | - name: Get ACCOUNTS_JSON 16 | id: get-accounts 17 | run: | 18 | echo "$ACCOUNTS_JSON" > accounts.json 19 | env: 20 | ACCOUNTS_JSON: ${{ secrets.ACCOUNTS_JSON }} 21 | # 从 GitHub Secrets 获取 ACCOUNTS_JSON 变量,并保存到文件 accounts.json 22 | 23 | - name: Generate SSH Commands 24 | id: generate-ssh-commands 25 | run: | 26 | echo "#!/bin/bash" > sshpass.sh 27 | while IFS= read -r account; do 28 | username=$(echo "$account" | jq -r '.username') 29 | password=$(echo "$account" | jq -r '.password') 30 | ssh=$(echo "$account" | jq -r '.ssh') 31 | 32 | echo "echo \"Executing for $username@$ssh\"" >> sshpass.sh 33 | echo "sshpass -p '$password' ssh -o StrictHostKeyChecking=no '$username@$ssh' 'bash <(curl -s https://raw.githubusercontent.com/cmliu/socks5-for-serv00/main/check_cron.sh)'" >> sshpass.sh 34 | done < <(jq -c '.[]' accounts.json) 35 | chmod +x sshpass.sh 36 | 37 | - name: Execute SSH Commands 38 | run: ./sshpass.sh 39 | -------------------------------------------------------------------------------- /.github/workflows/reset.yaml: -------------------------------------------------------------------------------- 1 | name: 批量重置初始化任务 2 | # 该工作流用于一键重置脚本,使用 SSH 连接到远程服务器并执行脚本 3 | 4 | on: 5 | workflow_dispatch: # 手动触发工作流 6 | 7 | jobs: 8 | execute-commands: 9 | runs-on: ubuntu-latest 10 | steps: 11 | # 安装 SSH 密码登录工具 12 | - name: 安装 SSH 工具 13 | run: sudo apt-get update && sudo apt-get install -y sshpass 14 | 15 | # 从 Secrets 读取账户配置并生成 JSON 文件 16 | - name: 读取账户配置 17 | id: get-accounts 18 | run: | 19 | echo "$ACCOUNTS_JSON" > accounts.json 20 | env: 21 | ACCOUNTS_JSON: ${{ secrets.ACCOUNTS_JSON }} 22 | 23 | # 生成批量执行脚本,包含所有服务器的重置命令 24 | - name: 生成批量执行脚本 25 | id: generate-ssh-commands 26 | run: | 27 | echo "#!/bin/bash" > sshpass.sh 28 | while IFS= read -r account; do 29 | username=$(echo "$account" | jq -r '.username') 30 | password=$(echo "$account" | jq -r '.password') 31 | ssh=$(echo "$account" | jq -r '.ssh') 32 | 33 | echo "echo \"Executing for $username@$ssh\"" >> sshpass.sh 34 | echo "sshpass -p '$password' ssh -o StrictHostKeyChecking=no '$username@$ssh' '[ -d .nezha-agent ] && rm -rf .nezha-agent; [ -d .s5 ] && rm -rf .s5; [ -d .hysteria ] && rm -rf .hysteria && bash <(curl -Ls https://github.com/eooce/Sing-box/releases/download/00/reset.sh)'" >> sshpass.sh 35 | done < <(jq -c '.[]' accounts.json) 36 | chmod +x sshpass.sh 37 | 38 | # 执行生成的批量脚本 39 | - name: 执行远程重置任务 40 | run: ./sshpass.sh 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 CMLiussss 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # socks5-for-serv00 2 | 在 Serv00 和 CT8 机器上一步到位地安装和配置 SOCKS5 & nezha-agent,并将其用于 cmliu/edgetunnel 项目,帮助解锁 ChatGPT 等服务。通过一键脚本实现代理安装,使用 Crontab 保持进程活跃,并借助 GitHub Actions 实现帐号续期与自动化管理,确保长期稳定运行。 3 | 4 | ## 如何使用? [视频教程](https://youtu.be/L6gPyyD3dUw) 5 | 6 | ### 一键清理重置 7 | - 一键清理重置命令 8 | ```bash 9 | [ -d .nezha-agent ] && rm -rf .nezha-agent; [ -d .s5 ] && rm -rf .s5; [ -d .hysteria ] && rm -rf .hysteria && bash <(curl -Ls https://github.com/eooce/Sing-box/releases/download/00/reset.sh) 10 | ``` 11 | 12 | ### nohup模式 13 | - 一键安装 **新手小白用这个!** 14 | ```bash 15 | bash <(curl -s https://raw.githubusercontent.com/cmliu/socks5-for-serv00/main/install-socks5.sh) 16 | ``` 17 | ---- 18 | ### ~pm2模式~ 19 | - ~一键安装~ 20 | 21 | ~`bash <(curl -s https://raw.githubusercontent.com/cmliu/socks5-for-serv00/pm2/install-socks5.sh)`~ 22 | 23 | 24 | - 一键卸载pm2 25 | ```bash 26 | pm2 unstartup && pm2 delete all && npm uninstall -g pm2 27 | ``` 28 | ---- 29 | ## Github Actions保活 30 | 添加 Secrets.`ACCOUNTS_JSON` 变量 31 | ```json 32 | [ 33 | {"username": "cmliusss", "password": "7HEt(xeRxttdvgB^nCU6", "panel": "panel4.serv00.com", "ssh": "s4.serv00.com"}, 34 | {"username": "cmliussss2018", "password": "4))@cRP%HtN8AryHlh^#", "panel": "panel7.serv00.com", "ssh": "s7.serv00.com"}, 35 | {"username": "4r885wvl", "password": "%Mg^dDMo6yIY$dZmxWNy", "panel": "panel.ct8.pl", "ssh": "s1.ct8.pl"} 36 | ] 37 | ``` 38 | 39 | # 致谢 40 | [RealNeoMan](https://github.com/Neomanbeta/ct8socks)、[k0baya](https://github.com/k0baya/nezha4serv00)、[eooce](https://github.com/eooce) 41 | -------------------------------------------------------------------------------- /check_cron.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | USER=$(whoami) 4 | WORKDIR="/home/${USER}/.nezha-agent" 5 | FILE_PATH="/home/${USER}/.s5" 6 | CRON_S5="nohup ${FILE_PATH}/s5 -c ${FILE_PATH}/config.json >/dev/null 2>&1 &" 7 | CRON_NEZHA="nohup ${WORKDIR}/start.sh >/dev/null 2>&1 &" 8 | PM2_PATH="/home/${USER}/.npm-global/lib/node_modules/pm2/bin/pm2" 9 | CRON_JOB="*/12 * * * * $PM2_PATH resurrect >> /home/$(whoami)/pm2_resurrect.log 2>&1" 10 | REBOOT_COMMAND="@reboot pkill -kill -u $(whoami) && $PM2_PATH resurrect >> /home/$(whoami)/pm2_resurrect.log 2>&1" 11 | 12 | echo "检查并添加 crontab 任务" 13 | 14 | if [ "$(command -v pm2)" == "/home/${USER}/.npm-global/bin/pm2" ]; then 15 | echo "已安装 pm2,并返回正确路径,启用 pm2 保活任务" 16 | (crontab -l | grep -F "$REBOOT_COMMAND") || (crontab -l; echo "$REBOOT_COMMAND") | crontab - 17 | (crontab -l | grep -F "$CRON_JOB") || (crontab -l; echo "$CRON_JOB") | crontab - 18 | else 19 | if [ -e "${WORKDIR}/start.sh" ] && [ -e "${FILE_PATH}/config.json" ]; then 20 | echo "添加 nezha & socks5 的 crontab 重启任务" 21 | (crontab -l | grep -F "@reboot pkill -kill -u $(whoami) && ${CRON_S5} && ${CRON_NEZHA}") || (crontab -l; echo "@reboot pkill -kill -u $(whoami) && ${CRON_S5} && ${CRON_NEZHA}") | crontab - 22 | (crontab -l | grep -F "* * pgrep -x \"nezha-agent\" > /dev/null || ${CRON_NEZHA}") || (crontab -l; echo "*/12 * * * * pgrep -x \"nezha-agent\" > /dev/null || ${CRON_NEZHA}") | crontab - 23 | (crontab -l | grep -F "* * pgrep -x \"s5\" > /dev/null || ${CRON_S5}") || (crontab -l; echo "*/12 * * * * pgrep -x \"s5\" > /dev/null || ${CRON_S5}") | crontab - 24 | elif [ -e "${WORKDIR}/start.sh" ]; then 25 | echo "添加 nezha 的 crontab 重启任务" 26 | (crontab -l | grep -F "@reboot pkill -kill -u $(whoami) && ${CRON_NEZHA}") || (crontab -l; echo "@reboot pkill -kill -u $(whoami) && ${CRON_NEZHA}") | crontab - 27 | (crontab -l | grep -F "* * pgrep -x \"nezha-agent\" > /dev/null || ${CRON_NEZHA}") || (crontab -l; echo "*/12 * * * * pgrep -x \"nezha-agent\" > /dev/null || ${CRON_NEZHA}") | crontab - 28 | elif [ -e "${FILE_PATH}/config.json" ]; then 29 | echo "添加 socks5 的 crontab 重启任务" 30 | (crontab -l | grep -F "@reboot pkill -kill -u $(whoami) && ${CRON_S5}") || (crontab -l; echo "@reboot pkill -kill -u $(whoami) && ${CRON_S5}") | crontab - 31 | (crontab -l | grep -F "* * pgrep -x \"s5\" > /dev/null || ${CRON_S5}") || (crontab -l; echo "*/12 * * * * pgrep -x \"s5\" > /dev/null || ${CRON_S5}") | crontab - 32 | fi 33 | fi 34 | -------------------------------------------------------------------------------- /install-socks5.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 介绍信息 4 | echo -e "\e[32m 5 | ____ ___ ____ _ ______ ____ 6 | / ___| / _ \ / ___| |/ / ___| ___| 7 | \___ \| | | | | | ' /\___ \___ \ 8 | ___) | |_| | |___| . \ ___) |__) | 不要直连 9 | |____/ \___/ \____|_|\_\____/____/ 没有售后 10 | 缝合怪:cmliu 原作者们:RealNeoMan、k0baya、eooce 11 | \e[0m" 12 | 13 | # 获取当前用户名 14 | USER=$(whoami) 15 | WORKDIR="/home/${USER}/.nezha-agent" 16 | FILE_PATH="/home/${USER}/.s5" 17 | 18 | ################################################### 19 | 20 | socks5_config(){ 21 | # 提示用户输入socks5端口号 22 | read -p "请输入socks5端口号: " SOCKS5_PORT 23 | 24 | # 提示用户输入用户名和密码 25 | read -p "请输入socks5用户名: " SOCKS5_USER 26 | 27 | while true; do 28 | read -p "请输入socks5密码(不能包含@和:):" SOCKS5_PASS 29 | echo 30 | if [[ "$SOCKS5_PASS" == *"@"* || "$SOCKS5_PASS" == *":"* ]]; then 31 | echo "密码中不能包含@和:符号,请重新输入。" 32 | else 33 | break 34 | fi 35 | done 36 | 37 | # config.js文件 38 | cat > ${FILE_PATH}/config.json << EOF 39 | { 40 | "log": { 41 | "access": "/dev/null", 42 | "error": "/dev/null", 43 | "loglevel": "none" 44 | }, 45 | "inbounds": [ 46 | { 47 | "port": "$SOCKS5_PORT", 48 | "protocol": "socks", 49 | "tag": "socks", 50 | "settings": { 51 | "auth": "password", 52 | "udp": false, 53 | "ip": "0.0.0.0", 54 | "userLevel": 0, 55 | "accounts": [ 56 | { 57 | "user": "$SOCKS5_USER", 58 | "pass": "$SOCKS5_PASS" 59 | } 60 | ] 61 | } 62 | } 63 | ], 64 | "outbounds": [ 65 | { 66 | "tag": "direct", 67 | "protocol": "freedom" 68 | } 69 | ] 70 | } 71 | EOF 72 | } 73 | 74 | install_socks5(){ 75 | socks5_config 76 | if [ ! -e "${FILE_PATH}/s5" ]; then 77 | curl -L -sS -o "${FILE_PATH}/s5" "https://github.com/eooce/test/releases/download/freebsd/web" 78 | else 79 | read -p "socks5 程序已存在,是否重新下载覆盖?(Y/N 回车N)" downsocks5 80 | downsocks5=${downsocks5^^} # 转换为大写 81 | if [ "$downsocks5" == "Y" ]; then 82 | if pgrep s5 > /dev/null; then 83 | pkill s5 84 | echo "socks5 进程已被终止" 85 | fi 86 | curl -L -sS -o "${FILE_PATH}/s5" "https://github.com/eooce/test/releases/download/freebsd/web" 87 | else 88 | echo "使用已存在的 socks5 程序" 89 | fi 90 | fi 91 | 92 | if [ -e "${FILE_PATH}/s5" ]; then 93 | chmod 777 "${FILE_PATH}/s5" 94 | nohup ${FILE_PATH}/s5 -c ${FILE_PATH}/config.json >/dev/null 2>&1 & 95 | sleep 2 96 | pgrep -x "s5" > /dev/null && echo -e "\e[1;32ms5 is running\e[0m" || { echo -e "\e[1;35ms5 is not running, restarting...\e[0m"; pkill -x "s5" && nohup "${FILE_PATH}/s5" -c ${FILE_PATH}/config.json >/dev/null 2>&1 & sleep 2; echo -e "\e[1;32ms5 restarted\e[0m"; } 97 | CURL_OUTPUT=$(curl -s 4.ipw.cn --socks5 $SOCKS5_USER:$SOCKS5_PASS@localhost:$SOCKS5_PORT) 98 | if [[ $CURL_OUTPUT =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then 99 | echo "代理创建成功,返回的IP是: $CURL_OUTPUT" 100 | SERV_DOMAIN=$CURL_OUTPUT 101 | # 查找并列出包含用户名的文件夹 102 | found_folders=$(find "/home/${USER}/domains" -type d -name "*${USER,,}*") 103 | if [ -n "$found_folders" ]; then 104 | if echo "$found_folders" | grep -q "serv00.net"; then 105 | #echo "找到包含 'serv00.net' 的文件夹。" 106 | SERV_DOMAIN="${USER,,}.serv00.net" 107 | elif echo "$found_folders" | grep -q "ct8.pl"; then 108 | #echo "未找到包含 'ct8.pl' 的文件夹。" 109 | SERV_DOMAIN="${USER,,}.ct8.pl" 110 | fi 111 | fi 112 | 113 | echo "socks://${SOCKS5_USER}:${SOCKS5_PASS}@${SERV_DOMAIN}:${SOCKS5_PORT}" 114 | else 115 | echo "代理创建失败,请检查自己输入的内容。" 116 | fi 117 | fi 118 | } 119 | 120 | download_agent() { 121 | echo "请选择 nezha-agent 被控版本:" 122 | echo "1. release 最新版本" 123 | echo "2. v0.20.5 兼容版本" 124 | read -p "请选择(回车使用最新版本):" nezhaAgentVersion 125 | nezhaAgentVersion=${nezhaAgentVersion:-1} 126 | 127 | # 根据用户选择设置下载链接 128 | if [ "$nezhaAgentVersion" = "1" ]; then 129 | DOWNLOAD_LINK="https://github.com/nezhahq/agent/releases/latest/download/nezha-agent_freebsd_amd64.zip" 130 | elif [ "$nezhaAgentVersion" = "2" ]; then 131 | DOWNLOAD_LINK="https://github.com/nezhahq/agent/releases/download/v0.20.5/nezha-agent_freebsd_amd64.zip" 132 | else 133 | echo "输入无效,将使用最新版本" 134 | DOWNLOAD_LINK="https://github.com/nezhahq/agent/releases/latest/download/nezha-agent_freebsd_amd64.zip" 135 | fi 136 | # 使用wget下载,如果下载失败则执行以下操作 137 | if ! wget -qO "$ZIP_FILE" "$DOWNLOAD_LINK"; then 138 | echo '错误: 下载失败! 请检查您的网络连接或稍后重试。' 139 | return 1 140 | fi 141 | return 0 142 | } 143 | 144 | decompression() { 145 | unzip "$1" -d "$TMP_DIRECTORY" 146 | EXIT_CODE=$? 147 | if [ ${EXIT_CODE} -ne 0 ]; then 148 | rm -r "$TMP_DIRECTORY" 149 | echo "removed: $TMP_DIRECTORY" 150 | exit 1 151 | fi 152 | } 153 | 154 | install_agent() { 155 | install -m 755 ${TMP_DIRECTORY}/nezha-agent ${WORKDIR}/nezha-agent 156 | } 157 | 158 | generate_run_agent(){ 159 | echo "关于接下来需要输入的三个变量,请注意:" 160 | echo "Dashboard 站点地址可以写 IP 也可以写域名(域名不可套 CDN);但是请不要加上 http:// 或者 https:// 等前缀,直接写 IP 或者域名即可;" 161 | echo "面板 RPC 端口为你的 Dashboard 安装时设置的用于 Agent 接入的 RPC 端口(默认 5555);" 162 | echo "Agent 密钥需要先在管理面板上添加 Agent 获取。" 163 | printf "请输入 Dashboard 站点地址:" 164 | read -r NZ_DASHBOARD_SERVER 165 | printf "请输入面板 RPC 端口:" 166 | read -r NZ_DASHBOARD_PORT 167 | printf "请输入 Agent 密钥: " 168 | read -r NZ_DASHBOARD_PASSWORD 169 | printf "是否启用针对 gRPC 端口的 SSL/TLS加密 (--tls),需要请按 [Y],默认是不需要,不理解的用户可回车跳过: " 170 | read -r NZ_GRPC_PROXY 171 | echo "${NZ_GRPC_PROXY}" | grep -qiw 'Y' && ARGS='--tls' 172 | 173 | if [ -z "${NZ_DASHBOARD_SERVER}" ] || [ -z "${NZ_DASHBOARD_PASSWORD}" ]; then 174 | echo "error! 所有选项都不能为空" 175 | return 1 176 | rm -rf ${WORKDIR} 177 | exit 178 | fi 179 | 180 | cat > ${WORKDIR}/start.sh << EOF 181 | #!/bin/bash 182 | pgrep -f 'nezha-agent' | xargs -r kill 183 | cd ${WORKDIR} 184 | TMPDIR="${WORKDIR}" exec ${WORKDIR}/nezha-agent -s ${NZ_DASHBOARD_SERVER}:${NZ_DASHBOARD_PORT} -p ${NZ_DASHBOARD_PASSWORD} --report-delay 4 --disable-auto-update --disable-force-update ${ARGS} >/dev/null 2>&1 185 | EOF 186 | chmod +x ${WORKDIR}/start.sh 187 | } 188 | 189 | run_agent(){ 190 | nohup ${WORKDIR}/start.sh >/dev/null 2>&1 & 191 | printf "nezha-agent已经准备就绪,请按下回车键启动\n" 192 | read 193 | printf "正在启动nezha-agent,请耐心等待...\n" 194 | sleep 3 195 | if pgrep -f "nezha-agent -s" > /dev/null; then 196 | echo "nezha-agent 已启动!" 197 | echo "如果面板处未上线,请检查参数是否填写正确,并停止 agent 进程,删除已安装的 agent 后重新安装!" 198 | echo "停止 agent 进程的命令:pgrep -f 'nezha-agent' | xargs -r kill" 199 | echo "删除已安装的 agent 的命令:rm -rf ~/.nezha-agent" 200 | else 201 | rm -rf "${WORKDIR}" 202 | echo "nezha-agent 启动失败,请检查参数填写是否正确,并重新安装!" 203 | fi 204 | } 205 | 206 | install_nezha_agent(){ 207 | mkdir -p ${WORKDIR} 208 | cd ${WORKDIR} 209 | TMP_DIRECTORY="$(mktemp -d)" 210 | ZIP_FILE="${TMP_DIRECTORY}/nezha-agent_freebsd_amd64.zip" 211 | 212 | # 如果 start.sh 文件不存在,则生成运行代理的脚本 213 | if [ ! -e "${WORKDIR}/start.sh" ]; then 214 | generate_run_agent 215 | else 216 | read -p "nezha-agent 配置信息已存在,是否重新配置?(Y/N 回车N)" nezhaagentyn 217 | nezhaagentyn=${nezhaagentyn^^} # 转换为大写 218 | if [ "$nezhaagentyn" == "Y" ]; then 219 | generate_run_agent 220 | fi 221 | fi 222 | 223 | # 如果 nezha-agent 文件不存在,则下载并解压代理文件,然后进行安装 224 | if [ ! -e "${WORKDIR}/nezha-agent" ]; then 225 | download_agent 226 | decompression "${ZIP_FILE}" 227 | install_agent 228 | else 229 | read -p "nezha-agent 文件已存在,是否重新下载最新版本?(Y/N 回车N)" nezhaagentd 230 | nezhaagentd=${nezhaagentd^^} # 转换为大写 231 | if [ "$nezhaagentd" == "Y" ]; then 232 | rm -rf "${ZIP_FILE}" 233 | if pgrep nezha-agent > /dev/null; then 234 | pkill nezha-agent 235 | echo "nezha-agent 进程已被终止" 236 | fi 237 | rm -rf "${WORKDIR}/nezha-agent" 238 | download_agent 239 | decompression "${ZIP_FILE}" 240 | install_agent 241 | fi 242 | fi 243 | 244 | # 删除临时目录 245 | rm -rf "${TMP_DIRECTORY}" 246 | 247 | # 如果 start.sh 文件存在,则运行代理 248 | if [ -e "${WORKDIR}/start.sh" ]; then 249 | run_agent 250 | fi 251 | 252 | } 253 | 254 | ########################梦开始的地方########################### 255 | 256 | read -p "是否安装 socks5 (Y/N 回车N): " socks5choice 257 | socks5choice=${socks5choice^^} # 转换为大写 258 | if [ "$socks5choice" == "Y" ]; then 259 | # 检查socks5目录是否存在 260 | if [ -d "$FILE_PATH" ]; then 261 | install_socks5 262 | else 263 | # 创建socks5目录 264 | echo "正在创建 socks5 目录..." 265 | mkdir -p "$FILE_PATH" 266 | install_socks5 267 | fi 268 | else 269 | echo "不安装 socks5" 270 | fi 271 | 272 | read -p "是否安装 nezha-agent (Y/N 回车N): " choice 273 | choice=${choice^^} # 转换为大写 274 | if [ "$choice" == "Y" ]; then 275 | echo "正在安装 nezha-agent..." 276 | install_nezha_agent 277 | else 278 | echo "不安装 nezha-agent" 279 | fi 280 | 281 | read -p "是否添加 crontab 守护进程的计划任务(Y/N 回车N): " crontabgogogo 282 | crontabgogogo=${crontabgogogo^^} # 转换为大写 283 | if [ "$crontabgogogo" == "Y" ]; then 284 | echo "添加 crontab 守护进程的计划任务" 285 | curl -s https://raw.githubusercontent.com/cmliu/socks5-for-serv00/main/check_cron.sh | bash 286 | else 287 | echo "不添加 crontab 计划任务" 288 | fi 289 | 290 | echo "脚本执行完成。致谢:RealNeoMan、k0baya、eooce" 291 | --------------------------------------------------------------------------------