@ -3,273 +3,322 @@
export LANG = en_US.UTF-8
# 当前脚本版本号和新增功能
VERSION = '1.08 '
VERSION = '1.09 '
# 最大支持流媒体
SUPPORT_NUM = '2'
# 设置关联数组 T 用于中英文
declare -A T
T[ E0] = "\n Language:\n 1.English (default) \n 2.简体中文\n"
T[ C0] = " ${ T [E0] } "
T[ E1] = "Support change IP for Client WARP mode"
T[ C1] = "支持 Client WRAP 模式下更换 IP"
T[ E2] = "The script must be run as root, you can enter sudo -i and then download and run again. Feedback: [https://github.com/fscarmen/warp_unlock/issues]"
T[ C2] = "必须以root方式运行脚本,可以输入 sudo -i 后重新下载运行,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]"
T[ E3] = "Choose:"
T[ C3] = "请选择:"
T[ E4] = "\n Neither the WARP network interface nor Socks5 are installed, please select the installation script:\n 1. fscarmen (Default)\n 2. kkkyg\n 3. P3terx\n 4. Misaka\n 0. Exit\n"
T[ C4] = "\n WARP 网络接口和 Socks5 都没有安装,请选择安装脚本:\n 1. fscarmen (默认)\n 2. kkkyg\n 3. P3terx\n 4. Misaka\n 0. 退出\n"
T[ E5] = "The script supports Debian, Ubuntu, CentOS or Alpine systems only. Feedback: [https://github.com/fscarmen/warp_unlock/issues]"
T[ C5] = "本脚本只支持 Debian、Ubuntu、CentOS 或 Alpine 系统,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]"
T[ E6] = "Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv6 Interface\n"
T[ C6] = "\n 请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv6 网络接口\n"
T[ E7] = "Installing \$c..."
T[ C7] = "安装 \$c 中……"
T[ E8] = "It is necessary to upgrade the latest package library before install \$c.It will take a little time,please be patiently..."
T[ C8] = "先升级软件库才能继续安装 \$c,时间较长,请耐心等待……"
T[ E9] = "Failed to install \$c. The script is aborted. Feedback: [https://github.com/fscarmen/warp_unlock/issues]"
T[ C9] = "安装 \$c 失败,脚本中止,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]"
T[ E10] = "\n Media unlock daemon installed successfully. The running log of the scheduled task will be saved in /root/result.log\n"
T[ C10] = "\n 媒体解锁守护进程已安装成功。定时任务运行日志将保存在 /root/result.log\n"
T[ E11] = "\n The media unlock daemon is completely uninstalled.\n"
T[ C11] = "\n 媒体解锁守护进程已彻底卸载\n"
T[ E12] = "\n 1. Mode 1: Check it every 5 minutes.\n 2. Mode 2: Create a jobs with systemd service. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 3. Mode 3: Create a jobs with nohup to run. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 4. Mode 4: Create a screen named [u] and run. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 5. Mode 5: Install pm2 daemon. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 6. Uninstall\n 0. Exit\n"
T[ C12] = "\n 1. 模式1: 定时5分钟检查一次,遇到不解锁时更换 WARP IP,直至刷成功\n 2. 模式2: 创建 systemd 服务。进程一直在后台,当刷成功后,每隔1小时检查一次\n 3. 模式3: 用 nohup 创建一个 jobs。进程一直在后台,当刷成功后,每隔1小时检查一次\n 4. 模式4: 创建一个名为 [u] 的 Screen 会话。进程一直在后台,当刷成功后,每隔1小时检查一次\n 5. 模式5: 安装 pm2 守护进程,安装依赖需较长时间。进程一直在后台,当刷成功后,每隔1小时检查一次\n 6. 卸载\n 0. 退出\n"
T[ E13] = "\\\n The current region is \$REGION. Confirm press [y] . If you want another regions, please enter the two-digit region abbreviation. \(such as hk,sg. Default is \$REGION\):"
T[ C13] = "\\\n 当前地区是:\$REGION,需要解锁当前地区请按 y , 如需其他地址请输入两位地区简写 \(如 hk,sg,默认:\$REGION\):"
T[ E14] = "Wrong input."
T[ C14] = "输入错误"
T[ E15] = "\n Select the stream media you wanna unlock (Multiple selections are possible, such as 123. The default is select all)\n 1. Netflix\n 2. Disney+\n"
T[ C15] = "\n 选择你期望解锁的流媒体 (可多选,如 123,默认为全选)\n 1. Netflix\n 2. Disney+\n"
T[ E16] = "The script Born to make stream media unlock by WARP. Detail:[https://github.com/fscarmen/warp_unlock]\n Features:\n * Support a variety of main stream streaming media detection.\n * Multiple ways to unlock.\n * Support WARP Socks5 Proxy to detect and replace IP.\n * log output\n"
T[ C16] = "本项目专为 WARP 解锁流媒体而生。详细说明:[https://github.com/fscarmen/warp_unlock]\n 脚本特点:\n * 支持多种主流串流影视检测\n * 多种方式解锁\n * 支持 WARP Socks5 Proxy 检测和更换 IP\n * 日志输出\n"
T[ E17] = "Version"
T[ C17] = "脚本版本"
T[ E18] = "New features"
T[ C18] = "功能新增"
T[ E19] = "\\\n Stream media unlock daemon is running in mode: \$UNLOCK_MODE_NOW.\\\n"
T[ C19] = "\\\n 流媒体解锁守护正在以模式: \$UNLOCK_MODE_NOW 运行中\\\n"
T[ E20] = "Media unlock daemon installed successfully. A session window u has been created, enter [screen -Udr u] and close [screen -SX u quit]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log\n"
T[ C20] = "\n 媒体解锁守护进程已安装成功,已创建一个会话窗口 u ,进入 [screen -Udr u],关闭 [screen -SX u quit],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log\n"
T[ E21] = "Media unlock daemon installed successfully. A jobs has been created, check [pgrep -laf warp_unlock] and close [kill -9 \$(pgrep -f warp_unlock)]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log\n"
T[ C21] = "\n 媒体解锁守护进程已安装成功,已创建一个jobs,查看 [pgrep -laf warp_unlock],关闭 [kill -9 \$(pgrep -f warp_unlock)],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log\n"
T[ E22] = "The script runs on today: \$TODAY. Total:\$TOTAL\\\n"
T[ C22] = "脚本当天运行次数:\$TODAY,累计运行次数:\$TOTAL\\\n"
T[ E23] = "Please choose to brush WARP IP:\n 1. WARP IPv4 Interface\n 2. WARP IPv6 Interface\n"
T[ C23] = "\n 请选择刷 WARP IP 方式:\n 1. WARP IPv4 网络接口\n 2. WARP IPv6 网络接口\n"
T[ E24] = "No WARP method specified."
T[ C24] = "没有指定的 WARP 方式"
T[ E25] = "No unlock method specified."
T[ C25] = "没有指定的解锁模式"
T[ E26] = "Expected region abbreviation should be two digits (eg hk,sg)."
T[ C26] = "期望地区简码应该为两位 (如 hk,sg)"
T[ E27] = "No unlock script is installed."
T[ C27] = "解锁脚本还没有安装"
T[ E28] = "Unlock script is installed."
T[ C28] = "解锁脚本已安装"
T[ E29] = "\\\n Please enter Bot Token if you need push the logs to Telegram. Leave blank to skip:"
T[ C29] = "\\\n 如需要把日志推送到 Telegram 机器人,请输入 Bot Token,不需要直接回车:"
T[ E30] = "\\\n Enter USERID:"
T[ C30] = "\\\n 输入 USERID:"
T[ E31] = "\\\n Enter custom name:"
T[ C31] = "\\\n 自定义名称:"
T[ E40] = "Mode 1: Check it every 5 minutes"
T[ C40] = "模式1: 定时5分钟检查一次,遇到不解锁时更换 WARP IP,直至刷成功"
T[ E41] = "Mode 2: Create a screen named [u] and run"
T[ C41] = "模式2: 创建一个名为 [u] 的 Screen 在后台刷"
T[ E42] = "Mode 3: Create a jobs with nohup to run in the background"
T[ C42] = "模式3: 用 nohup 创建一个 jobs 在后台刷"
T[ E43] = "Media unlock daemon installed successfully. A systemd service has been created, check [systemctl status warp_unlock] and close [systemctl disable --now warp_unlock]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log\n"
T[ C43] = "\n 媒体解锁守护进程已安装成功,已创建一个 systemd 服务,查看 [systemctl status warp_unlock],关闭 [systemctl disable --now warp_unlock],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log\n"
T[ E44] = "Media unlock daemon installed successfully. pm2 daemon is running, check pm2 [list] and close [pm2 delete warp_unlock; pm2 unstartup systemd;]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log\n"
T[ C44] = "\n 媒体解锁守护进程已安装成功,pm2 守护进程正在工作中,查看 [pm2 list],关闭 [pm2 delete warp_unlock; pm2 unstartup systemd; ],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log\n"
T[ E45] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n"
T[ C45] = "\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n"
T[ E46] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv6 Interface\n"
T[ C46] = "\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv6 网络接口\n"
T[ E47] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv6 Interface\n"
T[ C47] = "\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv6 网络接口\n"
T[ E48] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv4 Interface\n"
T[ C48] = "\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv4 网络接口\n"
T[ E49] = "Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv4 Interface\n"
T[ C49] = "\n 请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv4 网络接口\n"
T[ E50] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv4 Interface\n"
T[ C50] = "\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv4 网络接口\n"
T[ E51] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv4 Interface\n 3. WARP IPv6 Interface\n"
T[ C51] = "\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv4 网络接口\n 3. WARP IPv6 网络接口\n"
T[ E52] = "Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv4 Interface\n 3. WARP IPv6 Interface\n"
T[ C52] = "\n 请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv4 网络接口\n 3. WARP IPv6 网络接口\n"
T[ E53] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv4 Interface\n 4. WARP IPv6 Interface\n"
T[ C53] = "\n 请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv4 网络接口\n 4. WARP IPv6 网络接口\n"
T[ E54] = "No option. The script is aborted. Feedback: [https://github.com/fscarmen/warp_unlock/issues]"
T[ C54] = "没有该选项,脚本退出,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]"
E[ 0] = "Language:\n 1.English (default) \n 2.简体中文"
C[ 0] = " ${ E [0] } "
E[ 1] = "Support change IP for warp-go mode"
C[ 1] = "支持 warp-go 模式下更换 IP"
E[ 2] = "The script must be run as root, you can enter sudo -i and then download and run again. Feedback: [https://github.com/fscarmen/warp_unlock/issues]"
C[ 2] = "必须以root方式运行脚本,可以输入 sudo -i 后重新下载运行,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]"
E[ 3] = "Choose:"
C[ 3] = "请选择:"
E[ 4] = "Neither the WARP network interface nor Socks5 are installed, please select the installation script:\n 1. fscarmen's wgcf warp (Default)\n 2. fscarmen's warp-go\n 3. P3terx\n 4. Misaka\n 0. Exit"
C[ 4] = "WARP 网络接口和 Socks5 都没有安装,请选择安装脚本:\n 1. fscarmen's wgcf warp (默认)\n 2. fscarmen's warp-go\n 3. P3terx\n 4. Misaka\n 0. 退出"
E[ 5] = "The script supports Debian, Ubuntu, CentOS or Alpine systems only. Feedback: [https://github.com/fscarmen/warp_unlock/issues]"
C[ 5] = "本脚本只支持 Debian、Ubuntu、CentOS 或 Alpine 系统,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]"
E[ 6] = "Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv6 Interface"
C[ 6] = "请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv6 网络接口"
E[ 7] = "Installing \$c..."
C[ 7] = "安装 \$c 中……"
E[ 8] = "It is necessary to upgrade the latest package library before install \$c.It will take a little time,please be patiently..."
C[ 8] = "先升级软件库才能继续安装 \$c,时间较长,请耐心等待……"
E[ 9] = "Failed to install \$c. The script is aborted. Feedback: [https://github.com/fscarmen/warp_unlock/issues]"
C[ 9] = "安装 \$c 失败,脚本中止,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]"
E[ 10] = "Media unlock daemon installed successfully. The running log of the scheduled task will be saved in /root/result.log"
C[ 10] = "媒体解锁守护进程已安装成功。定时任务运行日志将保存在 /root/result.log"
E[ 11] = "The media unlock daemon is completely uninstalled."
C[ 11] = "媒体解锁守护进程已彻底卸载"
E[ 12] = "\n 1. Mode 1: Check it every 5 minutes.\n 2. Mode 2: Create a jobs with systemd service. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 3. Mode 3: Create a jobs with nohup to run. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 4. Mode 4: Create a screen named [u] and run. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 5. Mode 5: Install pm2 daemon. The process runs in the background. When the unlock is all successful, it will be checked every 1 hour.\n 6. Uninstall\n 0. Exit\n"
C[ 12] = "\n 1. 模式1: 定时5分钟检查一次,遇到不解锁时更换 WARP IP,直至刷成功\n 2. 模式2: 创建 systemd 服务。进程一直在后台,当刷成功后,每隔1小时检查一次\n 3. 模式3: 用 nohup 创建一个 jobs。进程一直在后台,当刷成功后,每隔1小时检查一次\n 4. 模式4: 创建一个名为 [u] 的 Screen 会话。进程一直在后台,当刷成功后,每隔1小时检查一次\n 5. 模式5: 安装 pm2 守护进程,安装依赖需较长时间。进程一直在后台,当刷成功后,每隔1小时检查一次\n 6. 卸载\n 0. 退出\n"
E[ 13] = "The current region is \$REGION. Confirm press [y] . If you want another regions, please enter the two-digit region abbreviation. \(such as hk,sg. Default is \$REGION\):"
C[ 13] = "当前地区是:\$REGION,需要解锁当前地区请按 y , 如需其他地址请输入两位地区简写 \(如 hk,sg,默认:\$REGION\):"
E[ 14] = "Wrong input."
C[ 14] = "输入错误"
E[ 15] = "Select the stream media you wanna unlock (Multiple selections are possible, such as 123. The default is select all)\n 1. Netflix\n 2. Disney+"
C[ 15] = "选择你期望解锁的流媒体 (可多选,如 123,默认为全选)\n 1. Netflix\n 2. Disney+"
E[ 16] = "The script Born to make stream media unlock by WARP. Detail:[https://github.com/fscarmen/warp_unlock]\n Features:\n * Support a variety of main stream streaming media detection.\n * Multiple ways to unlock.\n * Support WARP Socks5 Proxy to detect and replace IP.\n * log output\n"
C[ 16] = "本项目专为 WARP 解锁流媒体而生。详细说明:[https://github.com/fscarmen/warp_unlock]\n 脚本特点:\n * 支持多种主流串流影视检测\n * 多种方式解锁\n * 支持 WARP Socks5 Proxy 检测和更换 IP\n * 日志输出\n"
E[ 17] = "Version"
C[ 17] = "脚本版本"
E[ 18] = "New features"
C[ 18] = "功能新增"
E[ 19] = "\\\n Stream media unlock daemon is running in mode: \$UNLOCK_MODE_NOW.\\\n"
C[ 19] = "\\\n 流媒体解锁守护正在以模式: \$UNLOCK_MODE_NOW 运行中\\\n"
E[ 20] = "Media unlock daemon installed successfully. A session window u has been created, enter [screen -Udr u] and close [screen -SX u quit]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log"
C[ 20] = "媒体解锁守护进程已安装成功,已创建一个会话窗口 u ,进入 [screen -Udr u],关闭 [screen -SX u quit],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log"
E[ 21] = "Media unlock daemon installed successfully. A jobs has been created, check [pgrep -laf warp_unlock] and close [kill -9 \$(pgrep -f warp_unlock)]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log"
C[ 21] = "媒体解锁守护进程已安装成功,已创建一个jobs,查看 [pgrep -laf warp_unlock],关闭 [kill -9 \$(pgrep -f warp_unlock)],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log"
E[ 22] = "The script runs on today: \$TODAY. Total:\$TOTAL"
C[ 22] = "脚本当天运行次数:\$TODAY,累计运行次数:\$TOTAL"
E[ 23] = "Please choose to brush WARP IP:\n 1. WARP IPv4 Interface\n 2. WARP IPv6 Interface"
C[ 23] = "请选择刷 WARP IP 方式:\n 1. WARP IPv4 网络接口\n 2. WARP IPv6 网络接口"
E[ 24] = "No WARP method specified."
C[ 24] = "没有指定的 WARP 方式"
E[ 25] = "No unlock method specified."
C[ 25] = "没有指定的解锁模式"
E[ 26] = "Expected region abbreviation should be two digits (eg hk,sg)."
C[ 26] = "期望地区简码应该为两位 (如 hk,sg)"
E[ 27] = "No unlock script is installed."
C[ 27] = "解锁脚本还没有安装"
E[ 28] = "Unlock script is installed."
C[ 28] = "解锁脚本已安装"
E[ 29] = "Please enter Bot Token if you need push the logs to Telegram. Leave blank to skip:"
C[ 29] = "如需要把日志推送到 Telegram 机器人,请输入 Bot Token,不需要直接回车:"
E[ 30] = "Enter USERID:"
C[ 30] = "输入 USERID:"
E[ 31] = "Enter custom name:"
C[ 31] = "自定义名称:"
E[ 32] = "The account type is Teams and does not support changing IP\n 1. Change to free (default)\n 2. Change to plus\n 3. Quit"
C[ 32] = "账户类型为 Teams,不支持更换 IP\n 1. 更换为 free (默认)\n 2. 更换为 plus\n 3. 退出"
E[ 33] = "Input errors up to 5 times.The script is aborted."
C[ 33] = "输入错误达5次,脚本退出"
E[ 34] = "License should be 26 characters, please re-enter WARP+ License. Otherwise press Enter to continue. \(\${i} times remaining\): "
C[ 34] = "License 应为26位字符,请重新输入 WARP+ License \(剩余\${i}次\): "
E[ 35] = "Please customize the WARP+ device name (Default is [warp-go] if left blank):"
C[ 35] = "请自定义 WARP+ 设备名 (如果不输入,默认为 [warp-go]):"
E[ 36] = ""
C[ 36] = ""
E[ 37] = ""
C[ 37] = ""
E[ 38] = ""
C[ 38] = ""
E[ 39] = ""
C[ 39] = ""
E[ 40] = "Mode 1: Check it every 5 minutes"
C[ 40] = "模式1: 定时5分钟检查一次,遇到不解锁时更换 WARP IP,直至刷成功"
E[ 41] = "Mode 2: Create a screen named [u] and run"
C[ 41] = "模式2: 创建一个名为 [u] 的 Screen 在后台刷"
E[ 42] = "Mode 3: Create a jobs with nohup to run in the background"
C[ 42] = "模式3: 用 nohup 创建一个 jobs 在后台刷"
E[ 43] = "Media unlock daemon installed successfully. A systemd service has been created, check [systemctl status warp_unlock] and close [systemctl disable --now warp_unlock]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log"
C[ 43] = "媒体解锁守护进程已安装成功,已创建一个 systemd 服务,查看 [systemctl status warp_unlock],关闭 [systemctl disable --now warp_unlock],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log"
E[ 44] = "Media unlock daemon installed successfully. pm2 daemon is running, check pm2 [list] and close [pm2 delete warp_unlock; pm2 unstartup systemd;]. The VPS restart will still take effect. The running log of the scheduled task will be saved in /root/result.log"
C[ 44] = "媒体解锁守护进程已安装成功,pm2 守护进程正在工作中,查看 [pm2 list],关闭 [pm2 delete warp_unlock; pm2 unstartup systemd; ],VPS 重启仍生效。进入任务运行日志将保存在 /root/result.log"
E[ 45] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy"
C[ 45] = "请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理"
E[ 46] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv6 Interface"
C[ 46] = "请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv6 网络接口"
E[ 47] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv6 Interface\n"
C[ 47] = "请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv6 网络接口"
E[ 48] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv4 Interface"
C[ 48] = "请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv4 网络接口"
E[ 49] = "Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv4 Interface"
C[ 49] = "请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv4 网络接口\n"
E[ 50] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv4 Interface"
C[ 50] = "请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv4 网络接口"
E[ 51] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP IPv4 Interface\n 3. WARP IPv6 Interface"
C[ 51] = "请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP IPv4 网络接口\n 3. WARP IPv6 网络接口"
E[ 52] = "Please choose to brush WARP IP:\n 1. WARP Socks5 Proxy\n 2. WARP IPv4 Interface\n 3. WARP IPv6 Interface"
C[ 52] = "请选择刷 WARP IP 方式:\n 1. WARP Socks5 代理\n 2. WARP IPv4 网络接口\n 3. WARP IPv6 网络接口"
E[ 53] = "Please choose to brush WARP IP:\n 1. WireProxy\n 2. WARP Socks5 Proxy\n 3. WARP IPv4 Interface\n 4. WARP IPv6 Interface"
C[ 53] = "请选择刷 WARP IP 方式:\n 1. WireProxy\n 2. WARP Socks5 代理\n 3. WARP IPv4 网络接口\n 4. WARP IPv6 网络接口"
E[ 54] = "No option. The script is aborted. Feedback: [https://github.com/fscarmen/warp_unlock/issues]"
C[ 54] = "没有该选项,脚本退出,问题反馈:[https://github.com/fscarmen/warp_unlock/issues]"
# 自定义字体彩色,read 函数,友道翻译函数,安装依赖函数
red( ) { echo -e " \033[31m\033[01m $1 \033[0m " ; }
green( ) { echo -e " \033[32m\033[01m $1 \033[0m " ; }
yellow( ) { echo -e " \033[33m\033[01m $1 \033[0m " ; }
reading( ) { read -rp " $( green " $1 " ) " " $2 " ; }
translate( ) { [ [ -n " $1 " ] ] && curl -ksm8 " http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i= ${ 1 //[[ : space : ]]/ } " | cut -d \" -f18 2>/dev/null; }
check_dependencies( ) { for c in $@ ; do
type -p $c >/dev/null 2>& 1 || ( yellow " $( eval echo " ${ T [ ${ L } 7 ] } " ) " && ${ PACKAGE_INSTALL [b] } " $c " ) || ( yellow " $( eval echo " ${ T [ ${ L } 8 ] } " ) " && ${ PACKAGE_UPDATE [b] } && ${ PACKAGE_INSTALL [b] } " $c " )
! type -p $c >/dev/null 2>& 1 && yellow " $( eval echo " ${ T [ ${ L } 9 ] } " ) " && exit 1; done ; }
red( ) { echo -e " \033[31m\033[01m $* \033[0m " ; }
error( ) { echo -e " \033[31m\033[01m $* \033[0m " && exit 1; }
info( ) { echo -e " \033[32m\033[01m $* \033[0m " ; }
hint( ) { echo -e " \033[33m\033[01m $* \033[0m " ; }
reading( ) { read -rp " $( info " $1 " ) " " $2 " ; }
text( ) { eval echo " \${ ${ L } [ $* ]} " ; }
text_eval( ) { eval echo "\$(eval echo " \$ { ${ L } [ $* ] } ")" ; }
translate( ) { [ -n " $1 " ] && curl -ksm8 " http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i= $1 " | cut -d \" -f18 2>/dev/null; }
check_dependencies( ) {
for c in $* ; do
type -p $c >/dev/null 2>& 1 || ( hint " $( text_eval 7) " && ${ PACKAGE_INSTALL [b] } $c 2>/dev/null) || ( hint " $( text_eval 8) " && ${ PACKAGE_UPDATE [b] } && ${ PACKAGE_INSTALL [b] } $c 2>/dev/null)
! type -p $c >/dev/null 2>& 1 && error " $( text_eval 9) " && exit 1
done
}
# 脚本当天及累计运行次数统计
statistics_of_run-times( ) {
COUNT = $( curl -ksm1 "https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffscarmen%2Fwarp_unlock%2Fmain%2Funlock.sh&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false" 2>& 1) &&
TODAY = $( expr " $COUNT " : '.*\s\([0-9]\{1,\}\)\s/.*' ) && TOTAL = $( expr " $COUNT " : '.*/\s\([0-9]\{1,\}\)\s.*' )
statistics_of_run-times( ) {
COUNT = $( curl -ksm1 "https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffscarmen%2Fwarp_unlock%2Fmain%2Funlock.sh&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false" 2>& 1) &&
TODAY = $( expr " $COUNT " : '.*\s\([0-9]\{1,\}\)\s/.*' ) && TOTAL = $( expr " $COUNT " : '.*/\s\([0-9]\{1,\}\)\s.*' )
}
# 选择语言,先判断 /etc/wireguard/language 里的语言选择,没有的话再让用户选择,默认英语
select_laguage( ) {
[ [ -z " $L " ] ] && case $( cat /etc/wireguard/language 2>& 1) in
E ) L = E; ; C ) L = C; ;
* ) L = E && yellow " ${ T [ ${ L } 0 ] } " && reading " ${ T [ ${ L } 3 ] } " LANGUAGE
[ [ $LANGUAGE = 2 ] ] && L = C; ;
esac
# 选择语言,先判断 warp 脚本里的语言选择,没有的话再让用户选择,默认英语
select_laguage( ) {
if [ [ -z " $L " ] ] ; then
if [ -e /opt/warp-go/language ] ; then
L = $( cat /opt/warp-go/language 2>& 1)
elif [ -e /etc/wireguard/language ] ; then
L = $( cat /etc/wireguard/language 2>& 1)
else
case $( cat /etc/wireguard/language 2>& 1) in
E ) L = E; ;
C ) L = C; ;
* ) L = E && hint " \n $( text 0) \n " && reading " $( text 3) " LANGUAGE
[ [ $LANGUAGE = 2 ] ] && L = C; ;
esac
fi
fi
}
check_system_info( ) {
# 多方式判断操作系统,试到有值为止。只支持 Debian 10/11、Ubuntu 18.04/20.04 或 CentOS 7/8 ,如非上述操作系统,退出脚本
CMD = ( " $( grep -i pretty_name /etc/os-release 2>/dev/null | cut -d \" -f2) "
" $( hostnamectl 2>/dev/null | grep -i system | cut -d : -f2) "
" $( lsb_release -sd 2>/dev/null) "
" $( grep -i description /etc/lsb-release 2>/dev/null | cut -d \" -f2) "
" $( grep . /etc/redhat-release 2>/dev/null) "
" $( grep . /etc/issue 2>/dev/null | cut -d \\ -f1 | sed '/^[ ]*$/d' ) "
)
for a in " ${ CMD [@] } " ; do
SYS = " $a " && [ [ -n $SYS ] ] && break
done
REGEX = ( "debian" "ubuntu" "centos|red hat|kernel|oracle linux|amazon linux|alma|rocky" )
RELEASE = ( "Debian" "Ubuntu" "CentOS" )
PACKAGE_UPDATE = ( "apt -y update" "apt -y update" "yum -y update" )
PACKAGE_INSTALL = ( "apt -y install" "apt -y install" "yum -y install" )
for ( ( b = 0; b<${# REGEX [@] } ; b++) ) ; do
[ [ $( echo " $SYS " | tr '[:upper:]' '[:lower:]' ) = ~ ${ REGEX [b] } ] ] && SYSTEM = " ${ RELEASE [b] } " && break
done
[ [ -z $SYSTEM ] ] && red " ${ T [ ${ L } 5 ] } " && exit 1
check_system_info( ) {
# 多方式判断操作系统,试到有值为止。只支持 Debian 10/11、Ubuntu 18.04/20.04 或 CentOS 7/8 ,如非上述操作系统,退出脚本
CMD = ( " $( grep -i pretty_name /etc/os-release 2>/dev/null | cut -d \" -f2) "
" $( hostnamectl 2>/dev/null | grep -i system | cut -d : -f2) "
" $( lsb_release -sd 2>/dev/null) "
" $( grep -i description /etc/lsb-release 2>/dev/null | cut -d \" -f2) "
" $( grep . /etc/redhat-release 2>/dev/null) "
" $( grep . /etc/issue 2>/dev/null | cut -d \\ -f1 | sed '/^[ ]*$/d' ) "
)
for a in " ${ CMD [@] } " ; do
SYS = " $a " && [ [ -n $SYS ] ] && break
done
REGEX = ( "debian" "ubuntu" "centos|red hat|kernel|oracle linux|amazon linux|alma|rocky" )
RELEASE = ( "Debian" "Ubuntu" "CentOS" )
PACKAGE_UPDATE = ( "apt -y update" "apt -y update" "yum -y update" )
PACKAGE_INSTALL = ( "apt -y install" "apt -y install" "yum -y install" )
for ( ( b = 0; b<${# REGEX [@] } ; b++) ) ; do
[ [ $( echo " $SYS " | tr '[:upper:]' '[:lower:]' ) = ~ ${ REGEX [b] } ] ] && SYSTEM = " ${ RELEASE [b] } " && break
done
[ [ -z $SYSTEM ] ] && error " $( text 5) "
}
# 检查是否有安装任一版本的 python 依赖,如全部没有,则安装 python3
check_python( ) {
PY = ( "python" "python2" )
for g in " ${ PY [@] } " ; do type -p $g >/dev/null 2>& 1 && PYTHON = $g && break; done
[ -z " $PYTHON " ] && PYTHON = python3 && check_dependencies $PYTHON
check_python( ) {
PY = ( "python" "python2" )
for g in " ${ PY [@] } " ; do type -p $g >/dev/null 2>& 1 && PYTHON = $g && break; done
[ -z " $PYTHON " ] && PYTHON = python3 && check_dependencies $PYTHON
}
# 检查解锁是否已运行,如果是则判断模式,以前给更换模式赋值
check_unlock_running( ) {
[ -e /etc/wireguard /warp_unlock.sh ] &&
UNLOCK_MODE_NOW = $( grep -s "MODE=" /etc/wireguard /warp_unlock.sh | cut -d \" -f2) &&
EXPECT = $( grep -s "EXPECT=" /etc/wireguard /warp_unlock.sh | cut -d \" -f2) &&
TOKEN = $( grep -s "TOKEN=" /etc/wireguard /warp_unlock.sh | cut -d \" -f2) &&
USERID = $( grep -s "USERID=" /etc/wireguard /warp_unlock.sh | cut -d \" -f2) &&
CUSTOM = $( grep -s "CUSTOM=" /etc/wireguard /warp_unlock.sh | cut -d \" -f2) &&
NIC = $( grep -s "NIC=" /etc/wireguard /warp_unlock.sh | cut -d \" -f2) &&
RESTART = $( grep -s "RESTART=" /etc/wireguard /warp_unlock.sh | cut -d \" -f2) &&
PYTHON = $( grep -s "PYTHON=" /etc/wireguard /warp_unlock.sh | cut -d \" -f2)
check_unlock_running( ) {
[ -e /usr/bin /warp_unlock.sh ] &&
UNLOCK_MODE_NOW = $( grep -s "MODE=" /usr/bin /warp_unlock.sh | cut -d \" -f2) &&
EXPECT = $( grep -s "EXPECT=" /usr/bin /warp_unlock.sh | cut -d \" -f2) &&
TOKEN = $( grep -s "TOKEN=" /usr/bin /warp_unlock.sh | cut -d \" -f2) &&
USERID = $( grep -s "USERID=" /usr/bin /warp_unlock.sh | cut -d \" -f2) &&
CUSTOM = $( grep -s "CUSTOM=" /usr/bin /warp_unlock.sh | cut -d \" -f2) &&
NIC = $( grep -s "NIC=" /usr/bin /warp_unlock.sh | cut -d \" -f2) &&
RESTART = $( grep -s "RESTART=" /usr/bin /warp_unlock.sh | cut -d \" -f2) &&
PYTHON = $( grep -s "PYTHON=" /usr/bin /warp_unlock.sh | cut -d \" -f2)
}
# 判断是否已经安装 WARP 网络接口或者 Socks5 代理,如已经安装组件尝试启动。再分情况作相应处理
check_warp( ) {
if [ [ -z " ${ STATUS [@] } " ] ] ; then
if type -p wg-quick >/dev/null 2>& 1; then
[ [ -z $( wg 2>/dev/null) ] ] && wg-quick up wgcf >/dev/null 2>& 1
TRACE4 = $( curl -ks4m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g" )
TRACE6 = $( curl -ks6m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g" )
[ [ $TRACE4 = ~ on| plus ] ] && STATUS[ 0] = 1 || STATUS[ 0] = 0
[ [ $TRACE6 = ~ on| plus ] ] && STATUS[ 1] = 1 || STATUS[ 1] = 0
else STATUS = ( 0 0)
fi
# 在已安装 Client 的前提下,区分模式 Mode
if type -p warp-cli >/dev/null 2>& 1; then
! systemctl is-active warp-svc >/dev/null 2>& 1 && systemctl start warp-svc && sleep 5
if [ [ $( warp-cli --accept-tos settings) = ~ WarpProxy ] ] ; then
[ [ $( ss -nltp) = ~ 'warp-svc' ] ] && CLIENT_PORT = $( ss -nltp | grep warp-svc | grep -oP '127.0*\S+' | cut -d: -f2) && STATUS[ 2] = 1 || STATUS[ 2] = 0
else
[ [ $( ip a) = ~ 'CloudflareWARP' ] ] && STATUS[ 2] = 1 || STATUS[ 2] = 0
fi
else STATUS[ 2] = 0
fi
type -p wireproxy >/dev/null 2>& 1 && [ [ ! $( ss -nltp) = ~ 'wireproxy' ] ] && systemctl restart wireproxy
[ [ $( ss -nltp) = ~ 'wireproxy' ] ] && WIREPROXY_PORT = $( ss -nltp | grep wireproxy | grep -oP '127.0*\S+' | cut -d: -f2) && STATUS[ 3] = 1 || STATUS[ 3] = 0
fi
fscarmen( ) { wget -N https://raw.githubusercontent.com/fscarmen/warp/main/menu.sh && bash menu.sh; exit; }
kkkyg( ) { wget -N https://cdn.jsdelivr.net/gh/kkkyg/CFwarp/CFwarp.sh && bash CFwarp.sh; exit; }
p3terx( ) { bash <( curl -fsSL git.io/warp.sh) menu; exit; }
misaka( ) { wget -N https://raw.githubusercontents.com/Misaka-blog/Misaka-WARP-Script/master/misakawarp.sh && bash misakawarp.sh; exit; }
CASE_IPV4( ) { NIC = '-ks4m8' ; RESTART = "wgcf_restart" ; }
CASE_IPV6( ) { NIC = '-ks6m8' ; RESTART = "wgcf_restart" ; }
CASE_CLIENT( ) { NIC = '-ks4m8 --interface CloudflareWARP' && RESTART = "client_restart" && [ [ $( warp-cli --accept-tos settings) = ~ WarpProxy ] ] && NIC = " -sx socks5h://localhost: $CLIENT_PORT " ; }
CASE_WIREPROXY( ) { NIC = " -sx socks5h://localhost: $WIREPROXY_PORT " ; RESTART = "wireproxy_restart" ; }
INSTALL_CHECK = ( "0 0 0 0" "1 1 1 1" "0 1 1 1" "1 0 1 1" "1 1 0 1" "1 1 1 0" "0 0 1 1" "0 1 0 1" "0 1 1 0" "1 0 0 1" "1 0 1 0" "1 1 0 0" "0 0 0 1" "0 0 1 0" "0 1 0 0" "1 0 0 0" )
SHOW = ( " ${ T [ ${ L } 4 ] } " " ${ T [ ${ L } 53 ] } " " ${ T [ ${ L } 47 ] } " " ${ T [ ${ L } 50 ] } " " ${ T [ ${ L } 51 ] } " " ${ T [ ${ L } 52 ] } " " ${ T [ ${ L } 45 ] } " " ${ T [ ${ L } 46 ] } " " ${ T [ ${ L } 6 ] } " " ${ T [ ${ L } 48 ] } " " ${ T [ ${ L } 49 ] } " " ${ T [ ${ L } 23 ] } " )
NUM = ( "0|1|2|3|4" "1|2|3|4" "1|2|3" "1|2|3" "1|2|3" "1|2|3" "1|2" "1|2" "1|2" "1|2" "1|2" "1|2" )
DO1 = ( "fscarmen" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_IPV4" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_IPV6" "CASE_IPV4" )
DO2 = ( "kkkyg" "CASE_CLIENT" "CASE_CLIENT" "CASE_CLIENT" "CASE_IPV4" "CASE_IPV4" "CASE_CLIENT" "CASE_IPV6" "CASE_IPV6" "CASE_IPV4" "CASE_IPV4" "CASE_IPV6" )
DO3 = ( "p3terx" "CASE_IPV4" "CASE_IPV6" "CASE_IPV4" "CASE_IPV6" "CASE_IPV6" )
DO4 = ( "misaka" "CASE_IPV6" )
DO0 = ( "exit" )
for ( ( f = 0; f<${# INSTALL_CHECK [@] } ; f++) ) ; do
[ [ ${ STATUS [@] } = " ${ INSTALL_CHECK [f] } " ] ] && break
done
check_warp( ) {
if [ [ -z " ${ STATUS [@] } " ] ] ; then
if [ [ $( ip a) = ~ ": WARP:" | ": wgcf:" ] ] ; then
WARP = "--interface wgcf"
if [ [ $( ip a) = ~ ": WARP:" ] ] ; then
WARP = "--interface WARP"
# 检测账户类型为 Team 的不能更换
if grep -qE 'Type[ ]+=[ ]+team' /opt/warp-go/warp.conf; then
hint " \n $( text 32) \n " && reading " $( text 3) " CHANGE_ACCOUNT
case " $CHANGE_ACCOUNT " in
2 ) [ [ -z $LICENSE ] ] && reading " $( text 42) " LICENSE
local i = 5
until [ [ $LICENSE = ~ ^[ A-Z0-9a-z] { 8} -[ A-Z0-9a-z] { 8} -[ A-Z0-9a-z] { 8} $ ] ] ; do
( ( i-- ) ) || true
[ [ $i = 0 ] ] && error " $( text 33) " && exit 1 || reading " $( text 34) " LICENSE
done
[ [ -n $LICENSE && -z $NAME ] ] && reading " $( text 35) " NAME
[ [ -n $NAME ] ] && NAME = " ${ NAME //[[ : space : ]]/_ } " || NAME = ${ NAME :- 'warp-go' }
echo " $LICENSE " > /opt/warp-go/License
echo " $NAME " > /opt/warp-go/Device_Name; ;
3 ) exit 0; ;
esac
fi
fi
TRACE4 = $( curl -ks4m8 $WARP https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g" )
TRACE6 = $( curl -ks6m8 $WARP https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g" )
[ [ $TRACE4 = ~ on| plus ] ] && STATUS[ 0] = 1 || STATUS[ 0] = 0
[ [ $TRACE6 = ~ on| plus ] ] && STATUS[ 1] = 1 || STATUS[ 1] = 0
else
STATUS = ( 0 0)
fi
# 在已安装 Client 的前提下,区分模式 Mode
if type -p warp-cli >/dev/null 2>& 1; then
! systemctl is-active warp-svc >/dev/null 2>& 1 && systemctl start warp-svc && sleep 5
if [ [ $( warp-cli --accept-tos settings) = ~ WarpProxy ] ] ; then
[ [ $( ss -nltp) = ~ 'warp-svc' ] ] && CLIENT_PORT = $( ss -nltp | grep warp-svc | grep -oP '127.0*\S+' | cut -d: -f2) && STATUS[ 2] = 1 || STATUS[ 2] = 0
else
[ [ $( ip a) = ~ 'CloudflareWARP' ] ] && STATUS[ 2] = 1 || STATUS[ 2] = 0
fi
else STATUS[ 2] = 0
fi
type -p wireproxy >/dev/null 2>& 1 && [ [ ! $( ss -nltp) = ~ 'wireproxy' ] ] && systemctl restart wireproxy
[ [ $( ss -nltp) = ~ 'wireproxy' ] ] && WIREPROXY_PORT = $( ss -nltp | grep wireproxy | grep -oP '127.0*\S+' | cut -d: -f2) && STATUS[ 3] = 1 || STATUS[ 3] = 0
fi
wgcf_warp( ) { wget -N --no-check-certificate https://raw.githubusercontent.com/fscarmen/warp/main/menu.sh && bash menu.sh; exit; }
warp-go( ) { wget -N --no-check-certificate https://raw.githubusercontent.com/fscarmen/warp/main/warp-go.sh && bash warp-go.sh; exit; }
p3terx( ) { bash <( curl -fsSL git.io/warp.sh) menu; exit; }
misaka( ) { wget -N --no-check-certificate https://raw.githubusercontents.com/Misaka-blog/Misaka-WARP-Script/master/misakawarp.sh && bash misakawarp.sh; exit; }
CASE_IPV4( ) { NIC = " -ks4m8 $WARP " ; RESTART = "warp_restart" ; }
CASE_IPV6( ) { NIC = " -ks6m8 $WARP " ; RESTART = "warp_restart" ; }
CASE_CLIENT( ) { NIC = '-ks4m8 --interface CloudflareWARP' && RESTART = "client_restart" && [ [ $( warp-cli --accept-tos settings) = ~ WarpProxy ] ] && NIC = " -sx socks5h://localhost: $CLIENT_PORT " ; }
CASE_WIREPROXY( ) { NIC = " -sx socks5h://localhost: $WIREPROXY_PORT " ; RESTART = "wireproxy_restart" ; }
INSTALL_CHECK = ( "0 0 0 0" "1 1 1 1" "0 1 1 1" "1 0 1 1" "1 1 0 1" "1 1 1 0" "0 0 1 1" "0 1 0 1" "0 1 1 0" "1 0 0 1" "1 0 1 0" "1 1 0 0" "0 0 0 1" "0 0 1 0" "0 1 0 0" "1 0 0 0" )
SHOW = ( " \n $( text 4) \n " " \n $( text 53) \n " " \n $( text 47) \n " " \n $( text 50) \n " " \n $( text 51) \n " " \n $( text 52) \n " " \n $( text 45) \n " " \n $( text 46) \n " " \n $( text 6) \n " " \n $( text 48) \n " " \n $( text 49) \n " " \n $( text 23) \n " )
NUM = ( "0|1|2|3|4" "1|2|3|4" "1|2|3" "1|2|3" "1|2|3" "1|2|3" "1|2" "1|2" "1|2" "1|2" "1|2" "1|2" )
DO1 = ( "wgcf_warp" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_WIREPROXY" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_IPV4" "CASE_WIREPROXY" "CASE_CLIENT" "CASE_IPV6" "CASE_IPV4" )
DO2 = ( "warp-go" "CASE_CLIENT" "CASE_CLIENT" "CASE_CLIENT" "CASE_IPV4" "CASE_IPV4" "CASE_CLIENT" "CASE_IPV6" "CASE_IPV6" "CASE_IPV4" "CASE_IPV4" "CASE_IPV6" )
DO3 = ( "p3terx" "CASE_IPV4" "CASE_IPV6" "CASE_IPV4" "CASE_IPV6" "CASE_IPV6" )
DO4 = ( "misaka" "CASE_IPV6" )
DO0 = ( "exit" )
for ( ( f = 0; f<${# INSTALL_CHECK [@] } ; f++) ) ; do
[ [ ${ STATUS [@] } = " ${ INSTALL_CHECK [f] } " ] ] && break
done
# 默认只安装一种 WARP 形式时,不用选择。如两种或以上则让用户选择哪个方式的解锁
CHOOSE2 = 1
if echo " $f " | grep -qvwE "12|13|14|15" ; then
yellow " ${ SHOW [f] } " && reading " ${ T [ ${ L } 3 ] } " CHOOSE2
echo " $CHOOSE2 " | grep -qvwE " ${ NUM [f] } " && red " ${ T [ ${ L } 54 ] } " && exit 1
fi
$( eval echo \$ { DO$CHOOSE2 [ f] } )
# 默认只安装一种 WARP 形式时,不用选择。如两种或以上则让用户选择哪个方式的解锁
CHOOSE2 = 1
if echo " $f " | grep -qvwE "12|13|14|15" ; then
hint " ${ SHOW [f] } " && reading " $( text 3) " CHOOSE2
echo " $CHOOSE2 " | grep -qvwE " ${ NUM [f] } " && error " $( text 54) "
fi
$( eval echo \$ { DO$CHOOSE2 [ f] } )
}
# 期望解锁流媒体, 变量 SUPPORT_NUM 限制选项枚举的次数,不填默认全选, 解锁状态保存在 /etc/wireguard/status.log
input_streammedia_unlock( ) {
if [ [ -z " ${ STREAM_UNLOCK [@] } " ] ] ; then
yellow " ${ T [ ${ L } 15 ] } " && reading " ${ T [ ${ L } 3 ] } " CHOOSE4
for ( ( d = 0; d<" $SUPPORT_NUM " ; d++) ) ; do
( [ [ -z " $CHOOSE4 " ] ] || echo " $CHOOSE4 " | grep -q " $(( d+1)) " ) && STREAM_UNLOCK[ d] = '1' || STREAM_UNLOCK[ d] = '0'
[ [ $d = 0 ] ] && echo 'null' > /etc/wireguard/status.log || echo 'null' >> /etc/wireguard/status.log
done
fi
UNLOCK_SELECT = $( for ( ( e = 0; e<" $SUPPORT_NUM " ; e++) ) ; do
# 期望解锁流媒体, 变量 SUPPORT_NUM 限制选项枚举的次数,不填默认全选, 解锁状态保存在 /usr/bin /status.log
input_streammedia_unlock( ) {
if [ [ -z " ${ STREAM_UNLOCK [@] } " ] ] ; then
hint " \n $( text 15) \n " && reading " $( text 3) " CHOOSE4
for ( ( d = 0; d<" $SUPPORT_NUM " ; d++) ) ; do
( [ [ -z " $CHOOSE4 " ] ] || echo " $CHOOSE4 " | grep -q " $(( d+1)) " ) && STREAM_UNLOCK[ d] = '1' || STREAM_UNLOCK[ d] = '0'
[ [ $d = 0 ] ] && echo 'null' > /usr/bin /status.log || echo 'null' >> /usr/bin /status.log
done
fi
UNLOCK_SELECT = $( for ( ( e = 0; e<" $SUPPORT_NUM " ; e++) ) ; do
[ [ " ${ STREAM_UNLOCK [e] } " = 1 ] ] && echo -e " [[ ! \${R[*]} =~ 'No' ]] && check $e ; " || echo -e " #[[ ! \${R[*]} =~ 'No' ]] && check $e ; "
done )
done )
}
# 期望解锁地区
input_region( ) {
if [ [ -z " $EXPECT " ] ] ; then
REGION = $( curl -ksm8 https://ip.gs/country-iso 2>/dev/null)
reading " $( eval echo " ${ T [ ${ L } 13 ] } " ) " EXPECT
until [ [ -z $EXPECT || $EXPECT = [ Yy] || $EXPECT = ~ ^[ A-Za-z] { 2} $ ] ] ; do
reading " $( eval echo " ${ T [ ${ L } 13 ] } " ) " EXPECT
done
[ [ -z $EXPECT || $EXPECT = [ Yy] ] ] && EXPECT = " $REGION "
fi
}
input_region( ) {
if [ [ -z " $EXPECT " ] ] ; then
REGION = $( curl -ksm8 https://ip.gs/country-iso 2>/dev/null)
reading " \n $( text_eval 13 ) " EXPECT
until [ [ -z $EXPECT || $EXPECT = [ Yy] || $EXPECT = ~ ^[ A-Za-z] { 2} $ ] ] ; do
reading " \n $( text_eval 13 ) " EXPECT
done
[ [ -z $EXPECT || $EXPECT = [ Yy] ] ] && EXPECT = " $REGION "
fi
}
# Telegram Bot 日志推送
input_tg( ) {
[ [ -z $CUSTOM ] ] && reading " $( eval echo " ${ T [ ${ L } 29 ] } " ) " TOKEN
[ [ -n $TOKEN && -z $USERID ] ] && reading " $( eval echo " ${ T [ ${ L } 30 ] } " ) " USERID
[ [ -n $USERID && -z $CUSTOM ] ] && reading " $( eval echo " ${ T [ ${ L } 31 ] } " ) " CUSTOM
}
input_tg( ) {
[ [ -z $CUSTOM ] ] && reading " \n $( text_eval 29) " TOKEN
[ [ -n $TOKEN && -z $USERID ] ] && reading " \n $( text_eval 30) " USERID
[ [ -n $USERID && -z $CUSTOM ] ] && reading " \n $( text_eval 31) " CUSTOM
}
# 根据用户选择在线生成解锁程序,放在 /etc/wireguard/unlock.sh
export_unlock_file( ) {
export_unlock_file( ) {
input_streammedia_unlock
input_region
@ -285,7 +334,7 @@ sh -c "$TASK"
# 生成 warp_unlock.sh 文件,判断当前流媒体解锁状态,遇到不解锁时更换 WARP IP,直至刷成功。5分钟后还没有刷成功,将不会重复该进程而浪费系统资源
# 感谢以下两位作者: lmc999 [https://github.com/lmc999/RegionRestrictionCheck] 和 luoxue-bot [https://github.com/luoxue-bot/warp_auto_change_ip]
# 根据 lmc999 脚本检测 Netflix Title,如获取不到,使用兜底默认值
cat <<EOF >/etc/wireguard /warp_unlock.sh
cat <<EOF >/usr/bin /warp_unlock.sh
#!/usr/bin/env bash
MODE = " $CHOOSE1 "
EXPECT = " $EXPECT "
@ -305,81 +354,104 @@ RESULT_TITLE=\${RESULT_TITLE:-'81215567'}; REGION_TITLE=\${REGION_TITLE:-'800184
timedatectl set-timezone Asia/Shanghai
if [ [ \$ ( pgrep -laf ^[ /d] *bash.*warp_unlock | awk -F, '{a[\$2]++}END{for (i in a) print i" "a[i]}' ) -le 2 ] ] ; then
log_output = "\\\$(date +'%F %T'). \\\\\tIP: \\\$WAN \\\\\tCountry: \\\$COUNTRY \\\\\t\\\$CONTENT"
tg_output = "💻 \\\$CUSTOM. ⏰ \\\$(date +'%F %T'). 🛰 \\\$WAN 🌏 \\\$COUNTRY. \\\$CONTENT"
log_message( ) { echo -e "\$(eval echo " \$ log_output")" | tee -a /root/result.log; [ [ \$ ( cat /root/result.log | wc -l) -gt \$ LOG_LIMIT ] ] && sed -i "1,10d" /root/result.log; }
tg_message( ) { curl -s -X POST "https://api.telegram.org/bot\$TOKEN/sendMessage" -d chat_id = \$ USERID -d text = "\$(eval echo " \$ tg_output")" -d parse_mode = "HTML" >/dev/null 2>& 1; }
check_ip( ) {
unset IP_INFO WAN COUNTRY ASNORG
IP_INFO = "\$(curl \$NIC https://ip.gs/json 2>/dev/null)"
WAN = \$ ( expr "\$IP_INFO" : '.*ip\":\"\([^"]*\).*' )
COUNTRY = \$ ( expr "\$IP_INFO" : '.*country\":\"\([^"]*\).*' )
ASNORG = \$ ( expr "\$IP_INFO" : '.*asn_org\":\"\([^"]*\).*' )
}
wgcf_restart( ) { systemctl restart wg-quick@wgcf; sleep 2; ss -nltp | grep 'dnsmasq' >/dev/null 2>& 1 && systemctl restart dnsmasq >/dev/null 2>& 1; sleep 2; check_ip; }
client_restart( ) {
[ [ \$ ( warp-cli --accept-tos settings) = ~ WarpProxy ] ] && CLIENT_PROXY = 1
warp-cli --accept-tos delete >/dev/null 2>& 1
[ [ \$ CLIENT_PROXY != 1 ] ] && ( ip -4 rule delete from 172.16.0.2/32 lookup 51820; ip -4 rule delete table main suppress_prefixlength 0 )
warp-cli --accept-tos register >/dev/null 2>& 1 &&
[ [ -e /etc/wireguard/license ] ] && warp-cli --accept-tos set-license \$ ( cat /etc/wireguard/license) >/dev/null 2>& 1
sleep 10
[ [ \$ CLIENT_PROXY != 1 ] ] && ( ip -4 rule add from 172.16.0.2 lookup 51820; ip -4 route add default dev CloudflareWARP table 51820; ip -4 rule add table main suppress_prefixlength 0 )
check_ip
}
wireproxy_restart( ) { systemctl restart wireproxy; sleep 5; check_ip; }
check0( ) {
RESULT[ 0] = "" ; REGION[ 0] = "" ; R[ 0] = "" ;
RESULT[ 0] = \$ ( curl --user-agent "\${UA_Browser}" \$ NIC -fsL --write-out %{ http_code} --output /dev/null --max-time 10 "https://www.netflix.com/title/\$RESULT_TITLE" 2>& 1)
if [ [ \$ { RESULT[ 0] } = 200 ] ] ; then
REGION[ 0] = \$ ( curl --user-agent "\${UA_Browser}" \$ NIC -fs --max-time 10 --write-out %{ redirect_url} --output /dev/null "https://www.netflix.com/title/\$REGION_TITLE" | sed 's/.*com\/\([^-/]\{1,\}\).*/\1/g' | tr '[:lower:]' '[:upper:]' )
REGION[ 0] = \$ { REGION[ 0] :-'US' }
fi
echo "\${REGION[0]}" | grep -qi "\$EXPECT" && R[ 0] = "\$UNLOCK_STATUS" || R[ 0] = "\$NOT_UNLOCK_STATUS"
CONTENT = "Netflix: \${R[0]}."
log_message
[ [ -n "\$CUSTOM" ] ] && [ [ \$ { R[ 0] } != \$ ( sed -n '1p' /etc/wireguard/status.log) ] ] && tg_message
sed -i "1s/.*/\${R[0]}/" /etc/wireguard/status.log
}
check1( ) {
unset PreAssertion assertion disneycookie TokenContent isBanned is403 fakecontent refreshToken disneycontent tmpresult previewcheck isUnabailable region inSupportedLocation
R[ 1] = ""
PreAssertion = \$ ( curl \$ NIC --user-agent "\${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/devices" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -H "content-type: application/json; charset=UTF-8" -d '{"deviceFamily":"browser","applicationRuntime":"chrome","deviceProfile":"windows","attributes":{}}' 2>& 1)
[ [ "\$PreAssertion" = = "curl" * ] ] && R[ 1] = "\$NOT_UNLOCK_STATUS"
if [ [ \$ { R[ 1] } != "\$NOT_UNLOCK_STATUS" ] ] ; then
assertion = \$ ( echo \$ PreAssertion | \$ PYTHON -m json.tool 2> /dev/null | grep assertion | cut -f4 -d'"' )
PreDisneyCookie = \$ ( curl \$ NIC --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '1p' )
disneycookie = \$ ( echo \$ PreDisneyCookie | sed "s/DISNEYASSERTION/\${assertion}/g" )
TokenContent = \$ ( curl \$ NIC --user-agent "\${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/token" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "\$disneycookie" )
isBanned = \$ ( echo \$ TokenContent | \$ PYTHON -m json.tool 2> /dev/null | grep 'forbidden-location' )
is403 = \$ ( echo \$ TokenContent | grep '403 ERROR' )
[ [ -n "\$isBanned\$is403" ] ] && R[ 1] = "\$NOT_UNLOCK_STATUS"
fi
if [ [ \$ { R[ 1] } != "\$NOT_UNLOCK_STATUS" ] ] ; then
fakecontent = \$ ( curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '8p' )
refreshToken = \$ ( echo \$ TokenContent | \$ PYTHON -m json.tool 2> /dev/null | grep 'refresh_token' | awk '{print \$2}' | cut -f2 -d'"' )
disneycontent = \$ ( echo \$ fakecontent | sed "s/ILOVEDISNEY/\${refreshToken}/g" )
tmpresult = \$ ( curl \$ NIC --user-agent "\${UA_Browser}" -X POST -sSL --max-time 10 "https://disney.api.edge.bamgrid.com/graph/v1/device/graphql" -H "authorization: ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "\$disneycontent" 2>& 1)
previewcheck = \$ ( curl \$ NIC -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://disneyplus.com" | grep preview)
isUnabailable = \$ ( echo \$ previewcheck | grep 'unavailable' )
region = \$ ( echo \$ tmpresult | \$ PYTHON -m json.tool 2> /dev/null | grep 'countryCode' | cut -f4 -d'"' )
inSupportedLocation = \$ ( echo \$ tmpresult | \$ PYTHON -m json.tool 2> /dev/null | grep 'inSupportedLocation' | awk '{print \$2}' | cut -f1 -d',' )
[ [ "\$region" = = "JP" || ( -n "\$region" && "\$inSupportedLocation" = = "true" ) ] ] && R[ 1] = "\$UNLOCK_STATUS" || R[ 1] = "\$NOT_UNLOCK_STATUS"
fi
CONTENT = "Disney+: \${R[1]}."
log_message
[ [ -n "\$CUSTOM" ] ] && [ [ \$ { R[ 1] } != \$ ( sed -n '2p' /etc/wireguard/status.log) ] ] && tg_message
sed -i "2s/.*/\${R[1]}/" /etc/wireguard/status.log
}
log_output = "\\\$(date +'%F %T'). \\\\\tIP: \\\$WAN \\\\\tCountry: \\\$COUNTRY \\\\\t\\\$CONTENT"
tg_output = "💻 \\\$CUSTOM. ⏰ \\\$(date +'%F %T'). 🛰 \\\$WAN 🌏 \\\$COUNTRY. \\\$CONTENT"
log_message( ) { echo -e "\$(eval echo " \$ log_output")" | tee -a /root/result.log; [ [ \$ ( cat /root/result.log | wc -l) -gt \$ LOG_LIMIT ] ] && sed -i "1,10d" /root/result.log; }
tg_message( ) { curl -s -X POST "https://api.telegram.org/bot\$TOKEN/sendMessage" -d chat_id = \$ USERID -d text = "\$(eval echo " \$ tg_output")" -d parse_mode = "HTML" >/dev/null 2>& 1; }
check_ip( ) {
unset IP_INFO WAN COUNTRY ASNORG
IP_INFO = "\$(curl \$NIC https://ip.gs/json 2>/dev/null)"
WAN = \$ ( expr "\$IP_INFO" : '.*ip\":\"\([^"]*\).*' )
COUNTRY = \$ ( expr "\$IP_INFO" : '.*country\":\"\([^"]*\).*' )
ASNORG = \$ ( expr "\$IP_INFO" : '.*asn_org\":\"\([^"]*\).*' )
}
warp_restart( ) {
if [ [ \$ ( ip a) = ~ ": WARP:" ] ] ; then
cp -f /opt/warp-go/warp.conf{ ,.tmp1}
k = 0
until [ [ -e /opt/warp-go/warp.conf.tmp2 ] ] ; do
( ( k++) ) || true
[ [ \$ k = 11 ] ] && rm -f /opt/warp-go/warp.conf.tmp* && echo -e " Failed to register warp account. Script aborted. " && exit 1
/opt/warp-go/warp-go --register --config= /opt/warp-go/warp.conf.tmp2 --license= \$ ( cat /opt/warp-go/License 2>/dev/null) --device-name= \$ ( cat /opt/warp-go/Device_Name 2>/dev/null) >/dev/null 2>& 1
[ [ \$ ? != 0 ] ] && sleep 10
done
sed -i '1,6!d' /opt/warp-go/warp.conf.tmp2
tail -n +7 /opt/warp-go/warp.conf.tmp1 >> /opt/warp-go/warp.conf.tmp2
mv /opt/warp-go/warp.conf.tmp2 /opt/warp-go/warp.conf
/opt/warp-go/warp-go --config= /opt/warp-go/warp.conf.tmp1 --remove >/dev/null 2>& 1
rm -f /opt/warp-go/warp.conf.tmp*
systemctl restart warp-go
sleep 10
else
systemctl restart wg-quick@wgcf
sleep 2
ss -nltp | grep 'dnsmasq' >/dev/null 2>& 1 && systemctl restart dnsmasq >/dev/null 2>& 1
sleep 2
fi
check_ip
}
client_restart( ) {
[ [ \$ ( warp-cli --accept-tos settings) = ~ WarpProxy ] ] && CLIENT_PROXY = 1
warp-cli --accept-tos delete >/dev/null 2>& 1
[ [ \$ CLIENT_PROXY != 1 ] ] && ( ip -4 rule delete from 172.16.0.2/32 lookup 51820; ip -4 rule delete table main suppress_prefixlength 0 )
warp-cli --accept-tos register >/dev/null 2>& 1 &&
[ [ -e /etc/wireguard/license ] ] && warp-cli --accept-tos set-license \$ ( cat /etc/wireguard/license) >/dev/null 2>& 1
sleep 10
[ [ \$ CLIENT_PROXY != 1 ] ] && ( ip -4 rule add from 172.16.0.2 lookup 51820; ip -4 route add default dev CloudflareWARP table 51820; ip -4 rule add table main suppress_prefixlength 0 )
check_ip
}
wireproxy_restart( ) { systemctl restart wireproxy; sleep 5; check_ip; }
check0( ) {
RESULT[ 0] = "" ; REGION[ 0] = "" ; R[ 0] = "" ;
RESULT[ 0] = \$ ( curl --user-agent "\${UA_Browser}" \$ NIC -fsL --write-out %{ http_code} --output /dev/null --max-time 10 "https://www.netflix.com/title/\$RESULT_TITLE" 2>& 1)
if [ [ \$ { RESULT[ 0] } = 200 ] ] ; then
REGION[ 0] = \$ ( curl --user-agent "\${UA_Browser}" \$ NIC -fs --max-time 10 --write-out %{ redirect_url} --output /dev/null "https://www.netflix.com/title/\$REGION_TITLE" | sed 's/.*com\/\([^-/]\{1,\}\).*/\1/g' | tr '[:lower:]' '[:upper:]' )
REGION[ 0] = \$ { REGION[ 0] :-'US' }
fi
echo "\${REGION[0]}" | grep -qi "\$EXPECT" && R[ 0] = "\$UNLOCK_STATUS" || R[ 0] = "\$NOT_UNLOCK_STATUS"
CONTENT = "Netflix: \${R[0]}."
log_message
[ [ -n "\$CUSTOM" ] ] && [ [ \$ { R[ 0] } != \$ ( sed -n '1p' /usr/bin/status.log) ] ] && tg_message
sed -i "1s/.*/\${R[0]}/" /usr/bin/status.log
}
check1( ) {
unset PreAssertion assertion disneycookie TokenContent isBanned is403 fakecontent refreshToken disneycontent tmpresult previewcheck isUnabailable region inSupportedLocation
R[ 1] = ""
PreAssertion = \$ ( curl \$ NIC --user-agent "\${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/devices" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -H "content-type: application/json; charset=UTF-8" -d '{"deviceFamily":"browser","applicationRuntime":"chrome","deviceProfile":"windows","attributes":{}}' 2>& 1)
[ [ "\$PreAssertion" = = "curl" * ] ] && R[ 1] = "\$NOT_UNLOCK_STATUS"
if [ [ \$ { R[ 1] } != "\$NOT_UNLOCK_STATUS" ] ] ; then
assertion = \$ ( echo \$ PreAssertion | \$ PYTHON -m json.tool 2> /dev/null | grep assertion | cut -f4 -d'"' )
PreDisneyCookie = \$ ( curl \$ NIC --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '1p' )
disneycookie = \$ ( echo \$ PreDisneyCookie | sed "s/DISNEYASSERTION/\${assertion}/g" )
TokenContent = \$ ( curl \$ NIC --user-agent "\${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/token" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "\$disneycookie" )
isBanned = \$ ( echo \$ TokenContent | \$ PYTHON -m json.tool 2> /dev/null | grep 'forbidden-location' )
is403 = \$ ( echo \$ TokenContent | grep '403 ERROR' )
[ [ -n "\$isBanned\$is403" ] ] && R[ 1] = "\$NOT_UNLOCK_STATUS"
fi
if [ [ \$ { R[ 1] } != "\$NOT_UNLOCK_STATUS" ] ] ; then
fakecontent = \$ ( curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '8p' )
refreshToken = \$ ( echo \$ TokenContent | \$ PYTHON -m json.tool 2> /dev/null | grep 'refresh_token' | awk '{print \$2}' | cut -f2 -d'"' )
disneycontent = \$ ( echo \$ fakecontent | sed "s/ILOVEDISNEY/\${refreshToken}/g" )
tmpresult = \$ ( curl \$ NIC --user-agent "\${UA_Browser}" -X POST -sSL --max-time 10 "https://disney.api.edge.bamgrid.com/graph/v1/device/graphql" -H "authorization: ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "\$disneycontent" 2>& 1)
previewcheck = \$ ( curl \$ NIC -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://disneyplus.com" | grep preview)
isUnabailable = \$ ( echo \$ previewcheck | grep 'unavailable' )
region = \$ ( echo \$ tmpresult | \$ PYTHON -m json.tool 2> /dev/null | grep 'countryCode' | cut -f4 -d'"' )
inSupportedLocation = \$ ( echo \$ tmpresult | \$ PYTHON -m json.tool 2> /dev/null | grep 'inSupportedLocation' | awk '{print \$2}' | cut -f1 -d',' )
[ [ "\$region" = = "JP" || ( -n "\$region" && "\$inSupportedLocation" = = "true" ) ] ] && R[ 1] = "\$UNLOCK_STATUS" || R[ 1] = "\$NOT_UNLOCK_STATUS"
fi
CONTENT = "Disney+: \${R[1]}."
log_message
[ [ -n "\$CUSTOM" ] ] && [ [ \$ { R[ 1] } != \$ ( sed -n '2p' /usr/bin/status.log) ] ] && tg_message
sed -i "2s/.*/\${R[1]}/" /usr/bin/status.log
}
${ MODE2 [0] }
check_ip
@ -396,29 +468,29 @@ ${MODE2[1]}
fi
EOF
chmod +x /etc/wireguard /warp_unlock.sh
chmod +x /usr/bin /warp_unlock.sh
}
# 输出执行结果
result_output( ) {
green " $RESULT_OUTPUT "
green " $( eval echo " ${ T [ ${ L } 22 ] } " ) "
result_output( ) {
info " $RESULT_OUTPUT "
info " $( text_eval 22) \n "
}
# 卸载
uninstall( ) {
screen -QX u quit >/dev/null 2>& 1 && screen -wipe >/dev/null 2>& 1
type -p wg-quick >/dev/null 2>& 1 && systemctl restart wgcf >/dev/null 2>& 1
type -p warp-cli >/dev/null 2>& 1 && ( warp-cli --accept-tos delete >/dev/null 2>& 1; sleep 1; warp-cli --accept-tos register >/dev/null 2>& 1 )
sed -i '/warp_unlock.sh/d' /etc/crontab
kill -9 $( pgrep -f warp_unlock.sh) >/dev/null 2>& 1
rm -f /etc/wireguard/warp_unlock.sh /root/result.log /etc/wireguard /status.log /etc/systemd/system/warp_unlock.service
systemctl disable --now warp_unlock >/dev/null 2>& 1
pm2 delete warp_unlock >/dev/null 2>& 1
pm2 unstartup systemd >/dev/null 2>& 1
# 输出执行结果,如是切换模式则不显示
[ " $UN " = 1 ] && green " ${ T [ ${ L } 11 ] } "
uninstall( ) {
screen -QX u quit >/dev/null 2>& 1 && screen -wipe >/dev/null 2>& 1
type -p wg-quick >/dev/null 2>& 1 && systemctl restart wgcf >/dev/null 2>& 1
type -p warp-cli >/dev/null 2>& 1 && ( warp-cli --accept-tos delete >/dev/null 2>& 1; sleep 1; warp-cli --accept-tos register >/dev/null 2>& 1 )
sed -i '/warp_unlock.sh/d' /etc/crontab
kill -9 $( pgrep -f warp_unlock.sh) >/dev/null 2>& 1
rm -f /usr/bin/warp_unlock.sh /root/result.log /usr/bin /status.log /etc/systemd/system/warp_unlock.service
systemctl disable --now warp_unlock >/dev/null 2>& 1
pm2 delete warp_unlock >/dev/null 2>& 1
pm2 unstartup systemd >/dev/null 2>& 1
# 输出执行结果,如是切换模式则不显示
[ " $UN " = 1 ] && info " \n $( text 11) \n "
}
# 传参 1/2
@ -431,32 +503,37 @@ select_laguage
# 传参 2/2
while getopts ":CcEeUu46SsPpM:m:A:a:N:n:T:t:" OPTNAME; do
case " $OPTNAME " in
'C' | 'c' ) L = 'C' ; ;
'E' | 'e' ) L = 'E' ; ;
'U' | 'u' ) if [ ! -e /etc/wireguard/warp_unlock.sh ] ; then red " ${ T [ ${ L } 27 ] } " && exit 1
else UN = 1; uninstall; exit 0; fi ; ;
'4' ) TRACE4 = $( curl -ks4m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g" )
[ [ ! $TRACE4 = ~ on| plus ] ] && red " ${ T [ ${ L } 24 ] } " && exit 1 || STATUS = ( 1 0 0 0) ; ;
'6' ) TRACE6 = $( curl -ks6m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g" )
[ [ ! $TRACE6 = ~ on| plus ] ] && red " ${ T [ ${ L } 24 ] } " && exit 1 || STATUS = ( 0 1 0 0) ; ;
'S' | 's' ) [ [ ! $( ss -nltp) = ~ 'warp-svc' ] ] && red " ${ T [ ${ L } 24 ] } " && exit 1 || STATUS = ( 0 0 1 0) ; ;
'P' | 'p' ) [ [ ! $( ss -nltp) = ~ 'wireproxy' ] ] && red " ${ T [ ${ L } 24 ] } " && exit 1 || STATUS = ( 0 0 0 1) ; ;
'M' | 'm' ) [ -z " $UNLOCK_MODE_NOW " ] && check_unlock_running
if [ -n " $UNLOCK_MODE_NOW " ] ; then
red " ${ T [ ${ L } 28 ] } " && exit 1
else [ [ $OPTARG != [ 1-5] ] ] && red " ${ T [ ${ L } 25 ] } " && exit 1 || CHOOSE1 = $OPTARG
fi ; ;
'A' | 'a' ) [ [ ! " $OPTARG " = ~ ^[ A-Za-z] { 2} $ ] ] && red " ${ T [ ${ L } 26 ] } " && exit 1 || EXPECT = " $OPTARG " ; ;
'N' | 'n' ) for ( ( d = 0; d<" $SUPPORT_NUM " ; d++) ) ; do
[ [ $d = 0 ] ] && echo 'null' > /etc/wireguard/status.log || echo 'null' >> /etc/wireguard/status.log; done
echo " $OPTARG " | grep -qi 'n' && STREAM_UNLOCK[ 0] = '1' || STREAM_UNLOCK[ 0] = '0'
echo " $OPTARG " | grep -qi 'd' && STREAM_UNLOCK[ 1] = '1' || STREAM_UNLOCK[ 1] = '0' ; ;
'T' | 't' ) TOKEN = " $( echo $OPTARG | cut -d'@' -f1) "
USERID = " $( echo $OPTARG | cut -d'@' -f2) "
CUSTOM = " $( echo $OPTARG | cut -d'@' -f3) "
CUSTOM = " ${ CUSTOM :- 'Stream Media Unlock' } " ; ;
esac
case " $OPTNAME " in
'C' | 'c' ) L = 'C' ; ;
'E' | 'e' ) L = 'E' ; ;
'U' | 'u' ) if [ ! -e /usr/bin/warp_unlock.sh ] ; then
error " $( text 27) "
else
UN = 1; uninstall; exit 0
fi ; ;
'4' ) TRACE4 = $( curl -ks4m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g" )
[ [ ! $TRACE4 = ~ on| plus ] ] && error " $( text 24) " || STATUS = ( 1 0 0 0) ; ;
'6' ) TRACE6 = $( curl -ks6m8 https://www.cloudflare.com/cdn-cgi/trace | grep warp | sed "s/warp=//g" )
[ [ ! $TRACE6 = ~ on| plus ] ] && error " $( text 24) " || STATUS = ( 0 1 0 0) ; ;
'S' | 's' ) [ [ ! $( ss -nltp) = ~ 'warp-svc' ] ] && error " $( text 24) " || STATUS = ( 0 0 1 0) ; ;
'P' | 'p' ) [ [ ! $( ss -nltp) = ~ 'wireproxy' ] ] && error " $( text 24) " || STATUS = ( 0 0 0 1) ; ;
'M' | 'm' ) [ -z " $UNLOCK_MODE_NOW " ] && check_unlock_running
if [ -n " $UNLOCK_MODE_NOW " ] ; then
error " $( text 28) "
else
[ [ $OPTARG != [ 1-5] ] ] && error " $( text 25) " || CHOOSE1 = $OPTARG
fi ; ;
'A' | 'a' ) [ [ ! " $OPTARG " = ~ ^[ A-Za-z] { 2} $ ] ] && error " $( text 26) " || EXPECT = " $OPTARG " ; ;
'N' | 'n' ) for ( ( d = 0; d<" $SUPPORT_NUM " ; d++) ) ; do
[ [ $d = 0 ] ] && echo 'null' > /usr/bin/status.log || echo 'null' >> /usr/bin/status.log
done
echo " $OPTARG " | grep -qi 'n' && STREAM_UNLOCK[ 0] = '1' || STREAM_UNLOCK[ 0] = '0'
echo " $OPTARG " | grep -qi 'd' && STREAM_UNLOCK[ 1] = '1' || STREAM_UNLOCK[ 1] = '0' ; ;
'T' | 't' ) TOKEN = " $( echo $OPTARG | cut -d'@' -f1) "
USERID = " $( echo $OPTARG | cut -d'@' -f2) "
CUSTOM = " $( echo $OPTARG | cut -d'@' -f3) "
CUSTOM = " ${ CUSTOM :- 'Stream Media Unlock' } " ; ;
esac
done
# 主程序运行 2/2
@ -465,86 +542,86 @@ check_unlock_running
check_dependencies curl
check_warp
MODE2 = ( "while true; do" "sleep 1h; done" )
[ -n " $UNLOCK_MODE_NOW " ] && MENU_SHOW = " $( eval echo " ${ T [ ${ L } 19 ] } " ) ${ T [ ${ L } 12 ] } " || MENU_SHOW = " ${ T [ ${ L } 12 ] } "
action1( ) {
unset MODE2
[ -n " $UNLOCK_MODE_NOW " ] && uninstall
TASK = "sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"*/5 * * * * root bash /etc/wireguard /warp_unlock.sh\" >> /etc/crontab"
RESULT_OUTPUT = " ${ T [ ${ L } 10 ] } "
export_unlock_file
result_output
[ -n " $UNLOCK_MODE_NOW " ] && MENU_SHOW = " $( text_eval 19) $( text 12) " || MENU_SHOW = " $( text 12) "
action1( ) {
unset MODE2
[ -n " $UNLOCK_MODE_NOW " ] && uninstall
TASK = "sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"*/5 * * * * root bash /usr/bin /warp_unlock.sh\" >> /etc/crontab"
RESULT_OUTPUT = " \n $( text 10) \n "
export_unlock_file
result_output
}
action2( ) {
[ -n " $UNLOCK_MODE_NOW " ] && uninstall
TASK = " cat <<EOF > /etc/systemd/system/warp_unlock.service
action2( ) {
[ -n " $UNLOCK_MODE_NOW " ] && uninstall
TASK = " cat <<EOF > /etc/systemd/system/warp_unlock.service
[ Unit]
Description = WARP unlock
After = network.target
[ Service]
ExecStart = /etc/wireguard /warp_unlock.sh
ExecStart = /usr/bin /warp_unlock.sh
Restart = always
Type = simple
[ Install]
WantedBy = multi-user.target
EOF"
RESULT_OUTPUT = " ${ T [ ${ L } 43 ] } "
export_unlock_file
systemctl enable --now warp_unlock >/dev/null 2>& 1 &
result_output
RESULT_OUTPUT = " \n $( text 43) \n "
export_unlock_file
systemctl enable --now warp_unlock >/dev/null 2>& 1 &
result_output
}
action3( ) {
[ -n " $UNLOCK_MODE_NOW " ] && uninstall
TASK = "sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"@reboot root nohup bash /etc/wireguard /warp_unlock.sh &\" >> /etc/crontab"
RESULT_OUTPUT = " ${ T [ ${ L } 21 ] } "
export_unlock_file
nohup bash /etc/wireguard /warp_unlock.sh >/dev/null 2>& 1 &
result_output
action3( ) {
[ -n " $UNLOCK_MODE_NOW " ] && uninstall
TASK = "sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"@reboot root nohup bash /usr/bin /warp_unlock.sh &\" >> /etc/crontab"
RESULT_OUTPUT = " \n $( text 21) \n "
export_unlock_file
nohup bash /usr/bin /warp_unlock.sh >/dev/null 2>& 1 &
result_output
}
action4( ) {
[ -n " $UNLOCK_MODE_NOW " ] && uninstall
TASK = "sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"@reboot root screen -USdm u bash /etc/wireguard /warp_unlock.sh\" >> /etc/crontab"
RESULT_OUTPUT = " ${ T [ ${ L } 20 ] } "
check_dependencies screen
export_unlock_file
screen -USdm u bash /etc/wireguard /warp_unlock.sh
result_output
action4( ) {
[ -n " $UNLOCK_MODE_NOW " ] && uninstall
TASK = "sed -i '/warp_unlock.sh/d' /etc/crontab && echo \"@reboot root screen -USdm u bash /usr/bin /warp_unlock.sh\" >> /etc/crontab"
RESULT_OUTPUT = " \n $( text 20) \n "
check_dependencies screen
export_unlock_file
screen -USdm u bash /usr/bin /warp_unlock.sh
result_output
}
action5( ) {
[ -n " $UNLOCK_MODE_NOW " ] && uninstall
TASK = ""
RESULT_OUTPUT = " ${ T [ ${ L } 44 ] } "
node -v >/dev/null 2>& 1 || ${ PACKAGE_INSTALL [b] } nodejs
npm -v >/dev/null 2>& 1 || check_dependencies npm
npm install -g pm2
export_unlock_file
pm2 start /etc/wireguard /warp_unlock.sh
pm2 save; pm2 startup
result_output
action5( ) {
[ -n " $UNLOCK_MODE_NOW " ] && uninstall
TASK = ""
RESULT_OUTPUT = " \n $( text 44) \n "
node -v >/dev/null 2>& 1 || ${ PACKAGE_INSTALL [b] } nodejs
npm -v >/dev/null 2>& 1 || check_dependencies npm
npm install -g pm2
export_unlock_file
pm2 start /usr/bin /warp_unlock.sh
pm2 save; pm2 startup
result_output
}
action6( ) { UN = 1; uninstall; }
action6( ) { UN = 1; uninstall; }
action0( ) { exit 0; }
action0( ) { exit 0; }
# 菜单显示
menu( ) {
clear
yellow " ${ T [ ${ L } 16 ] } "
red "======================================================================================================================\n"
green " ${ T [ ${ L } 17 ] } : $VERSION ${ T [ ${ L } 18 ] } : ${ T [ ${ L } 1 ] } \n "
red "======================================================================================================================\n"
[ [ -z " $CHOOSE1 " ] ] && yellow " $MENU_SHOW " && reading " ${ T [ ${ L } 3 ] } " CHOOSE1
case " $CHOOSE1 " in
[ 0-6] ) action$CHOOSE1 ; ;
* ) red " ${ T [ ${ L } 14 ] } " ; sleep 1; menu; ;
esac
menu( ) {
clear
hint " $( text 16) "
red "======================================================================================================================\n"
info " $( text 17) : $VERSION $( text 18) : $( text 1) \n "
red "======================================================================================================================\n"
[ [ -z " $CHOOSE1 " ] ] && hint " $MENU_SHOW " && reading " $( text 3) " CHOOSE1
case " $CHOOSE1 " in
[ 0-6] ) action$CHOOSE1 ; ;
* ) red " $( text 14) " ; sleep 1; menu; ;
esac
}
menu