From e074e335a56194315a94b0336747578998e758ec Mon Sep 17 00:00:00 2001 From: ToyoDAdoubiBackup Date: Sun, 18 Nov 2018 23:35:00 +0800 Subject: [PATCH] Doub.io Script Backup --- LICENSE | 21 + README.md | 508 ++ adbyby.sh | 221 + aria2.sh | 646 +++ aria2_old.sh | 277 + ban_iptables.sh | 510 ++ base64.sh | 43 + bbr.sh | 236 + brook-pf.sh | 710 +++ brook.sh | 760 +++ caddy_install.sh | 141 + cloudt.sh | 428 ++ daze.sh | 721 +++ dowsdns.sh | 626 +++ gfw_push.sh | 437 ++ goflyway.sh | 688 +++ gogo.sh | 239 + haproxy.sh | 273 + iptables-pf.sh | 288 + libsodium.sh | 82 + lightsocks.sh | 623 +++ mtproxy.sh | 834 +++ mtproxy_go.sh | 782 +++ ocserv.sh | 582 ++ other/Aria2/aria2.conf | 108 + other/Aria2/dht.dat | Bin 0 -> 26880 bytes other/README.md | 18 + other/adhook.ini | 20 + other/jq-1.5.tar.gz | Bin 0 -> 739309 bytes other/ocserv.conf | 256 + other/pac.txt | 7942 +++++++++++++++++++++++++++ other/proxy.pac | 7661 ++++++++++++++++++++++++++ pac_get.sh | 872 +++ pipes.sh | 319 ++ pserver.sh | 376 ++ pythonhttp.sh | 108 + service/adbyby_centos | 85 + service/adbyby_debian | 83 + service/aria2_centos | 122 + service/aria2_debian | 120 + service/brook-pf_centos | 141 + service/brook-pf_debian | 139 + service/brook_centos | 105 + service/brook_debian | 104 + service/caddy_centos | 87 + service/caddy_debian | 85 + service/cloudt_centos | 138 + service/cloudt_debian | 136 + service/daze_centos | 103 + service/daze_debian | 101 + service/dowsdns_centos | 104 + service/dowsdns_debian | 103 + service/goflyway_centos | 103 + service/goflyway_debian | 101 + service/lightsocks_centos | 90 + service/lightsocks_debian | 88 + service/mtproxy_centos | 99 + service/mtproxy_debian | 97 + service/mtproxy_go_centos | 106 + service/mtproxy_go_debian | 104 + service/ocserv_debian | 102 + service/pipes_centos | 106 + service/pipes_debian | 104 + service/pserver_centos | 115 + service/pserver_debian | 110 + service/server_status_client_centos | 88 + service/server_status_client_debian | 86 + service/server_status_server_centos | 94 + service/server_status_server_debian | 92 + service/ss_go_centos | 102 + service/ss_go_debian | 100 + service/ssr_centos | 91 + service/ssr_debian | 89 + service/ssrmu_centos | 86 + service/ssrmu_debian | 84 + socat.sh | 359 ++ sources/163.sources.list | 8 + sources/README.md | 50 + sources/aliyun.sources.list | 7 + sources/ca.sources.list | 10 + sources/cn.sources.list | 10 + sources/cn2.sources.list | 10 + sources/de.sources.list | 10 + sources/fr.sources.list | 10 + sources/hk.sources.list | 10 + sources/jp.sources.list | 10 + sources/kr.sources.list | 10 + sources/ru.sources.list | 10 + sources/sg.sources.list | 10 + sources/uk.sources.list | 10 + sources/us.sources.list | 10 + sources/us.sources_stretch.list | 10 + ss-go.sh | 713 +++ ssh_port.sh | 217 + ssr.sh | 1526 +++++ ssr_check.sh | 367 ++ ssr_ip_check.sh | 162 + ssr_mujson_clear.sh | 49 + ssr_old.sh | 1854 +++++++ ssrmu.sh | 1878 +++++++ ssrstatus.sh | 889 +++ status.sh | 1107 ++++ tinymapper.sh | 424 ++ 103 files changed, 42089 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 adbyby.sh create mode 100644 aria2.sh create mode 100644 aria2_old.sh create mode 100644 ban_iptables.sh create mode 100644 base64.sh create mode 100644 bbr.sh create mode 100644 brook-pf.sh create mode 100644 brook.sh create mode 100644 caddy_install.sh create mode 100644 cloudt.sh create mode 100644 daze.sh create mode 100644 dowsdns.sh create mode 100644 gfw_push.sh create mode 100644 goflyway.sh create mode 100644 gogo.sh create mode 100644 haproxy.sh create mode 100644 iptables-pf.sh create mode 100644 libsodium.sh create mode 100644 lightsocks.sh create mode 100644 mtproxy.sh create mode 100644 mtproxy_go.sh create mode 100644 ocserv.sh create mode 100644 other/Aria2/aria2.conf create mode 100644 other/Aria2/dht.dat create mode 100644 other/README.md create mode 100644 other/adhook.ini create mode 100644 other/jq-1.5.tar.gz create mode 100644 other/ocserv.conf create mode 100644 other/pac.txt create mode 100644 other/proxy.pac create mode 100644 pac_get.sh create mode 100644 pipes.sh create mode 100644 pserver.sh create mode 100644 pythonhttp.sh create mode 100644 service/adbyby_centos create mode 100644 service/adbyby_debian create mode 100644 service/aria2_centos create mode 100644 service/aria2_debian create mode 100644 service/brook-pf_centos create mode 100644 service/brook-pf_debian create mode 100644 service/brook_centos create mode 100644 service/brook_debian create mode 100644 service/caddy_centos create mode 100644 service/caddy_debian create mode 100644 service/cloudt_centos create mode 100644 service/cloudt_debian create mode 100644 service/daze_centos create mode 100644 service/daze_debian create mode 100644 service/dowsdns_centos create mode 100644 service/dowsdns_debian create mode 100644 service/goflyway_centos create mode 100644 service/goflyway_debian create mode 100644 service/lightsocks_centos create mode 100644 service/lightsocks_debian create mode 100644 service/mtproxy_centos create mode 100644 service/mtproxy_debian create mode 100644 service/mtproxy_go_centos create mode 100644 service/mtproxy_go_debian create mode 100644 service/ocserv_debian create mode 100644 service/pipes_centos create mode 100644 service/pipes_debian create mode 100644 service/pserver_centos create mode 100644 service/pserver_debian create mode 100644 service/server_status_client_centos create mode 100644 service/server_status_client_debian create mode 100644 service/server_status_server_centos create mode 100644 service/server_status_server_debian create mode 100644 service/ss_go_centos create mode 100644 service/ss_go_debian create mode 100644 service/ssr_centos create mode 100644 service/ssr_debian create mode 100644 service/ssrmu_centos create mode 100644 service/ssrmu_debian create mode 100644 socat.sh create mode 100644 sources/163.sources.list create mode 100644 sources/README.md create mode 100644 sources/aliyun.sources.list create mode 100644 sources/ca.sources.list create mode 100644 sources/cn.sources.list create mode 100644 sources/cn2.sources.list create mode 100644 sources/de.sources.list create mode 100644 sources/fr.sources.list create mode 100644 sources/hk.sources.list create mode 100644 sources/jp.sources.list create mode 100644 sources/kr.sources.list create mode 100644 sources/ru.sources.list create mode 100644 sources/sg.sources.list create mode 100644 sources/uk.sources.list create mode 100644 sources/us.sources.list create mode 100644 sources/us.sources_stretch.list create mode 100644 ss-go.sh create mode 100644 ssh_port.sh create mode 100644 ssr.sh create mode 100644 ssr_check.sh create mode 100644 ssr_ip_check.sh create mode 100644 ssr_mujson_clear.sh create mode 100644 ssr_old.sh create mode 100644 ssrmu.sh create mode 100644 ssrstatus.sh create mode 100644 status.sh create mode 100644 tinymapper.sh diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e3d0665 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Toyo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2c1533f --- /dev/null +++ b/README.md @@ -0,0 +1,508 @@ +# 一个逗比写的逗比脚本 + +![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg) +[![GitHub stars](https://img.shields.io/github/stars/ToyoDAdoubiBackup/doubi.svg?style=popout&label=Stars)](https://github.com/ToyoDAdoubiBackup/doubi/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/ToyoDAdoubiBackup/doubi.svg?style=popout&label=Fork)](https://github.com/ToyoDAdoubiBackup/doubi/fork) +## 脚本索引 + +* [***代理相关***](#代理相关) + * [ss-go.sh](#ss_gosh) + * [ssr.sh](#ssrsh) + * [ssrmu.sh](#ssrmush) + * [brook.sh](#brooksh) + * [goflyway.sh](#goflywaysh) + * [daze.sh](#dazesh) + * [lightsocks.sh](#lightsockssh) + * [mtproxy.sh](#mtproxysh) + * [mtproxy_go.sh](#mtproxy_gosh) +* [***中转相关***](#中转相关) + * [iptables-pf.sh](#iptables-pfsh) + * [brook-pf.sh](#brook-pfsh) + * [haproxy.sh](#haproxysh) + * [socat.sh](#socatsh) + * [tinymapper.sh](#tinymappersh) +* [***BT下载相关***](#bt下载相关) + * [aria2.sh](#aria2sh) + * [cloudt.sh](#cloudtsh) + * [pserver.sh](#pserversh) +* [***服务器相关***](#服务器相关) + * [bbr.sh](#bbrsh) + * [status.sh](#statussh) + * [ban_iptables.sh](#ban_iptablessh) + * [ssh_port.sh](#ssh_portsh) +* [***VPN 相关***](#vpn相关) + * [ocserv.sh](#ocservsh) +* [***DNS 相关***](#dns相关) + * [dowsdns.sh](#dowsdnssh) +* [***HTTP 相关***](#http相关) + * [caddy_install.sh](#caddy_installsh) + * [pythonhttp.sh](#pythonhttpsh) +* [***其他***](#其他) + * [adbyby.sh](#adbybysh) + * [gfw_push.sh](#gfw_pushsh) + * [libsodium.sh](#libsodiumsh) + * [ssrstatus.sh](#ssrstatussh) + * [ssr_check.sh](#ssr_checksh) + * [ssr_ip_check.sh](#ssr_ip_checksh) + +--- + +## 代理相关 + +## ss_go.sh + +- 脚本说明: Shadowsocks 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/ss-jc67/ +- 项目地址: https://github.com/shadowsocks/go-shadowsocks2 + +#### 脚本特点: +目前网上的各个Shadowsocks脚本基本都是只有 安装/启动/重启 等基础功能,对于小白来说还是不够简单方便。既然是一键脚本,那么就要尽可能地简单,小白更容易接受使用! + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ss-go.sh && chmod +x ss-go.sh && bash ss-go.sh +``` + +--- +## ssr.sh + +- 脚本说明: ShadowsocksR 一键安装管理脚本,支持单端口/多端口切换和管理 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/ss-jc42/ +- 项目地址: https://github.com/ToyoDAdoubi/shadowsocksr + +#### 脚本特点: +目前网上的各个ShadowsocksR脚本基本都是只有 安装/启动/重启 等基础功能,对于小白来说还是不够简单方便。既然是一键脚本,那么就要尽可能地简单,小白更容易接受使用! + +- 支持 限制 用户速度 +- 支持 限制 端口设备数 +- 支持 显示 当前连接IP +- 支持 显示 SS/SSR连接+二维码 +- 支持 切换管理 单/多端口 +- 支持 一键安装 锐速 +- 支持 一键安装 BBR +- 支持 一键封禁 垃圾邮件(SMAP)/BT/PT + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh +``` + +--- +## ssrmu.sh + +- 脚本说明: ShadowsocksR 一键安装管理脚本,支持流量控制 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/ss-jc60/ +- 项目地址: https://github.com/ToyoDAdoubi/shadowsocksr + +#### 脚本特点: +目前网上的各个ShadowsocksR脚本基本都是只有 安装/启动/重启 等基础功能,对于小白来说还是不够简单方便。既然是一键脚本,那么就要尽可能地简单,小白更容易接受使用! + +- 支持 限制 用户速度 +- 支持 限制 用户设备数 +- 支持 限制 用户总流量 +- 支持 定时 流量清零 +- 支持 显示 当前连接IP +- 支持 显示 SS/SSR连接+二维码 +- 支持 一键安装 锐速 +- 支持 一键安装 BBR +- 支持 一键封禁 垃圾邮件(SMAP)/BT/PT + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssrmu.sh && chmod +x ssrmu.sh && bash ssrmu.sh +``` + +--- +## brook.sh + +- 脚本说明: Brook 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian7+ / Ubuntu14+ +- 使用方法: https://doub.io/brook-jc3/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/brook.sh && chmod +x brook.sh && bash brook.sh +``` + +--- +## goflyway.sh + +- 脚本说明: GoFlyway 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian7+ / Ubuntu14+ +- 使用方法: https://doub.io/goflyway-jc2/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/goflyway.sh && chmod +x goflyway.sh && bash goflyway.sh +``` + +--- +## lightsocks.sh + +- 脚本说明: LightSocks 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian7+ / Ubuntu14+ +- 使用方法: https://doub.io/lightsocks-jc1/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/lightsocks.sh && chmod +x lightsocks.sh && bash lightsocks.sh +``` + +--- +## daze.sh + +- 脚本说明: DAZE 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian7+ / Ubuntu14+ +- 使用方法: https://doub.io/daze-jc3/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/daze.sh && chmod +x daze.sh && bash daze.sh +``` + +--- +## mtproxy.sh + +- 脚本说明: Mtproto Proxy 一键安装管理脚本 +- 系统支持: CentOS7 / Debian7+ / Ubuntu14+ +- 使用方法: https://doub.io/shell-jc7/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/mtproxy.sh && chmod +x mtproxy.sh && bash mtproxy.sh +``` + +--- +## mtproxy_go.sh + +- 脚本说明: Mtproto Proxy Go版 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian7+ / Ubuntu14+ +- 使用方法: https://doub.io/shell-jc9/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/mtproxy_go.sh && chmod +x mtproxy_go.sh && bash mtproxy_go.sh +``` + +--- + +## 中转相关 + +## iptables-pf.sh + +- 脚本说明: iptables 端口转发 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/wlzy-20/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/iptables-pf.sh && chmod +x iptables-pf.sh && bash iptables-pf.sh +``` + +--- +## brook-pf.sh + +- 脚本说明: Brook 端口转发 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/wlzy-37/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/brook-pf.sh && chmod +x brook-pf.sh && bash brook-pf.sh +``` + +--- +## haproxy.sh + +- 脚本说明: HaProxy 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/wlzy-19/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/haproxy.sh && chmod +x haproxy.sh && bash haproxy.sh +``` + +--- +## socat.sh + +- 脚本说明: Socat 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/wlzy-18/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/socat.sh && chmod +x socat.sh && bash socat.sh +``` + +--- +## tinymapper.sh + +- 脚本说明: tinyPortMapper 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/wlzy-36/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/tinymapper.sh && chmod +x tinymapper.sh && bash tinymapper.sh +``` + +--- + +## BT下载相关 + +## aria2.sh + +- 脚本说明: Aria2 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/shell-jc4/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/aria2.sh && chmod +x aria2.sh && bash aria2.sh +``` + +--- +## cloudt.sh + +- 脚本说明: Cloud Torrent 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/wlzy-12/ +- 项目地址: https://github.com/jpillora/cloud-torrent + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/cloudt.sh && chmod +x cloudt.sh && bash cloudt.sh +``` + +--- +## pserver.sh + +- 脚本说明: Peerflix Server 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/wlzy-13/ +- 项目地址: https://github.com/asapach/peerflix-server + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/pserver.sh && chmod +x pserver.sh && bash pserver.sh +``` + +--- + +## 服务器相关 + +## bbr.sh + +- 脚本说明: BBR 一键安装管理脚本 +- 系统支持: Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/wlzy-16/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/bbr.sh && chmod +x bbr.sh && bash bbr.sh +``` + +--- +## status.sh + +- 脚本说明: ServerStatus 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/shell-jc3/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/status.sh && chmod +x status.sh && bash status.sh +``` + +--- +## ban_iptables.sh + +- 脚本说明: iptables 垃圾邮件(SPAM)/BT/PT 一键封禁脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/shell-jc2/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh +``` + +--- +## ssh_port.sh + +- 脚本说明: SSH 一键修改端口脚本 +- 系统支持: Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/linux-jc11/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssh_port.sh && chmod +x ssh_port.sh && bash ssh_port.sh +``` + +--- + +## VPN相关 + +## ocserv.sh + +- 脚本说明: Ocserv AnyConnect 一键安装管理脚本 +- 系统支持: Debian7+ / Ubuntu14+ +- 使用方法: https://doub.io/vpnzy-7/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ocserv.sh && chmod +x ocserv.sh && bash ocserv.sh +``` + +--- + +## DNS相关 + +## dowsdns.sh + +- 脚本说明: DowsDNS 一键安装管理脚本 +- 系统支持: CentOS7 / Debian7+ / Ubuntu14+ +- 使用方法: https://doub.io/dowsdns-jc3/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/dowsdns.sh && chmod +x dowsdns.sh && bash dowsdns.sh +``` + +--- + +## HTTP相关 + +## caddy_install.sh + +- 脚本说明: Caddy 一键安装脚本 +- 系统支持: CentOS6+ / Debian7+ / Ubuntu14+ +- 使用方法: https://doub.io/shell-jc1 + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh + # 安装插件: + bash caddy_install.sh xxx,xxx + # 例如同时安装 http.filemanager 和 http.webdav插件: + bash caddy_install.sh http.filemanager,http.webdav + # 插件和Caddy是集成在一起的(单个二进制文件),多个插件必须同时安装。 +# 卸载命令: +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/caddy_install.sh && chmod +x caddy_install.sh && caddy_install.sh uninstall +``` + +--- +## pythonhttp.sh + +- 脚本说明: SimpleHTTPServer 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/wlzy-8/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/pythonhttp.sh && chmod +x pythonhttp.sh && bash pythonhttp.sh +``` + +--- + +## 其他 + +## adbyby.sh + +- 脚本说明: ADbyby 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/adbyby-jc2/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/adbyby.sh && chmod +x adbyby.sh && bash adbyby.sh +``` + +## gfw_push.sh + +- 脚本说明: 监测服务器IP是否被墙并推送至 Telegram 一键脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/shell-jc8/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/gfw_push.sh && chmod +x gfw_push.sh && bash gfw_push.sh +``` + +--- +## libsodium.sh + +- 脚本说明: libsodium 一键安装管理脚本 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/shell-jc6/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/libsodium.sh && chmod +x libsodium.sh && bash libsodium.sh +``` + +--- +## ssr_check.sh + +- 脚本说明: ShadowsocksR 批量快速验证账号可用性 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/ss-jc56/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssr_check.sh && chmod +x ssr_check.sh +``` + +--- +## ssrstatus.sh + +- 脚本说明: ShadowsocksR 账号在线监控网站 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/shell-jc5/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssrstatus.sh && chmod +x ssrstatus.sh && bash ssrstatus +``` + +--- +## ssr_ip_check.sh + +- 脚本说明: ShadowsocksR 检测每个端口链接IP数 +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/ss-jc50/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssr_ip_check.sh && chmod +x ssr_ip_check.sh +``` + +--- +## ~~pipes.sh~~ + +- 脚本说明: PipeSocks 一键安装管理脚本(该软件已停更) +- 系统支持: CentOS7 / Debian7+ / Ubuntu14+ +- 使用方法: https://doub.io/pipesocks-jc2/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/pipesocks/install/master/install.sh && mv install.sh pipes.sh && chmod +x pipes.sh && bash pipes.sh +``` + +--- +## ~~gogo.sh~~ + +- 脚本说明: GoGo Tunnel 一键安装管理脚本(该软件已停更) +- 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ +- 使用方法: https://doub.io/wlzy-24/ + +#### 下载安装: +``` bash +wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/gogo.sh && chmod +x gogo.sh && bash gogo.sh +``` + +--- +Copyright (C) 2016-2018 Toyo diff --git a/adbyby.sh b/adbyby.sh new file mode 100644 index 0000000..e1c315c --- /dev/null +++ b/adbyby.sh @@ -0,0 +1,221 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: ADbyby +# Version: 1.0.1 +# Author: Toyo +# Blog: https://doub.io/adbyby-jc2/ +#================================================= + +file="/usr/local/adbyby" +adbyby_file="/usr/local/adbyby/bin/adbyby" +adbyby_conf="/usr/local/adbyby/bin/adhook.ini" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${adbyby_file} ]] && echo -e "${Error} ADbyby 没有安装,请检查 !" && exit 1 +} +check_pid(){ + PID=`ps -ef| grep "adbyby"| grep -v grep| grep -v "adbyby.sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}'` +} +Download_adbyby(){ + cd ${file} + if [[ ${bit} == "x86_64" ]]; then + wget --no-check-certificate -O "adbyby.tar.gz" "https://raw.githubusercontent.com/adbyby/Files/master/linux.64.tar.gz" + else + wget --no-check-certificate -O "adbyby.tar.gz" "https://raw.githubusercontent.com/adbyby/Files/master/linux.86.tar.gz" + fi + [[ ! -e "adbyby.tar.gz" ]] && echo -e "${Error} ADbyby 下载失败 !" && exit 1 + tar -xzf adbyby.tar.gz && rm -rf adbyby.tar.gz + [[ ! -e "${adbyby_file}" ]] && echo -e "${Error} ADbyby 解压失败 !" && exit 1 + cd bin + chmod 777 adbyby + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/adhook.ini" +} +Service_adbyby(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/adbyby_centos -O /etc/init.d/adbyby; then + echo -e "${Error} ADbyby服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/adbyby + chkconfig --add adbyby + chkconfig adbyby on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/adbyby_debian -O /etc/init.d/adbyby; then + echo -e "${Error} ADbyby服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/adbyby + update-rc.d -f adbyby defaults + fi + echo -e "${Info} ADbyby服务 管理脚本下载完成 !" +} +Installation_dependency(){ + if [[ ${release} = "centos" ]]; then + yum update + yum install -y vim + else + apt-get update + apt-get install -y vim + fi + mkdir ${file} +} +Install_adbyby(){ + [[ -e ${adbyby_file} ]] && echo -e "${Error} 检测到 ADbyby 已安装 !" && exit 1 + check_sys + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装..." + Download_adbyby + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_adbyby + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_adbyby +} +Start_adbyby(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} ADbyby 正在运行,请检查 !" && exit 1 + service adbyby start +} +Stop_adbyby(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} ADbyby 没有运行,请检查 !" && exit 1 + service adbyby stop +} +Restart_adbyby(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && service adbyby stop + service adbyby start +} +Set_adbyby(){ + check_installed_status + vi ${adbyby_conf} + Restart_adbyby +} +Uninstall_adbyby(){ + check_installed_status + echo "确定要卸载 ADbyby ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + Del_iptables + Save_iptables + rm -rf ${file} && rm -rf /etc/init.d/adbyby + if [[ ${release} = "centos" ]]; then + chkconfig --del adbyby + else + update-rc.d -f adbyby remove + fi + echo && echo "ADbyby 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +Add_iptables(){ + iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8118 +} +Del_iptables(){ + iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8118 +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + echo -e "net.ipv4.ip_forward=1" >> /etc/sysctl.conf + sysctl -p + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +echo && echo -e "请输入一个数字来选择选项 + + ${Green_font_prefix}1.${Font_color_suffix} 安装 ADbyby + ${Green_font_prefix}2.${Font_color_suffix} 卸载 ADbyby +———————————— + ${Green_font_prefix}3.${Font_color_suffix} 启动 ADbyby + ${Green_font_prefix}4.${Font_color_suffix} 停止 ADbyby + ${Green_font_prefix}5.${Font_color_suffix} 重启 ADbyby +———————————— + ${Green_font_prefix}6.${Font_color_suffix} 修改 配置文件 +————————————" && echo +if [[ -e ${adbyby_file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [1-8]:" num +case "$num" in + 1) + Install_adbyby + ;; + 2) + Uninstall_adbyby + ;; + 3) + Start_adbyby + ;; + 4) + Stop_adbyby + ;; + 5) + Restart_adbyby + ;; + 6) + Set_adbyby + ;; + *) + echo "请输入正确数字 [1-8]" + ;; +esac \ No newline at end of file diff --git a/aria2.sh b/aria2.sh new file mode 100644 index 0000000..302a8e7 --- /dev/null +++ b/aria2.sh @@ -0,0 +1,646 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: Aria2 +# Version: 1.1.10 +# Author: Toyo +# Blog: https://doub.io/shell-jc4/ +#================================================= +sh_ver="1.1.10" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +file="/root/.aria2" +aria2_conf="/root/.aria2/aria2.conf" +aria2_log="/root/.aria2/aria2.log" +Folder="/usr/local/aria2" +aria2c="/usr/bin/aria2c" +Crontab_file="/usr/bin/crontab" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${aria2c} ]] && echo -e "${Error} Aria2 没有安装,请检查 !" && exit 1 + [[ ! -e ${aria2_conf} ]] && echo -e "${Error} Aria2 配置文件不存在,请检查 !" && [[ $1 != "un" ]] && exit 1 +} +check_crontab_installed_status(){ + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 没有安装,开始安装..." + if [[ ${release} == "centos" ]]; then + yum install crond -y + else + apt-get install cron -y + fi + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 安装失败,请检查!" && exit 1 + else + echo -e "${Info} Crontab 安装成功!" + fi + fi +} +check_pid(){ + PID=`ps -ef| grep "aria2c"| grep -v grep| grep -v "aria2.sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}'` +} +check_new_ver(){ + echo -e "${Info} 请输入 Aria2 版本号,格式如:[ 1.34.0 ],获取地址:[ https://github.com/q3aql/aria2-static-builds/releases ]" + read -e -p "默认回车自动获取最新版本号:" aria2_new_ver + if [[ -z ${aria2_new_ver} ]]; then + aria2_new_ver=$(wget --no-check-certificate -qO- https://api.github.com/repos/q3aql/aria2-static-builds/releases | grep -o '"tag_name": ".*"' |head -n 1| sed 's/"//g;s/v//g' | sed 's/tag_name: //g') + if [[ -z ${aria2_new_ver} ]]; then + echo -e "${Error} Aria2 最新版本获取失败,请手动获取最新版本号[ https://github.com/q3aql/aria2-static-builds/releases ]" + read -e -p "请输入版本号 [ 格式如 1.34.0 ] :" aria2_new_ver + [[ -z "${aria2_new_ver}" ]] && echo "取消..." && exit 1 + else + echo -e "${Info} 检测到 Aria2 最新版本为 [ ${aria2_new_ver} ]" + fi + else + echo -e "${Info} 即将准备下载 Aria2 版本为 [ ${aria2_new_ver} ]" + fi +} +check_ver_comparison(){ + aria2_now_ver=$(${aria2c} -v|head -n 1|awk '{print $3}') + [[ -z ${aria2_now_ver} ]] && echo -e "${Error} Brook 当前版本获取失败 !" && exit 1 + if [[ "${aria2_now_ver}" != "${aria2_new_ver}" ]]; then + echo -e "${Info} 发现 Aria2 已有新版本 [ ${aria2_new_ver} ](当前版本:${aria2_now_ver})" + read -e -p "是否更新(会中断当前下载任务,请注意) ? [Y/n] :" yn + [[ -z "${yn}" ]] && yn="y" + if [[ $yn == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + Download_aria2 "update" + Start_aria2 + fi + else + echo -e "${Info} 当前 Aria2 已是最新版本 [ ${aria2_new_ver} ]" && exit 1 + fi +} +Download_aria2(){ + update_dl=$1 + cd "/usr/local" + #echo -e "${bit}" + if [[ ${bit} == "x86_64" ]]; then + bit="64bit" + elif [[ ${bit} == "i386" || ${bit} == "i686" ]]; then + bit="32bit" + else + bit="arm-rbpi" + fi + wget -N --no-check-certificate "https://github.com/q3aql/aria2-static-builds/releases/download/v${aria2_new_ver}/aria2-${aria2_new_ver}-linux-gnu-${bit}-build1.tar.bz2" + Aria2_Name="aria2-${aria2_new_ver}-linux-gnu-${bit}-build1" + + [[ ! -s "${Aria2_Name}.tar.bz2" ]] && echo -e "${Error} Aria2 压缩包下载失败 !" && exit 1 + tar jxvf "${Aria2_Name}.tar.bz2" + [[ ! -e "/usr/local/${Aria2_Name}" ]] && echo -e "${Error} Aria2 解压失败 !" && rm -rf "${Aria2_Name}.tar.bz2" && exit 1 + [[ ${update_dl} = "update" ]] && rm -rf "${Folder}" + mv "/usr/local/${Aria2_Name}" "${Folder}" + [[ ! -e "${Folder}" ]] && echo -e "${Error} Aria2 文件夹重命名失败 !" && rm -rf "${Aria2_Name}.tar.bz2" && rm -rf "/usr/local/${Aria2_Name}" && exit 1 + rm -rf "${Aria2_Name}.tar.bz2" + cd "${Folder}" + make install + [[ ! -e ${aria2c} ]] && echo -e "${Error} Aria2 主程序安装失败!" && rm -rf "${Folder}" && exit 1 + chmod +x aria2c + echo -e "${Info} Aria2 主程序安装完毕!开始下载配置文件..." +} +Download_aria2_conf(){ + mkdir "${file}" && cd "${file}" + wget --no-check-certificate -N "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/Aria2/aria2.conf" + [[ ! -s "aria2.conf" ]] && echo -e "${Error} Aria2 配置文件下载失败 !" && rm -rf "${file}" && exit 1 + wget --no-check-certificate -N "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/Aria2/dht.dat" + [[ ! -s "dht.dat" ]] && echo -e "${Error} Aria2 DHT文件下载失败 !" && rm -rf "${file}" && exit 1 + echo '' > aria2.session + sed -i 's/^rpc-secret=DOUBIToyo/rpc-secret='$(date +%s%N | md5sum | head -c 20)'/g' ${aria2_conf} +} +Service_aria2(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/aria2_centos -O /etc/init.d/aria2; then + echo -e "${Error} Aria2服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/aria2 + chkconfig --add aria2 + chkconfig aria2 on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/aria2_debian -O /etc/init.d/aria2; then + echo -e "${Error} Aria2服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/aria2 + update-rc.d -f aria2 defaults + fi + echo -e "${Info} Aria2服务 管理脚本下载完成 !" +} +Installation_dependency(){ + if [[ ${release} = "centos" ]]; then + yum update + yum -y groupinstall "Development Tools" + yum install nano -y + else + apt-get update + apt-get install nano build-essential -y + fi +} +Install_aria2(){ + check_root + [[ -e ${aria2c} ]] && echo -e "${Error} Aria2 已安装,请检查 !" && exit 1 + check_sys + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装 主程序..." + check_new_ver + Download_aria2 + echo -e "${Info} 开始下载/安装 配置文件..." + Download_aria2_conf + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_aria2 + Read_config + aria2_RPC_port=${aria2_port} + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_aria2 +} +Start_aria2(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} Aria2 正在运行,请检查 !" && exit 1 + /etc/init.d/aria2 start +} +Stop_aria2(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} Aria2 没有运行,请检查 !" && exit 1 + /etc/init.d/aria2 stop +} +Restart_aria2(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/aria2 stop + /etc/init.d/aria2 start +} +Set_aria2(){ + check_installed_status + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 修改 Aria2 RPC密码 + ${Green_font_prefix}2.${Font_color_suffix} 修改 Aria2 RPC端口 + ${Green_font_prefix}3.${Font_color_suffix} 修改 Aria2 文件下载位置 + ${Green_font_prefix}4.${Font_color_suffix} 修改 Aria2 密码+端口+文件下载位置 + ${Green_font_prefix}5.${Font_color_suffix} 手动 打开配置文件修改" && echo + read -e -p "(默认: 取消):" aria2_modify + [[ -z "${aria2_modify}" ]] && echo "已取消..." && exit 1 + if [[ ${aria2_modify} == "1" ]]; then + Set_aria2_RPC_passwd + elif [[ ${aria2_modify} == "2" ]]; then + Set_aria2_RPC_port + elif [[ ${aria2_modify} == "3" ]]; then + Set_aria2_RPC_dir + elif [[ ${aria2_modify} == "4" ]]; then + Set_aria2_RPC_passwd_port_dir + elif [[ ${aria2_modify} == "5" ]]; then + Set_aria2_vim_conf + else + echo -e "${Error} 请输入正确的数字(1-5)" && exit 1 + fi +} +Set_aria2_RPC_passwd(){ + read_123=$1 + if [[ ${read_123} != "1" ]]; then + Read_config + fi + if [[ -z "${aria2_passwd}" ]]; then + aria2_passwd_1="空(没有检测到配置,可能手动删除或注释了)" + else + aria2_passwd_1=${aria2_passwd} + fi + echo -e "请输入要设置的 Aria2 RPC密码(旧密码为:${Green_font_prefix}${aria2_passwd_1}${Font_color_suffix})" + read -e -p "(默认密码: 随机生成 密码请不要包含等号 = 和井号 #):" aria2_RPC_passwd + echo + [[ -z "${aria2_RPC_passwd}" ]] && aria2_RPC_passwd=$(date +%s%N | md5sum | head -c 20) + if [[ "${aria2_passwd}" != "${aria2_RPC_passwd}" ]]; then + if [[ -z "${aria2_passwd}" ]]; then + echo -e "\nrpc-secret=${aria2_RPC_passwd}" >> ${aria2_conf} + if [[ $? -eq 0 ]];then + echo -e "${Info} 密码修改成功!新密码为:${Green_font_prefix}${aria2_RPC_passwd}${Font_color_suffix}(因为找不到旧配置参数,所以自动加入配置文件底部)" + if [[ ${read_123} != "1" ]]; then + Restart_aria2 + fi + else + echo -e "${Error} 密码修改失败!旧密码为:${Green_font_prefix}${aria2_passwd}${Font_color_suffix}" + fi + else + sed -i 's/^rpc-secret='${aria2_passwd}'/rpc-secret='${aria2_RPC_passwd}'/g' ${aria2_conf} + if [[ $? -eq 0 ]];then + echo -e "${Info} 密码修改成功!新密码为:${Green_font_prefix}${aria2_RPC_passwd}${Font_color_suffix}" + if [[ ${read_123} != "1" ]]; then + Restart_aria2 + fi + else + echo -e "${Error} 密码修改失败!旧密码为:${Green_font_prefix}${aria2_passwd}${Font_color_suffix}" + fi + fi + else + echo -e "${Error} 新密码与旧密码一致,取消..." + fi +} +Set_aria2_RPC_port(){ + read_123=$1 + if [[ ${read_123} != "1" ]]; then + Read_config + fi + if [[ -z "${aria2_port}" ]]; then + aria2_port_1="空(没有检测到配置,可能手动删除或注释了)" + else + aria2_port_1=${aria2_port} + fi + echo -e "请输入要设置的 Aria2 RPC端口(旧端口为:${Green_font_prefix}${aria2_port_1}${Font_color_suffix})" + read -e -p "(默认端口: 6800):" aria2_RPC_port + echo + [[ -z "${aria2_RPC_port}" ]] && aria2_RPC_port="6800" + if [[ "${aria2_port}" != "${aria2_RPC_port}" ]]; then + if [[ -z "${aria2_port}" ]]; then + echo -e "\nrpc-listen-port=${aria2_RPC_port}" >> ${aria2_conf} + if [[ $? -eq 0 ]];then + echo -e "${Info} 端口修改成功!新端口为:${Green_font_prefix}${aria2_RPC_port}${Font_color_suffix}(因为找不到旧配置参数,所以自动加入配置文件底部)" + Del_iptables + Add_iptables + Save_iptables + if [[ ${read_123} != "1" ]]; then + Restart_aria2 + fi + else + echo -e "${Error} 端口修改失败!旧端口为:${Green_font_prefix}${aria2_port}${Font_color_suffix}" + fi + else + sed -i 's/^rpc-listen-port='${aria2_port}'/rpc-listen-port='${aria2_RPC_port}'/g' ${aria2_conf} + if [[ $? -eq 0 ]];then + echo -e "${Info} 端口修改成功!新密码为:${Green_font_prefix}${aria2_RPC_port}${Font_color_suffix}" + Del_iptables + Add_iptables + Save_iptables + if [[ ${read_123} != "1" ]]; then + Restart_aria2 + fi + else + echo -e "${Error} 端口修改失败!旧密码为:${Green_font_prefix}${aria2_port}${Font_color_suffix}" + fi + fi + else + echo -e "${Error} 新端口与旧端口一致,取消..." + fi +} +Set_aria2_RPC_dir(){ + read_123=$1 + if [[ ${read_123} != "1" ]]; then + Read_config + fi + if [[ -z "${aria2_dir}" ]]; then + aria2_dir_1="空(没有检测到配置,可能手动删除或注释了)" + else + aria2_dir_1=${aria2_dir} + fi + echo -e "请输入要设置的 Aria2 文件下载位置(旧位置为:${Green_font_prefix}${aria2_dir_1}${Font_color_suffix})" + read -e -p "(默认位置: /usr/local/caddy/www/aria2/Download):" aria2_RPC_dir + [[ -z "${aria2_RPC_dir}" ]] && aria2_RPC_dir="/usr/local/caddy/www/aria2/Download" + echo + if [[ -d "${aria2_RPC_dir}" ]]; then + if [[ "${aria2_dir}" != "${aria2_RPC_dir}" ]]; then + if [[ -z "${aria2_dir}" ]]; then + echo -e "\ndir=${aria2_RPC_dir}" >> ${aria2_conf} + if [[ $? -eq 0 ]];then + echo -e "${Info} 位置修改成功!新位置为:${Green_font_prefix}${aria2_RPC_dir}${Font_color_suffix}(因为找不到旧配置参数,所以自动加入配置文件底部)" + if [[ ${read_123} != "1" ]]; then + Restart_aria2 + fi + else + echo -e "${Error} 位置修改失败!旧位置为:${Green_font_prefix}${aria2_dir}${Font_color_suffix}" + fi + else + aria2_dir_2=$(echo "${aria2_dir}"|sed 's/\//\\\//g') + aria2_RPC_dir_2=$(echo "${aria2_RPC_dir}"|sed 's/\//\\\//g') + sed -i 's/^dir='${aria2_dir_2}'/dir='${aria2_RPC_dir_2}'/g' ${aria2_conf} + if [[ $? -eq 0 ]];then + echo -e "${Info} 位置修改成功!新位置为:${Green_font_prefix}${aria2_RPC_dir}${Font_color_suffix}" + if [[ ${read_123} != "1" ]]; then + Restart_aria2 + fi + else + echo -e "${Error} 位置修改失败!旧位置为:${Green_font_prefix}${aria2_dir}${Font_color_suffix}" + fi + fi + else + echo -e "${Error} 新位置与旧位置一致,取消..." + fi + else + echo -e "${Error} 新位置文件夹不存在,请检查!新位置为:${Green_font_prefix}${aria2_RPC_dir}${Font_color_suffix}" + fi +} +Set_aria2_RPC_passwd_port_dir(){ + Read_config + Set_aria2_RPC_passwd "1" + Set_aria2_RPC_port "1" + Set_aria2_RPC_dir "1" + Restart_aria2 +} +Set_aria2_vim_conf(){ + Read_config + aria2_port_old=${aria2_port} + echo -e "${Tip} 手动修改配置文件须知(nano 文本编辑器详细使用教程:https://doub.io/linux-jc13/): +${Green_font_prefix}1.${Font_color_suffix} 配置文件中含有中文注释,如果你的 服务器系统 或 SSH工具 不支持中文显示,将会乱码(请本地编辑)。 +${Green_font_prefix}2.${Font_color_suffix} 一会自动打开配置文件后,就可以开始手动编辑文件了。 +${Green_font_prefix}3.${Font_color_suffix} 如果要退出并保存文件,那么按 ${Green_font_prefix}Ctrl+X键${Font_color_suffix} 后,输入 ${Green_font_prefix}y${Font_color_suffix} 后,再按一下 ${Green_font_prefix}回车键${Font_color_suffix} 即可。 +${Green_font_prefix}4.${Font_color_suffix} 如果要退出并不保存文件,那么按 ${Green_font_prefix}Ctrl+X键${Font_color_suffix} 后,输入 ${Green_font_prefix}n${Font_color_suffix} 即可。 +${Green_font_prefix}5.${Font_color_suffix} 如果你想在本地编辑配置文件,那么配置文件位置: ${Green_font_prefix}/root/.aria2/aria2.conf${Font_color_suffix} (注意是隐藏目录) 。" && echo + read -e -p "如果已经理解 nano 使用方法,请按任意键继续,如要取消请使用 Ctrl+C 。" var + nano "${aria2_conf}" + Read_config + if [[ ${aria2_port_old} != ${aria2_port} ]]; then + aria2_RPC_port=${aria2_port} + aria2_port=${aria2_port_old} + Del_iptables + Add_iptables + Save_iptables + fi + Restart_aria2 +} +Read_config(){ + status_type=$1 + if [[ ! -e ${aria2_conf} ]]; then + if [[ ${status_type} != "un" ]]; then + echo -e "${Error} Aria2 配置文件不存在 !" && exit 1 + fi + else + conf_text=$(cat ${aria2_conf}|grep -v '#') + aria2_dir=$(echo -e "${conf_text}"|grep "dir="|awk -F "=" '{print $NF}') + aria2_port=$(echo -e "${conf_text}"|grep "rpc-listen-port="|awk -F "=" '{print $NF}') + aria2_passwd=$(echo -e "${conf_text}"|grep "rpc-secret="|awk -F "=" '{print $NF}') + fi + +} +View_Aria2(){ + check_installed_status + Read_config + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP(外网IP检测失败)" + fi + fi + fi + [[ -z "${aria2_dir}" ]] && aria2_dir="找不到配置参数" + [[ -z "${aria2_port}" ]] && aria2_port="找不到配置参数" + [[ -z "${aria2_passwd}" ]] && aria2_passwd="找不到配置参数(或无密码)" + clear + echo -e "\nAria2 简单配置信息:\n + 地址\t: ${Green_font_prefix}${ip}${Font_color_suffix} + 端口\t: ${Green_font_prefix}${aria2_port}${Font_color_suffix} + 密码\t: ${Green_font_prefix}${aria2_passwd}${Font_color_suffix} + 目录\t: ${Green_font_prefix}${aria2_dir}${Font_color_suffix}\n" +} +View_Log(){ + [[ ! -e ${aria2_log} ]] && echo -e "${Error} Aria2 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${aria2_log}${Font_color_suffix} 命令。" && echo + tail -f ${aria2_log} +} +Update_bt_tracker(){ + check_installed_status + check_crontab_installed_status + crontab_update_status=$(crontab -l|grep "aria2.sh update-bt-tracker") + if [[ -z "${crontab_update_status}" ]]; then + echo && echo -e "当前自动更新模式: ${Red_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}Aria2 自动更新 BT-Tracker服务器${Font_color_suffix} 功能吗?(一般情况下会加强BT下载效果)[Y/n]" + read -e -p "注意:该功能会定时重启 Aria2!(默认: y):" crontab_update_status_ny + [[ -z "${crontab_update_status_ny}" ]] && crontab_update_status_ny="y" + if [[ ${crontab_update_status_ny} == [Yy] ]]; then + crontab_update_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前自动更新模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Red_font_prefix}Aria2 自动更新 BT-Tracker服务器${Font_color_suffix} 功能吗?(一般情况下会加强BT下载效果)[y/N]" + read -e -p "注意:该功能会定时重启 Aria2!(默认: n):" crontab_update_status_ny + [[ -z "${crontab_update_status_ny}" ]] && crontab_update_status_ny="n" + if [[ ${crontab_update_status_ny} == [Yy] ]]; then + crontab_update_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_update_start(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/aria2.sh update-bt-tracker/d" "$file_1/crontab.bak" + echo -e "\n0 3 * * 1 /bin/bash $file_1/aria2.sh update-bt-tracker" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -f "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "aria2.sh update-bt-tracker") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Aria2 自动更新 BT-Tracker服务器 开启失败 !" && exit 1 + else + echo -e "${Info} Aria2 自动更新 BT-Tracker服务器 开启成功 !" + Update_bt_tracker_cron + fi +} +crontab_update_stop(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/aria2.sh update-bt-tracker/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -f "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "aria2.sh update-bt-tracker") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Aria2 自动更新 BT-Tracker服务器 停止失败 !" && exit 1 + else + echo -e "${Info} Aria2 自动更新 BT-Tracker服务器 停止成功 !" + fi +} +Update_bt_tracker_cron(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/aria2 stop + bt_tracker_list=$(wget -qO- https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_all.txt |awk NF|sed ":a;N;s/\n/,/g;ta") + if [ -z "`grep "bt-tracker" ${aria2_conf}`" ]; then + sed -i '$a bt-tracker='${bt_tracker_list} "${aria2_conf}" + echo -e "${Info} 添加成功..." + else + sed -i "s@bt-tracker.*@bt-tracker=$bt_tracker_list@g" "${aria2_conf}" + echo -e "${Info} 更新成功..." + fi + /etc/init.d/aria2 start +} +Update_aria2(){ + check_installed_status + check_new_ver + check_ver_comparison +} +Uninstall_aria2(){ + check_installed_status "un" + echo "确定要卸载 Aria2 ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + crontab -l > "$file_1/crontab.bak" + sed -i "/aria2.sh/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -f "$file_1/crontab.bak" + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + Read_config "un" + Del_iptables + Save_iptables + cd "${Folder}" + make uninstall + cd .. + rm -rf "${aria2c}" + rm -rf "${Folder}" + rm -rf "${file}" + if [[ ${release} = "centos" ]]; then + chkconfig --del aria2 + else + update-rc.d -f aria2 remove + fi + rm -rf "/etc/init.d/aria2" + echo && echo "Aria2 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${aria2_RPC_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${aria2_RPC_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${aria2_port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${aria2_port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/aria2.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/aria2" ]]; then + rm -rf /etc/init.d/aria2 + Service_aria2 + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/aria2.sh" && chmod +x aria2.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +action=$1 +if [[ "${action}" == "update-bt-tracker" ]]; then + Update_bt_tracker_cron +else +echo && echo -e " Aria2 一键安装管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/shell-jc4 -- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 Aria2 + ${Green_font_prefix} 2.${Font_color_suffix} 更新 Aria2 + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 Aria2 +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 Aria2 + ${Green_font_prefix} 5.${Font_color_suffix} 停止 Aria2 + ${Green_font_prefix} 6.${Font_color_suffix} 重启 Aria2 +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 修改 配置文件 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 配置信息 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 日志信息 + ${Green_font_prefix}10.${Font_color_suffix} 配置 自动更新 BT-Tracker服务器 +————————————" && echo +if [[ -e ${aria2c} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-10]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_aria2 + ;; + 2) + Update_aria2 + ;; + 3) + Uninstall_aria2 + ;; + 4) + Start_aria2 + ;; + 5) + Stop_aria2 + ;; + 6) + Restart_aria2 + ;; + 7) + Set_aria2 + ;; + 8) + View_Aria2 + ;; + 9) + View_Log + ;; + 10) + Update_bt_tracker + ;; + *) + echo "请输入正确数字 [0-10]" + ;; +esac +fi \ No newline at end of file diff --git a/aria2_old.sh b/aria2_old.sh new file mode 100644 index 0000000..4115e4f --- /dev/null +++ b/aria2_old.sh @@ -0,0 +1,277 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: Aria2 +# Version: 1.0.4 +# Author: Toyo +# Blog: https://doub.io/shell-jc4/ +#================================================= +sh_ver="1.0.4" +file="/root/.aria2" +aria2_conf="${file}/aria2.conf" +aria2_log="/root/.aria2/aria2.log" +aria2c="/usr/bin/aria2c" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${aria2c} ]] && echo -e "${Error} Aria2 没有安装,请检查 !" && exit 1 + [[ ! -e ${aria2_conf} ]] && echo -e "${Error} Aria2 配置文件不存在,请检查 !" && [[ $1 != "un" ]] && exit 1 +} +check_pid(){ + PID=`ps -ef| grep "aria2c"| grep -v grep| grep -v ".sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}'` +} +Download_aria2(){ + mkdir "${file}" && cd "${file}" + wget --no-check-certificate -N "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/Aria2/aria2.conf" + [[ ! -s "aria2.conf" ]] && echo -e "${Error} Aria2 配置文件下载失败 !" && rm -rf "${file}" && exit 1 + wget --no-check-certificate -N "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/Aria2/dht.dat" + [[ ! -s "dht.dat" ]] && echo -e "${Error} Aria2 DHT文件下载失败 !" && rm -rf "${file}" && exit 1 + echo '' > aria2.session +} +Service_aria2(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/aria2_centos -O /etc/init.d/aria2; then + echo -e "${Error} Aria2服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/aria2 + chkconfig --add aria2 + chkconfig aria2 on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/aria2_debian -O /etc/init.d/aria2; then + echo -e "${Error} Aria2服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/aria2 + update-rc.d -f aria2 defaults + fi + echo -e "${Info} Aria2服务 管理脚本下载完成 !" +} +Installation_dependency(){ + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 1 ]]; then + echo -e "${Error} CentOS6 系统不支持安装 Aria2(源没有Aria2包),请更换 CentOS7 或其他系统安装 !" && exit 1 + fi + wget -N --no-check-certificate http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm + [[ ! -e "epel-release-latest-7.noarch.rpm" ]] && echo -e "${Error} CentOS7 EPEL 源下载失败 !" && exit 1 + rpm -ivh epel-release-latest-7.noarch.rpm + rm -rf epel-release-latest-7.noarch.rpm + yum update + yum install aria2 curl unzip vim -y + elif [[ ${release} = "debian" ]]; then + mv /etc/apt/sources.list /etc/apt/sources.list.bak + wget --no-check-certificate -O "/etc/apt/sources.list" "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/sources/us.sources_stretch.list" + apt-get update + apt-get install aria2 curl unzip vim -y + rm -rf /etc/apt/sources.list + mv /etc/apt/sources.list.bak /etc/apt/sources.list + apt-get update + else + apt-get update + apt-get install aria2 curl unzip vim -y + fi + [[ ! -e ${aria2c} ]] && echo -e "${Error} Aria2 安装失败,请检查 !" && exit 1 +} +Install_aria2(){ + [[ -e ${aria2c} ]] && echo -e "${Error} Aria2 已安装,请检查 !" && exit 1 + check_sys + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装 配置文件..." + Download_aria2 + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_aria2 + Read_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_aria2 +} +Start_aria2(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} Aria2 正在运行,请检查 !" && exit 1 + /etc/init.d/aria2 start +} +Stop_aria2(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} Aria2 没有运行,请检查 !" && exit 1 + /etc/init.d/aria2 stop +} +Restart_aria2(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/aria2 stop + /etc/init.d/aria2 start +} +Set_aria2(){ + check_installed_status + vim ${aria2_conf} + Restart_aria2 +} +Read_config(){ + [[ ! -e ${aria2_conf} ]] && echo -e "${Error} Aria2 配置文件不存在 !" && exit 1 + conf_text=$(cat ${aria2_conf}|grep -v '#') + aria2_dir=$(echo -e "${conf_text}"|grep "dir="|awk -F "=" '{print $NF}') + aria2_rpc_port=$(echo -e "${conf_text}"|grep "rpc-listen-port="|awk -F "=" '{print $NF}') + aria2_rpc_secret=$(echo -e "${conf_text}"|grep "rpc-secret="|awk -F "=" '{print $NF}') +} +View_Log(){ + [[ ! -e ${aria2_log} ]] && echo -e "${Error} Aria2 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo + tail -f ${aria2_log} +} +Uninstall_aria2(){ + check_installed_status "un" + echo "确定要卸载 Aria2 ? (y/N)" + echo + stty erase '^H' && read -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + Read_config + Del_iptables + Save_iptables + if [[ ${release} = "centos" ]]; then + chkconfig --del aria2 + yum remove aria2 -y + else + update-rc.d -f aria2 remove + apt-get remove --purge aria2 -y + fi + rm -rf ${file} + echo && echo "Aria2 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${aria2_rpc_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${aria2_rpc_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${aria2_rpc_port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${aria2_rpc_port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + echo -e "当前版本为 [ ${sh_ver} ],开始检测最新版本..." + sh_new_ver=$(wget --no-check-certificate -qO- "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/aria2.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 检测最新版本失败 !" && exit 0 + if [[ ${sh_new_ver} != ${sh_ver} ]]; then + echo -e "发现新版本[ ${sh_new_ver} ],是否更新?[Y/n]" + stty erase '^H' && read -p "(默认: y):" yn + [[ -z "${yn}" ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/aria2.sh && chmod +x aria2.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !" + else + echo && echo " 已取消..." && echo + fi + else + echo -e "当前已是最新版本[ ${sh_new_ver} ] !" + fi +} +echo && echo -e " Aria2 一键安装管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/shell-jc4 -- + + ${Green_font_prefix}0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix}1.${Font_color_suffix} 安装 Aria2 + ${Green_font_prefix}2.${Font_color_suffix} 卸载 Aria2 +———————————— + ${Green_font_prefix}3.${Font_color_suffix} 启动 Aria2 + ${Green_font_prefix}4.${Font_color_suffix} 停止 Aria2 + ${Green_font_prefix}5.${Font_color_suffix} 重启 Aria2 +———————————— + ${Green_font_prefix}6.${Font_color_suffix} 修改 配置文件 + ${Green_font_prefix}7.${Font_color_suffix} 查看 日志信息 +————————————" && echo +if [[ -e ${aria2c} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +stty erase '^H' && read -p " 请输入数字 [0-7]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_aria2 + ;; + 2) + Uninstall_aria2 + ;; + 3) + Start_aria2 + ;; + 4) + Stop_aria2 + ;; + 5) + Restart_aria2 + ;; + 6) + Set_aria2 + ;; + 7) + View_Log + ;; + *) + echo "请输入正确数字 [0-7]" + ;; +esac \ No newline at end of file diff --git a/ban_iptables.sh b/ban_iptables.sh new file mode 100644 index 0000000..3d57b1b --- /dev/null +++ b/ban_iptables.sh @@ -0,0 +1,510 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: iptables 封禁 BT、PT、SPAM(垃圾邮件)和自定义端口、关键词 +# Version: 1.0.10 +# Blog: https://doub.io/shell-jc2/ +#================================================= + +sh_ver="1.0.10" +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" + +smtp_port="25,26,465,587" +pop3_port="109,110,995" +imap_port="143,218,220,993" +other_port="24,50,57,105,106,158,209,1109,24554,60177,60179" +bt_key_word="torrent +.torrent +peer_id= +announce +info_hash +get_peers +find_node +BitTorrent +announce_peer +BitTorrent protocol +announce.php?passkey= +magnet: +xunlei +sandai +Thunder +XLLiveUD" + +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_BT(){ + Cat_KEY_WORDS + BT_KEY_WORDS=$(echo -e "$Ban_KEY_WORDS_list"|grep "torrent") +} +check_SPAM(){ + Cat_PORT + SPAM_PORT=$(echo -e "$Ban_PORT_list"|grep "${smtp_port}") +} +Cat_PORT(){ + Ban_PORT_list=$(iptables -t filter -L OUTPUT -nvx --line-numbers|grep "REJECT"|awk '{print $13}') +} +Cat_KEY_WORDS(){ + Ban_KEY_WORDS_list="" + Ban_KEY_WORDS_v6_list="" + if [[ ! -z ${v6iptables} ]]; then + Ban_KEY_WORDS_v6_text=$(${v6iptables} -t mangle -L OUTPUT -nvx --line-numbers|grep "DROP") + Ban_KEY_WORDS_v6_list=$(echo -e "${Ban_KEY_WORDS_v6_text}"|sed -r 's/.*\"(.+)\".*/\1/') + fi + Ban_KEY_WORDS_text=$(${v4iptables} -t mangle -L OUTPUT -nvx --line-numbers|grep "DROP") + Ban_KEY_WORDS_list=$(echo -e "${Ban_KEY_WORDS_text}"|sed -r 's/.*\"(.+)\".*/\1/') +} +View_PORT(){ + Cat_PORT + echo -e "===============${Red_background_prefix} 当前已封禁 端口 ${Font_color_suffix}===============" + echo -e "$Ban_PORT_list" && echo && echo -e "===============================================" +} +View_KEY_WORDS(){ + Cat_KEY_WORDS + echo -e "==============${Red_background_prefix} 当前已封禁 关键词 ${Font_color_suffix}==============" + echo -e "$Ban_KEY_WORDS_list" && echo -e "===============================================" +} +View_ALL(){ + echo + View_PORT + View_KEY_WORDS + echo +} +Save_iptables_v4_v6(){ + if [[ ${release} == "centos" ]]; then + if [[ ! -z "$v6iptables" ]]; then + service ip6tables save + chkconfig --level 2345 ip6tables on + fi + service iptables save + chkconfig --level 2345 iptables on + else + if [[ ! -z "$v6iptables" ]]; then + ip6tables-save > /etc/ip6tables.up.rules + echo -e "#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules\n/sbin/ip6tables-restore < /etc/ip6tables.up.rules" > /etc/network/if-pre-up.d/iptables + else + echo -e "#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules" > /etc/network/if-pre-up.d/iptables + fi + iptables-save > /etc/iptables.up.rules + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Set_key_word() { $1 -t mangle -$3 OUTPUT -m string --string "$2" --algo bm --to 65535 -j DROP; } +Set_tcp_port() { + [[ "$1" = "$v4iptables" ]] && $1 -t filter -$3 OUTPUT -p tcp -m multiport --dports "$2" -m state --state NEW,ESTABLISHED -j REJECT --reject-with icmp-port-unreachable + [[ "$1" = "$v6iptables" ]] && $1 -t filter -$3 OUTPUT -p tcp -m multiport --dports "$2" -m state --state NEW,ESTABLISHED -j REJECT --reject-with tcp-reset +} +Set_udp_port() { $1 -t filter -$3 OUTPUT -p udp -m multiport --dports "$2" -j DROP; } +Set_SPAM_Code_v4(){ + for i in ${smtp_port} ${pop3_port} ${imap_port} ${other_port} + do + Set_tcp_port $v4iptables "$i" $s + Set_udp_port $v4iptables "$i" $s + done +} +Set_SPAM_Code_v4_v6(){ + for i in ${smtp_port} ${pop3_port} ${imap_port} ${other_port} + do + for j in $v4iptables $v6iptables + do + Set_tcp_port $j "$i" $s + Set_udp_port $j "$i" $s + done + done +} +Set_PORT(){ + if [[ -n "$v4iptables" ]] && [[ -n "$v6iptables" ]]; then + Set_tcp_port $v4iptables $PORT $s + Set_udp_port $v4iptables $PORT $s + Set_tcp_port $v6iptables $PORT $s + Set_udp_port $v6iptables $PORT $s + elif [[ -n "$v4iptables" ]]; then + Set_tcp_port $v4iptables $PORT $s + Set_udp_port $v4iptables $PORT $s + fi + Save_iptables_v4_v6 +} +Set_KEY_WORDS(){ + key_word_num=$(echo -e "${key_word}"|wc -l) + for((integer = 1; integer <= ${key_word_num}; integer++)) + do + i=$(echo -e "${key_word}"|sed -n "${integer}p") + Set_key_word $v4iptables "$i" $s + [[ ! -z "$v6iptables" ]] && Set_key_word $v6iptables "$i" $s + done + Save_iptables_v4_v6 +} +Set_BT(){ + key_word=${bt_key_word} + Set_KEY_WORDS + Save_iptables_v4_v6 +} +Set_SPAM(){ + if [[ -n "$v4iptables" ]] && [[ -n "$v6iptables" ]]; then + Set_SPAM_Code_v4_v6 + elif [[ -n "$v4iptables" ]]; then + Set_SPAM_Code_v4 + fi + Save_iptables_v4_v6 +} +Set_ALL(){ + Set_BT + Set_SPAM +} +Ban_BT(){ + check_BT + [[ ! -z ${BT_KEY_WORDS} ]] && echo -e "${Error} 检测到已封禁BT、PT 关键词,无需再次封禁 !" && exit 0 + s="A" + Set_BT + View_ALL + echo -e "${Info} 已封禁BT、PT 关键词 !" +} +Ban_SPAM(){ + check_SPAM + [[ ! -z ${SPAM_PORT} ]] && echo -e "${Error} 检测到已封禁SPAM(垃圾邮件) 端口,无需再次封禁 !" && exit 0 + s="A" + Set_SPAM + View_ALL + echo -e "${Info} 已封禁SPAM(垃圾邮件) 端口 !" +} +Ban_ALL(){ + check_BT + check_SPAM + s="A" + if [[ -z ${BT_KEY_WORDS} ]]; then + if [[ -z ${SPAM_PORT} ]]; then + Set_ALL + View_ALL + echo -e "${Info} 已封禁BT、PT 关键词 和 SPAM(垃圾邮件) 端口 !" + else + Set_BT + View_ALL + echo -e "${Info} 已封禁BT、PT 关键词 !" + fi + else + if [[ -z ${SPAM_PORT} ]]; then + Set_SPAM + View_ALL + echo -e "${Info} 已封禁SPAM(垃圾邮件) 端口 !" + else + echo -e "${Error} 检测到已封禁BT、PT 关键词 和 SPAM(垃圾邮件) 端口,无需再次封禁 !" && exit 0 + fi + fi +} +UnBan_BT(){ + check_BT + [[ -z ${BT_KEY_WORDS} ]] && echo -e "${Error} 检测到未封禁BT、PT 关键词,请检查 !" && exit 0 + s="D" + Set_BT + View_ALL + echo -e "${Info} 已解封BT、PT 关键词 !" +} +UnBan_SPAM(){ + check_SPAM + [[ -z ${SPAM_PORT} ]] && echo -e "${Error} 检测到未封禁SPAM(垃圾邮件) 端口,请检查 !" && exit 0 + s="D" + Set_SPAM + View_ALL + echo -e "${Info} 已解封SPAM(垃圾邮件) 端口 !" +} +UnBan_ALL(){ + check_BT + check_SPAM + s="D" + if [[ ! -z ${BT_KEY_WORDS} ]]; then + if [[ ! -z ${SPAM_PORT} ]]; then + Set_ALL + View_ALL + echo -e "${Info} 已解封BT、PT 关键词 和 SPAM(垃圾邮件) 端口 !" + else + Set_BT + View_ALL + echo -e "${Info} 已解封BT、PT 关键词 !" + fi + else + if [[ ! -z ${SPAM_PORT} ]]; then + Set_SPAM + View_ALL + echo -e "${Info} 已解封SPAM(垃圾邮件) 端口 !" + else + echo -e "${Error} 检测到未封禁BT、PT 关键词和 SPAM(垃圾邮件) 端口,请检查 !" && exit 0 + fi + fi +} +ENTER_Ban_KEY_WORDS_type(){ + Type=$1 + Type_1=$2 + if [[ $Type_1 != "ban_1" ]]; then + echo -e "请选择输入类型: + 1. 手动输入(只支持单个关键词) + 2. 本地文件读取(支持批量读取关键词,每行一个关键词) + 3. 网络地址读取(支持批量读取关键词,每行一个关键词)" && echo + read -e -p "(默认: 1. 手动输入):" key_word_type + fi + [[ -z "${key_word_type}" ]] && key_word_type="1" + if [[ ${key_word_type} == "1" ]]; then + if [[ $Type == "ban" ]]; then + ENTER_Ban_KEY_WORDS + else + ENTER_UnBan_KEY_WORDS + fi + elif [[ ${key_word_type} == "2" ]]; then + ENTER_Ban_KEY_WORDS_file + elif [[ ${key_word_type} == "3" ]]; then + ENTER_Ban_KEY_WORDS_url + else + if [[ $Type == "ban" ]]; then + ENTER_Ban_KEY_WORDS + else + ENTER_UnBan_KEY_WORDS + fi + fi +} +ENTER_Ban_PORT(){ + echo -e "请输入欲封禁的 端口(单端口/多端口/连续端口段)" + if [[ ${Ban_PORT_Type_1} != "1" ]]; then + echo -e "${Green_font_prefix}========示例说明========${Font_color_suffix} + 单端口:25(单个端口) + 多端口:25,26,465,587(多个端口用英文逗号分割) + 连续端口段:25:587(25-587之间的所有端口)" && echo + fi + read -e -p "(回车默认取消):" PORT + [[ -z "${PORT}" ]] && echo "已取消..." && View_ALL && exit 0 +} +ENTER_Ban_KEY_WORDS(){ + echo -e "请输入欲封禁的 关键词(域名等,仅支持单个关键词)" + if [[ ${Type_1} != "ban_1" ]]; then + echo -e "${Green_font_prefix}========示例说明========${Font_color_suffix} + 关键词:youtube,即禁止访问任何包含关键词 youtube 的域名。 + 关键词:youtube.com,即禁止访问任何包含关键词 youtube.com 的域名(泛域名屏蔽)。 + 关键词:www.youtube.com,即禁止访问任何包含关键词 www.youtube.com 的域名(子域名屏蔽)。 + 更多效果自行测试(如关键词 .zip 即可禁止下载任何 .zip 后缀的文件)。" && echo + fi + read -e -p "(回车默认取消):" key_word + [[ -z "${key_word}" ]] && echo "已取消..." && View_ALL && exit 0 +} +ENTER_Ban_KEY_WORDS_file(){ + echo -e "请输入欲封禁/解封的 关键词本地文件(请使用绝对路径)" && echo + read -e -p "(默认 读取脚本同目录下的 key_word.txt ):" key_word + [[ -z "${key_word}" ]] && key_word="key_word.txt" + if [[ -e "${key_word}" ]]; then + key_word=$(cat "${key_word}") + [[ -z ${key_word} ]] && echo -e "${Error} 文件内容为空 !" && View_ALL && exit 0 + else + echo -e "${Error} 没有找到文件 ${key_word} !" && View_ALL && exit 0 + fi +} +ENTER_Ban_KEY_WORDS_url(){ + echo -e "请输入欲封禁/解封的 关键词网络文件地址(例如 http://xxx.xx/key_word.txt)" && echo + read -e -p "(回车默认取消):" key_word + [[ -z "${key_word}" ]] && echo "已取消..." && View_ALL && exit 0 + key_word=$(wget --no-check-certificate -t3 -T5 -qO- "${key_word}") + [[ -z ${key_word} ]] && echo -e "${Error} 网络文件内容为空或访问超时 !" && View_ALL && exit 0 +} +ENTER_UnBan_KEY_WORDS(){ + View_KEY_WORDS + echo -e "请输入欲解封的 关键词(根据上面的列表输入完整准确的 关键词)" && echo + read -e -p "(回车默认取消):" key_word + [[ -z "${key_word}" ]] && echo "已取消..." && View_ALL && exit 0 +} +ENTER_UnBan_PORT(){ + echo -e "请输入欲解封的 端口(根据上面的列表输入完整准确的 端口,包括逗号、冒号)" && echo + read -e -p "(回车默认取消):" PORT + [[ -z "${PORT}" ]] && echo "已取消..." && View_ALL && exit 0 +} +Ban_PORT(){ + s="A" + ENTER_Ban_PORT + Set_PORT + echo -e "${Info} 已封禁端口 [ ${PORT} ] !\n" + Ban_PORT_Type_1="1" + while true + do + ENTER_Ban_PORT + Set_PORT + echo -e "${Info} 已封禁端口 [ ${PORT} ] !\n" + done + View_ALL +} +Ban_KEY_WORDS(){ + s="A" + ENTER_Ban_KEY_WORDS_type "ban" + Set_KEY_WORDS + echo -e "${Info} 已封禁关键词 [ ${key_word} ] !\n" + while true + do + ENTER_Ban_KEY_WORDS_type "ban" "ban_1" + Set_KEY_WORDS + echo -e "${Info} 已封禁关键词 [ ${key_word} ] !\n" + done + View_ALL +} +UnBan_PORT(){ + s="D" + View_PORT + [[ -z ${Ban_PORT_list} ]] && echo -e "${Error} 检测到未封禁任何 端口 !" && exit 0 + ENTER_UnBan_PORT + Set_PORT + echo -e "${Info} 已解封端口 [ ${PORT} ] !\n" + while true + do + View_PORT + [[ -z ${Ban_PORT_list} ]] && echo -e "${Error} 检测到未封禁任何 端口 !" && exit 0 + ENTER_UnBan_PORT + Set_PORT + echo -e "${Info} 已解封端口 [ ${PORT} ] !\n" + done + View_ALL +} +UnBan_KEY_WORDS(){ + s="D" + Cat_KEY_WORDS + [[ -z ${Ban_KEY_WORDS_list} ]] && echo -e "${Error} 检测到未封禁任何 关键词 !" && exit 0 + ENTER_Ban_KEY_WORDS_type "unban" + Set_KEY_WORDS + echo -e "${Info} 已解封关键词 [ ${key_word} ] !\n" + while true + do + Cat_KEY_WORDS + [[ -z ${Ban_KEY_WORDS_list} ]] && echo -e "${Error} 检测到未封禁任何 关键词 !" && exit 0 + ENTER_Ban_KEY_WORDS_type "unban" "ban_1" + Set_KEY_WORDS + echo -e "${Info} 已解封关键词 [ ${key_word} ] !\n" + done + View_ALL +} +UnBan_KEY_WORDS_ALL(){ + Cat_KEY_WORDS + [[ -z ${Ban_KEY_WORDS_text} ]] && echo -e "${Error} 检测到未封禁任何 关键词,请检查 !" && exit 0 + if [[ ! -z "${v6iptables}" ]]; then + Ban_KEY_WORDS_v6_num=$(echo -e "${Ban_KEY_WORDS_v6_list}"|wc -l) + for((integer = 1; integer <= ${Ban_KEY_WORDS_v6_num}; integer++)) + do + ${v6iptables} -t mangle -D OUTPUT 1 + done + fi + Ban_KEY_WORDS_num=$(echo -e "${Ban_KEY_WORDS_list}"|wc -l) + for((integer = 1; integer <= ${Ban_KEY_WORDS_num}; integer++)) + do + ${v4iptables} -t mangle -D OUTPUT 1 + done + Save_iptables_v4_v6 + View_ALL + echo -e "${Info} 已解封所有关键词 !" +} +check_iptables(){ + v4iptables=`iptables -V` + v6iptables=`ip6tables -V` + if [[ ! -z ${v4iptables} ]]; then + v4iptables="iptables" + if [[ ! -z ${v6iptables} ]]; then + v6iptables="ip6tables" + fi + else + echo -e "${Error} 未安装 iptables 防火墙 ! +请安装 iptables防火墙: +CentOS 系统:yum install iptables -y +Debian / Ubuntu 系统:apt-get install iptables -y" + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ban_iptables.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ban_iptables.sh" && chmod +x ban_iptables.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +check_iptables +action=$1 +if [[ ! -z $action ]]; then + [[ $action = "banbt" ]] && Ban_BT && exit 0 + [[ $action = "banspam" ]] && Ban_SPAM && exit 0 + [[ $action = "banall" ]] && Ban_ALL && exit 0 + [[ $action = "unbanbt" ]] && UnBan_BT && exit 0 + [[ $action = "unbanspam" ]] && UnBan_SPAM && exit 0 + [[ $action = "unbanall" ]] && UnBan_ALL && exit 0 +fi +echo && echo -e " iptables防火墙 封禁管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/shell-jc2 -- + + ${Green_font_prefix}0.${Font_color_suffix} 查看 当前封禁列表 +———————————— + ${Green_font_prefix}1.${Font_color_suffix} 封禁 BT、PT + ${Green_font_prefix}2.${Font_color_suffix} 封禁 SPAM(垃圾邮件) + ${Green_font_prefix}3.${Font_color_suffix} 封禁 BT、PT+SPAM + ${Green_font_prefix}4.${Font_color_suffix} 封禁 自定义 端口 + ${Green_font_prefix}5.${Font_color_suffix} 封禁 自定义关键词 +———————————— + ${Green_font_prefix}6.${Font_color_suffix} 解封 BT、PT + ${Green_font_prefix}7.${Font_color_suffix} 解封 SPAM(垃圾邮件) + ${Green_font_prefix}8.${Font_color_suffix} 解封 BT、PT+SPAM + ${Green_font_prefix}9.${Font_color_suffix} 解封 自定义 端口 + ${Green_font_prefix}10.${Font_color_suffix} 解封 自定义关键词 + ${Green_font_prefix}11.${Font_color_suffix} 解封 所有 关键词 +———————————— + ${Green_font_prefix}12.${Font_color_suffix} 升级脚本 +" && echo +read -e -p " 请输入数字 [0-12]:" num +case "$num" in + 0) + View_ALL + ;; + 1) + Ban_BT + ;; + 2) + Ban_SPAM + ;; + 3) + Ban_ALL + ;; + 4) + Ban_PORT + ;; + 5) + Ban_KEY_WORDS + ;; + 6) + UnBan_BT + ;; + 7) + UnBan_SPAM + ;; + 8) + UnBan_ALL + ;; + 9) + UnBan_PORT + ;; + 10) + UnBan_KEY_WORDS + ;; + 11) + UnBan_KEY_WORDS_ALL + ;; + 12) + Update_Shell + ;; + *) + echo "请输入正确数字 [0-12]" + ;; +esac \ No newline at end of file diff --git a/base64.sh b/base64.sh new file mode 100644 index 0000000..c8cabb8 --- /dev/null +++ b/base64.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" && Error="${Red_font_prefix}[错误]${Font_color_suffix}" && Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g;s/+/-/g;s/\//_/g') + echo -e "${date}" +} +urlsafe_base64_d(){ + date=$(echo -n "$1"|sed 's/-/+/g;s/_/\//g'|base64 -d) + echo -e "${date}" +} +set_type(){ + echo -e "你要干什么呢? + ${Green_font_prefix}1.${Font_color_suffix} URL_Safe_Base64 加密文本 + ${Green_font_prefix}2.${Font_color_suffix} URL_Safe_Base64 解密文本" + read -e -p "(默认:1):" enter_type + [[ -z "${enter_type}" ]] && enter_type="1" + if [[ ${enter_type} == "1" ]]; then + set_text "1" + elif [[ ${enter_type} == "2" ]]; then + set_text "2" + else + set_text "1" + fi +} +set_text(){ + echo "请输入要 URL_Safe_Base64 加密/解密 的文本" + read -e -p "(默认回车取消):" text + [[ -z "${text}" ]] && echo "已取消..." && exit 1 + [[ -z "${enter_type}" ]] && enter_type="1" + if [[ $1 == "1" ]]; then + echo && urlsafe_base64 "${text}" && echo + elif [[ $1 == "2" ]]; then + echo && urlsafe_base64_d "${text}" && echo + else + echo && urlsafe_base64 "${text}" && echo + fi +} +set_type \ No newline at end of file diff --git a/bbr.sh b/bbr.sh new file mode 100644 index 0000000..0ae53d3 --- /dev/null +++ b/bbr.sh @@ -0,0 +1,236 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: Debian/Ubuntu +# Description: TCP-BBR +# Version: 1.0.22 +# Author: Toyo +# Blog: https://doub.io/wlzy-16/ +#================================================= + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" +filepath=$(cd "$(dirname "$0")"; pwd) +file=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi +} +Set_latest_new_version(){ + echo -e "请输入 要下载安装的Linux内核版本(BBR) ${Green_font_prefix}[ 格式: x.xx.xx ,例如: 4.9.96 ]${Font_color_suffix} +${Tip} 内核版本列表请去这里获取:${Green_font_prefix}[ http://kernel.ubuntu.com/~kernel-ppa/mainline/ ]${Font_color_suffix} +建议使用${Green_font_prefix}稳定版本:4.9.XX ${Font_color_suffix},4.9 以上版本属于测试版,稳定版与测试版同步更新,BBR 加速效果无区别。" + read -e -p "(直接回车,自动获取最新稳定版本):" latest_version + [[ -z "${latest_version}" ]] && get_latest_new_version + echo +} +# 本段获取最新版本的代码来源自: https://teddysun.com/489.html +get_latest_new_version(){ + echo -e "${Info} 检测稳定版内核最新版本中..." + latest_version=$(wget -qO- -t1 -T2 "http://kernel.ubuntu.com/~kernel-ppa/mainline/" | awk -F'\"v' '/v4.9.*/{print $2}' |grep -v '\-rc'| cut -d/ -f1 | sort -V | tail -1) + [[ -z ${latest_version} ]] && echo -e "${Error} 检测内核最新版本失败 !" && exit 1 + echo -e "${Info} 稳定版内核最新版本为 : ${latest_version}" +} +get_latest_version(){ + Set_latest_new_version + bit=`uname -m` + if [[ ${bit} == "x86_64" ]]; then + deb_name=$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${latest_version}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1 ) + deb_kernel_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${latest_version}/${deb_name}" + deb_kernel_name="linux-image-${latest_version}-amd64.deb" + else + deb_name=$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${latest_version}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1) + deb_kernel_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${latest_version}/${deb_name}" + deb_kernel_name="linux-image-${latest_version}-i386.deb" + fi +} +#检查内核是否满足 +check_deb_off(){ + get_latest_new_version + deb_ver=`dpkg -l|grep linux-image | awk '{print $2}' | awk -F '-' '{print $3}' | grep '[4-9].[0-9]*.'` + latest_version_2=$(echo "${latest_version}"|grep -o '\.'|wc -l) + if [[ "${latest_version_2}" == "1" ]]; then + latest_version="${latest_version}.0" + fi + if [[ "${deb_ver}" != "" ]]; then + if [[ "${deb_ver}" == "${latest_version}" ]]; then + echo -e "${Info} 检测到当前内核版本[${deb_ver}] 已满足要求,继续..." + else + echo -e "${Tip} 检测到当前内核版本[${deb_ver}] 支持开启BBR 但不是最新内核版本,可以使用${Green_font_prefix} bash ${file}/bbr.sh ${Font_color_suffix}来升级内核 !(注意:并不是越新的内核越好,4.9 以上版本的内核 目前皆为测试版,不保证稳定性,旧版本如使用无问题 建议不要升级!)" + fi + else + echo -e "${Error} 检测到当前内核版本[${deb_ver}] 不支持开启BBR,请使用${Green_font_prefix} bash ${file}/bbr.sh ${Font_color_suffix}来更换最新内核 !" && exit 1 + fi +} +# 删除其余内核 +del_deb(){ + deb_total=`dpkg -l | grep linux-image | awk '{print $2}' | grep -v "${latest_version}" | wc -l` + if [[ "${deb_total}" -ge "1" ]]; then + echo -e "${Info} 检测到 ${deb_total} 个其余内核,开始卸载..." + for((integer = 1; integer <= ${deb_total}; integer++)) + do + deb_del=`dpkg -l|grep linux-image | awk '{print $2}' | grep -v "${latest_version}" | head -${integer}` + echo -e "${Info} 开始卸载 ${deb_del} 内核..." + apt-get purge -y ${deb_del} + echo -e "${Info} 卸载 ${deb_del} 内核卸载完成,继续..." + done + deb_total=`dpkg -l|grep linux-image | awk '{print $2}' | wc -l` + if [[ "${deb_total}" = "1" ]]; then + echo -e "${Info} 内核卸载完毕,继续..." + else + echo -e "${Error} 内核卸载异常,请检查 !" && exit 1 + fi + else + echo -e "${Info} 检测到除刚安装的内核以外已无多余内核,跳过卸载多余内核步骤 !" + fi +} +del_deb_over(){ + del_deb + update-grub + addsysctl + echo -e "${Tip} 重启VPS后,请运行脚本查看 BBR 是否正常加载,运行命令: ${Green_background_prefix} bash ${file}/bbr.sh status ${Font_color_suffix}" + read -e -p "需要重启VPS后,才能开启BBR,是否现在重启 ? [Y/n] :" yn + [[ -z "${yn}" ]] && yn="y" + if [[ $yn == [Yy] ]]; then + echo -e "${Info} VPS 重启中..." + reboot + fi +} +# 安装BBR +installbbr(){ + check_root + get_latest_version + deb_ver=`dpkg -l|grep linux-image | awk '{print $2}' | awk -F '-' '{print $3}' | grep '[4-9].[0-9]*.'` + latest_version_2=$(echo "${latest_version}"|grep -o '\.'|wc -l) + if [[ "${latest_version_2}" == "1" ]]; then + latest_version="${latest_version}.0" + fi + if [[ "${deb_ver}" != "" ]]; then + if [[ "${deb_ver}" == "${latest_version}" ]]; then + echo -e "${Info} 检测到当前内核版本[${deb_ver}] 已是最新版本,无需继续 !" + deb_total=`dpkg -l|grep linux-image | awk '{print $2}' | grep -v "${latest_version}" | wc -l` + if [[ "${deb_total}" != "0" ]]; then + echo -e "${Info} 检测到内核数量异常,存在多余内核,开始删除..." + del_deb_over + else + exit 1 + fi + else + echo -e "${Info} 检测到当前内核版本支持开启BBR 但不是最新内核版本,开始升级(或降级)内核..." + fi + else + echo -e "${Info} 检测到当前内核版本不支持开启BBR,开始..." + virt=`virt-what` + if [[ -z ${virt} ]]; then + apt-get update && apt-get install virt-what -y + virt=`virt-what` + fi + if [[ ${virt} == "openvz" ]]; then + echo -e "${Error} BBR 不支持 OpenVZ 虚拟化(不支持更换内核) !" && exit 1 + fi + fi + echo "nameserver 8.8.8.8" > /etc/resolv.conf + echo "nameserver 8.8.4.4" >> /etc/resolv.conf + + wget -O "${deb_kernel_name}" "${deb_kernel_url}" + if [[ -s ${deb_kernel_name} ]]; then + echo -e "${Info} 内核安装包下载成功,开始安装内核..." + dpkg -i ${deb_kernel_name} + rm -rf ${deb_kernel_name} + else + echo -e "${Error} 内核安装包下载失败,请检查 !" && exit 1 + fi + #判断内核是否安装成功 + deb_ver=`dpkg -l | grep linux-image | awk '{print $2}' | awk -F '-' '{print $3}' | grep "${latest_version}"` + if [[ "${deb_ver}" != "" ]]; then + echo -e "${Info} 检测到内核安装成功,开始卸载其余内核..." + del_deb_over + else + echo -e "${Error} 检测到内核安装失败,请检查 !" && exit 1 + fi +} +bbrstatus(){ + check_bbr_status_on=`sysctl net.ipv4.tcp_congestion_control | awk '{print $3}'` + if [[ "${check_bbr_status_on}" = "bbr" ]]; then + echo -e "${Info} 检测到 BBR 已开启 !" + # 检查是否启动BBR + check_bbr_status_off=`lsmod | grep bbr` + if [[ "${check_bbr_status_off}" = "" ]]; then + echo -e "${Error} 检测到 BBR 已开启但未正常启动,请尝试使用低版本内核(可能是存着兼容性问题,虽然内核配置中打开了BBR,但是内核加载BBR模块失败) !" + else + echo -e "${Info} 检测到 BBR 已开启并已正常启动 !" + fi + exit 1 + fi +} +addsysctl(){ + sed -i '/net\.core\.default_qdisc=fq/d' /etc/sysctl.conf + sed -i '/net\.ipv4\.tcp_congestion_control=bbr/d' /etc/sysctl.conf + + echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf + echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf + sysctl -p +} +startbbr(){ + check_deb_off + bbrstatus + addsysctl + sleep 1s + bbrstatus +} +# 关闭BBR +stopbbr(){ + check_deb_off + sed -i '/net\.core\.default_qdisc=fq/d' /etc/sysctl.conf + sed -i '/net\.ipv4\.tcp_congestion_control=bbr/d' /etc/sysctl.conf + sysctl -p + sleep 1s + + read -e -p "需要重启VPS后,才能彻底停止BBR,是否现在重启 ? [Y/n] :" yn + [[ -z "${yn}" ]] && yn="y" + if [[ $yn == [Yy] ]]; then + echo -e "${Info} VPS 重启中..." + reboot + fi +} +# 查看BBR状态 +statusbbr(){ + check_deb_off + bbrstatus + echo -e "${Error} BBR 未开启 !" +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && echo -e "${Error} 本脚本不支持当前系统 ${release} !" && exit 1 +action=$1 +[[ -z $1 ]] && action=install +case "$action" in + install|start|stop|status) + ${action}bbr + ;; + *) + echo "输入错误 !" + echo "用法: { install | start | stop | status }" + ;; +esac \ No newline at end of file diff --git a/brook-pf.sh b/brook-pf.sh new file mode 100644 index 0000000..45989b2 --- /dev/null +++ b/brook-pf.sh @@ -0,0 +1,710 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: Brook +# Version: 1.0.6 +# Author: Toyo +# Blog: https://doub.io/wlzy-jc37/ +#================================================= + +sh_ver="1.0.6" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +file="/usr/local/brook-pf" +brook_file="/usr/local/brook-pf/brook" +brook_conf="/usr/local/brook-pf/brook.conf" +brook_log="/usr/local/brook-pf/brook.log" +Crontab_file="/usr/bin/crontab" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${brook_file} ]] && echo -e "${Error} Brook 没有安装,请检查 !" && exit 1 +} +check_crontab_installed_status(){ + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 没有安装,开始安装..." + if [[ ${release} == "centos" ]]; then + yum install crond -y + else + apt-get install cron -y + fi + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 安装失败,请检查!" && exit 1 + else + echo -e "${Info} Crontab 安装成功!" + fi + fi +} +check_pid(){ + PID=$(ps -ef| grep "brook relays"| grep -v grep| grep -v ".sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}') +} +check_new_ver(){ + echo -e "请输入要下载安装的 Brook 版本号 ${Green_font_prefix}[ 格式是日期,例如: v20180909 ]${Font_color_suffix} +版本列表请去这里获取:${Green_font_prefix}[ https://github.com/txthinking/brook/releases ]${Font_color_suffix}" + read -e -p "直接回车即自动获取:" brook_new_ver + if [[ -z ${brook_new_ver} ]]; then + brook_new_ver=$(wget -qO- https://api.github.com/repos/txthinking/brook/releases| grep "tag_name"| head -n 1| awk -F ":" '{print $2}'| sed 's/\"//g;s/,//g;s/ //g') + [[ -z ${brook_new_ver} ]] && echo -e "${Error} Brook 最新版本获取失败!" && exit 1 + echo -e "${Info} 检测到 Brook 最新版本为 [ ${brook_new_ver} ]" + else + echo -e "${Info} 开始下载 Brook [ ${brook_new_ver} ] 版本!" + fi +} +check_ver_comparison(){ + brook_now_ver=$(${brook_file} -v|awk '{print $3}') + [[ -z ${brook_now_ver} ]] && echo -e "${Error} Brook 当前版本获取失败 !" && exit 1 + brook_now_ver="v${brook_now_ver}" + if [[ "${brook_now_ver}" != "${brook_new_ver}" ]]; then + echo -e "${Info} 发现 Brook 已有新版本 [ ${brook_new_ver} ],旧版本 [ ${brook_now_ver} ]" + read -e -p "是否更新 ? [Y/n] :" yn + [[ -z "${yn}" ]] && yn="y" + if [[ $yn == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + rm -rf ${brook_file} + Download_brook + Start_brook + fi + else + echo -e "${Info} 当前 Brook 已是最新版本 [ ${brook_new_ver} ]" && exit 1 + fi +} +Download_brook(){ + [[ ! -e ${file} ]] && mkdir ${file} + cd ${file} + if [[ ${bit} == "x86_64" ]]; then + wget --no-check-certificate -N "https://github.com/txthinking/brook/releases/download/${brook_new_ver}/brook" + else + wget --no-check-certificate -N "https://github.com/txthinking/brook/releases/download/${brook_new_ver}/brook_linux_386" + mv brook_linux_386 brook + fi + [[ ! -e "brook" ]] && echo -e "${Error} Brook 下载失败 !" && exit 1 + chmod +x brook +} +Service_brook(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/brook-pf_centos -O /etc/init.d/brook-pf; then + echo -e "${Error} Brook服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/brook-pf + chkconfig --add brook-pf + chkconfig brook-pf on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/brook-pf_debian -O /etc/init.d/brook-pf; then + echo -e "${Error} Brook服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/brook-pf + update-rc.d -f brook-pf defaults + fi + echo -e "${Info} Brook服务 管理脚本下载完成 !" +} +Installation_dependency(){ + \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +} +Read_config(){ + [[ ! -e ${brook_conf} ]] && echo -e "${Error} Brook 配置文件不存在 !" && exit 1 + user_all=$(cat ${brook_conf}) + user_all_num=$(echo "${user_all}"|wc -l) + [[ -z ${user_all} ]] && echo -e "${Error} Brook 配置文件中用户配置为空 !" && exit 1 +} +Set_pf_Enabled(){ + echo -e "立即启用该端口转发,还是禁用? [Y/n]" + read -e -p "(默认: Y 启用):" pf_Enabled_un + [[ -z ${pf_Enabled_un} ]] && pf_Enabled_un="y" + if [[ ${pf_Enabled_un} == [Yy] ]]; then + bk_Enabled="1" + else + bk_Enabled="0" + fi +} +Set_port_Modify(){ + while true + do + echo -e "请选择并输入要修改的 Brook 端口转发本地监听端口 [1-65535]" + read -e -p "(默认取消):" bk_port_Modify + [[ -z "${bk_port_Modify}" ]] && echo "取消..." && exit 1 + echo $((${bk_port_Modify}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${bk_port_Modify} -ge 1 ]] && [[ ${bk_port_Modify} -le 65535 ]]; then + check_port "${bk_port_Modify}" + if [[ $? == 0 ]]; then + break + else + echo -e "${Error} 该本地监听端口不存在 [${bk_port_Modify}] !" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_port(){ + while true + do + echo -e "请输入 Brook 本地监听端口 [1-65535](端口不能重复,避免冲突)" + read -e -p "(默认取消):" bk_port + [[ -z "${bk_port}" ]] && echo "已取消..." && exit 1 + echo $((${bk_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${bk_port} -ge 1 ]] && [[ ${bk_port} -le 65535 ]]; then + echo && echo "========================" + echo -e " 本地监听端口 : ${Red_background_prefix} ${bk_port} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_IP_pf(){ + echo "请输入被转发的 IP :" + read -e -p "(默认取消):" bk_ip_pf + [[ -z "${bk_ip_pf}" ]] && echo "已取消..." && exit 1 + echo && echo "========================" + echo -e " 被转发IP : ${Red_background_prefix} ${bk_ip_pf} ${Font_color_suffix}" + echo "========================" && echo +} +Set_port_pf(){ + while true + do + echo -e "请输入 Brook 被转发的端口 [1-65535]" + read -e -p "(默认取消):" bk_port_pf + [[ -z "${bk_port_pf}" ]] && echo "已取消..." && exit 1 + echo $((${bk_port_pf}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${bk_port_pf} -ge 1 ]] && [[ ${bk_port_pf} -le 65535 ]]; then + echo && echo "========================" + echo -e " 被转发端口 : ${Red_background_prefix} ${bk_port_pf} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_brook(){ + check_installed_status + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 添加 端口转发 + ${Green_font_prefix}2.${Font_color_suffix} 删除 端口转发 + ${Green_font_prefix}3.${Font_color_suffix} 修改 端口转发 + ${Green_font_prefix}4.${Font_color_suffix} 启用/禁用 端口转发 + + ${Tip} 本地监听端口不能重复,被转发的IP或端口可重复!" && echo + read -e -p "(默认: 取消):" bk_modify + [[ -z "${bk_modify}" ]] && echo "已取消..." && exit 1 + if [[ ${bk_modify} == "1" ]]; then + Add_pf + elif [[ ${bk_modify} == "2" ]]; then + Del_pf + elif [[ ${bk_modify} == "3" ]]; then + Modify_pf + elif [[ ${bk_modify} == "4" ]]; then + Modify_Enabled_pf + else + echo -e "${Error} 请输入正确的数字(1-4)" && exit 1 + fi +} +check_port(){ + check_port_1=$1 + user_all=$(cat ${brook_conf}|sed '1d;/^\s*$/d') + #[[ -z "${user_all}" ]] && echo -e "${Error} Brook 配置文件中用户配置为空 !" && exit 1 + check_port_statu=$(echo "${user_all}"|awk '{print $1}'|grep -w "${check_port_1}") + if [[ ! -z "${check_port_statu}" ]]; then + return 0 + else + return 1 + fi +} +list_port(){ + port_Type=$1 + user_all=$(cat ${brook_conf}|sed '/^\s*$/d') + if [[ -z "${user_all}" ]]; then + if [[ "${port_Type}" == "ADD" ]]; then + echo -e "${Info} 目前 Brook 配置文件中用户配置为空。" + else + echo -e "${Info} 目前 Brook 配置文件中用户配置为空。" && exit 1 + fi + else + user_num=$(echo -e "${user_all}"|wc -l) + for((integer = 1; integer <= ${user_num}; integer++)) + do + user_port=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $1}') + user_ip_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $2}') + user_port_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $3}') + user_Enabled_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $4}') + if [[ ${user_Enabled_pf} == "0" ]]; then + user_Enabled_pf_1="${Red_font_prefix}禁用${Font_color_suffix}" + else + user_Enabled_pf_1="${Green_font_prefix}启用${Font_color_suffix}" + fi + user_list_all=${user_list_all}"本地监听端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 被转发IP: ${Green_font_prefix}"${user_ip_pf}"${Font_color_suffix}\t 被转发端口: ${Green_font_prefix}"${user_port_pf}"${Font_color_suffix}\t 状态: ${user_Enabled_pf_1}\n" + user_IP="" + done + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi + echo -e "当前端口转发总数: ${Green_background_prefix} "${user_num}" ${Font_color_suffix} 当前服务器IP: ${Green_background_prefix} "${ip}" ${Font_color_suffix}" + echo -e "${user_list_all}" + echo -e "========================\n" + fi +} +Add_pf(){ + while true + do + list_port "ADD" + Set_port + check_port "${bk_port}" + [[ $? == 0 ]] && echo -e "${Error} 该本地监听端口已使用 [${bk_port}] !" && exit 1 + Set_IP_pf + Set_port_pf + Set_pf_Enabled + echo "${bk_port} ${bk_ip_pf} ${bk_port_pf} ${bk_Enabled}" >> ${brook_conf} + Add_success=$(cat ${brook_conf}| grep ${bk_port}) + if [[ -z "${Add_success}" ]]; then + echo -e "${Error} 端口转发 添加失败 ${Green_font_prefix}[端口: ${bk_port} 被转发IP和端口: ${bk_ip_pf}:${bk_port_pf}]${Font_color_suffix} " + break + else + Add_iptables + Save_iptables + echo -e "${Info} 端口转发 添加成功 ${Green_font_prefix}[端口: ${bk_port} 被转发IP和端口: ${bk_ip_pf}:${bk_port_pf}]${Font_color_suffix}\n" + read -e -p "是否继续 添加端口转发配置?[Y/n]:" addyn + [[ -z ${addyn} ]] && addyn="y" + if [[ ${addyn} == [Nn] ]]; then + Restart_brook + break + else + echo -e "${Info} 继续 添加端口转发配置..." + user_list_all="" + fi + fi + done +} +Del_pf(){ + while true + do + list_port + Set_port + check_port "${bk_port}" + [[ $? == 1 ]] && echo -e "${Error} 该本地监听端口不存在 [${bk_port}] !" && exit 1 + sed -i "/^${bk_port} /d" ${brook_conf} + Del_success=$(cat ${brook_conf}| grep ${bk_port}) + if [[ ! -z "${Del_success}" ]]; then + echo -e "${Error} 端口转发 删除失败 ${Green_font_prefix}[端口: ${bk_port}]${Font_color_suffix} " + break + else + port=${bk_port} + Del_iptables + Save_iptables + echo -e "${Info} 端口转发 删除成功 ${Green_font_prefix}[端口: ${bk_port}]${Font_color_suffix}\n" + port_num=$(cat ${brook_conf}|sed '/^\s*$/d'|wc -l) + if [[ ${port_num} == 0 ]]; then + echo -e "${Error} 已无任何端口 !" + check_pid + if [[ ! -z ${PID} ]]; then + Stop_brook + fi + break + else + read -e -p "是否继续 删除端口转发配置?[Y/n]:" delyn + [[ -z ${delyn} ]] && delyn="y" + if [[ ${delyn} == [Nn] ]]; then + Restart_brook + break + else + echo -e "${Info} 继续 删除端口转发配置..." + user_list_all="" + fi + fi + fi + done +} +Modify_pf(){ + list_port + Set_port_Modify + echo -e "\n${Info} 开始输入新端口... \n" + Set_port + check_port "${bk_port}" + [[ $? == 0 ]] && echo -e "${Error} 该端口已存在 [${bk_port}] !" && exit 1 + Set_IP_pf + Set_port_pf + sed -i "/^${bk_port_Modify} /d" ${brook_conf} + Set_pf_Enabled + echo "${bk_port} ${bk_ip_pf} ${bk_port_pf} ${bk_Enabled}" >> ${brook_conf} + Modify_success=$(cat ${brook_conf}| grep "${bk_port} ${bk_ip_pf} ${bk_port_pf} ${bk_Enabled}") + if [[ -z "${Modify_success}" ]]; then + echo -e "${Error} 端口转发 修改失败 ${Green_font_prefix}[端口: ${bk_port} 被转发IP和端口: ${bk_ip_pf}:${bk_port_pf}]${Font_color_suffix}" + exit 1 + else + port=${bk_port_Modify} + Del_iptables + Add_iptables + Save_iptables + Restart_brook + echo -e "${Info} 端口转发 修改成功 ${Green_font_prefix}[端口: ${bk_port} 被转发IP和端口: ${bk_ip_pf}:${bk_port_pf}]${Font_color_suffix}\n" + fi +} +Modify_Enabled_pf(){ + list_port + Set_port_Modify + user_pf_text=$(cat ${brook_conf}|sed '/^\s*$/d'|grep "${bk_port_Modify}") + user_port_text=$(echo ${user_pf_text}|awk '{print $1}') + user_ip_pf_text=$(echo ${user_pf_text}|awk '{print $2}') + user_port_pf_text=$(echo ${user_pf_text}|awk '{print $3}') + user_Enabled_pf_text=$(echo ${user_pf_text}|awk '{print $4}') + if [[ ${user_Enabled_pf_text} == "0" ]]; then + echo -e "该端口转发已${Red_font_prefix}禁用${Font_color_suffix},是否${Green_font_prefix}启用${Font_color_suffix}? [Y/n]" + read -e -p "(默认: Y 启用):" user_Enabled_pf_text_un + [[ -z ${user_Enabled_pf_text_un} ]] && user_Enabled_pf_text_un="y" + if [[ ${user_Enabled_pf_text_un} == [Yy] ]]; then + user_Enabled_pf_text_1="1" + sed -i "/^${bk_port_Modify} /d" ${brook_conf} + echo "${user_port_text} ${user_ip_pf_text} ${user_port_pf_text} ${user_Enabled_pf_text_1}" >> ${brook_conf} + Modify_Enabled_success=$(cat ${brook_conf}| grep "${user_port_text} ${user_ip_pf_text} ${user_port_pf_text} ${user_Enabled_pf_text_1}") + if [[ -z "${Modify_Enabled_success}" ]]; then + echo -e "${Error} 端口转发 启用失败 ${Green_font_prefix}[端口: ${user_port_text} 被转发IP和端口: ${user_ip_pf_text}:${user_port_pf_text}]${Font_color_suffix}" + exit 1 + else + echo -e "${Info} 端口转发 启用成功 ${Green_font_prefix}[端口: ${user_port_text} 被转发IP和端口: ${user_ip_pf_text}:${user_port_pf_text}]${Font_color_suffix}\n" + Restart_brook + fi + else + echo "已取消..." && exit 0 + fi + else + echo -e "该端口转发已${Green_font_prefix}启用${Font_color_suffix},是否${Red_font_prefix}禁用${Font_color_suffix}? [Y/n]" + read -e -p "(默认: Y 禁用):" user_Enabled_pf_text_un + [[ -z ${user_Enabled_pf_text_un} ]] && user_Enabled_pf_text_un="y" + if [[ ${user_Enabled_pf_text_un} == [Yy] ]]; then + user_Enabled_pf_text_1="0" + sed -i "/^${bk_port_Modify} /d" ${brook_conf} + echo "${user_port_text} ${user_ip_pf_text} ${user_port_pf_text} ${user_Enabled_pf_text_1}" >> ${brook_conf} + Modify_Enabled_success=$(cat ${brook_conf}| grep "${user_port_text} ${user_ip_pf_text} ${user_port_pf_text} ${user_Enabled_pf_text_1}") + if [[ -z "${Modify_Enabled_success}" ]]; then + echo -e "${Error} 端口转发 禁用失败 ${Green_font_prefix}[端口: ${user_port_text} 被转发IP和端口: ${user_ip_pf_text}:${user_port_pf_text}]${Font_color_suffix}" + exit 1 + else + echo -e "${Info} 端口转发 禁用成功 ${Green_font_prefix}[端口: ${user_port_text} 被转发IP和端口: ${user_ip_pf_text}:${user_port_pf_text}]${Font_color_suffix}\n" + Restart_brook + fi + else + echo "已取消..." && exit 0 + fi + fi +} +Install_brook(){ + check_root + [[ -e ${brook_file} ]] && echo -e "${Error} 检测到 Brook 已安装 !" && exit 1 + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始检测最新版本..." + check_new_ver + echo -e "${Info} 开始下载/安装..." + Download_brook + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_brook + echo -e "${Info} 开始写入 配置文件..." + echo "" > ${brook_conf} + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} Brook 安装完成!默认配置文件为空,请选择 [7.设置 Brook 端口转发 - 1.添加 端口转发] 来添加端口转发。" +} +Start_brook(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} Brook 正在运行,请检查 !" && exit 1 + /etc/init.d/brook-pf start +} +Stop_brook(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} Brook 没有运行,请检查 !" && exit 1 + /etc/init.d/brook-pf stop +} +Restart_brook(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/brook-pf stop + /etc/init.d/brook-pf start +} +Update_brook(){ + check_installed_status + echo && echo -e "请选择你的服务器是国内还是国外 + ${Green_font_prefix}1.${Font_color_suffix} 国内服务器(逗比云) + ${Green_font_prefix}2.${Font_color_suffix} 国外服务器(Github) + + ${Tip} 因为国内对 Github 限速,这会导致国内服务器下载速度极慢,所以选择 国内服务器 选项就会从我的 逗比云 下载!" && echo + read -e -p "(默认: 2 国外服务器):" bk_Download + [[ -z "${bk_Download}" ]] && bk_Download="2" + if [[ ${bk_Download} == "1" ]]; then + Download_type="1" + else + Download_type="2" + fi + check_new_ver + check_ver_comparison +} +Uninstall_brook(){ + check_installed_status + echo -e "确定要卸载 Brook ? [y/N]\n" + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + if [[ -e ${brook_conf} ]]; then + user_all=$(cat ${brook_conf}|sed '/^\s*$/d') + user_all_num=$(echo "${user_all}"|wc -l) + if [[ ! -z ${user_all} ]]; then + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + port=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $1}') + Del_iptables + done + Save_iptables + fi + fi + if [[ ! -z $(crontab -l | grep "brook-pf.sh monitor") ]]; then + crontab_monitor_brook_cron_stop + fi + rm -rf ${file} + if [[ ${release} = "centos" ]]; then + chkconfig --del brook-pf + else + update-rc.d -f brook-pf remove + fi + rm -rf /etc/init.d/brook-pf + echo && echo "Brook 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +View_Log(){ + check_installed_status + [[ ! -e ${brook_log} ]] && echo -e "${Error} Brook 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志(正常情况是没有使用日志记录的)" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${brook_log}${Font_color_suffix} 命令。" && echo + tail -f ${brook_log} +} +Set_crontab_monitor_brook(){ + check_installed_status + check_crontab_installed_status + crontab_monitor_brook_status=$(crontab -l|grep "brook-pf.sh monitor") + if [[ -z "${crontab_monitor_brook_status}" ]]; then + echo && echo -e "当前监控模式: ${Green_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}Brook 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 Brook 服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_brook_status_ny + [[ -z "${crontab_monitor_brook_status_ny}" ]] && crontab_monitor_brook_status_ny="y" + if [[ ${crontab_monitor_brook_status_ny} == [Yy] ]]; then + crontab_monitor_brook_cron_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Green_font_prefix}Brook 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 Brook 服务端)[y/N]" + read -e -p "(默认: n):" crontab_monitor_brook_status_ny + [[ -z "${crontab_monitor_brook_status_ny}" ]] && crontab_monitor_brook_status_ny="n" + if [[ ${crontab_monitor_brook_status_ny} == [Yy] ]]; then + crontab_monitor_brook_cron_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_brook_cron_start(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/brook-pf.sh monitor/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/brook-pf.sh monitor" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "brook-pf.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Brook 服务端运行状态监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} Brook 服务端运行状态监控功能 启动成功 !" + fi +} +crontab_monitor_brook_cron_stop(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/brook-pf.sh monitor/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "brook-pf.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Brook 服务端运行状态监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} Brook 服务端运行状态监控功能 停止成功 !" + fi +} +crontab_monitor_brook(){ + check_installed_status + check_pid + echo "${PID}" + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 Brook服务端 未运行 , 开始启动..." | tee -a ${brook_log} + /etc/init.d/brook-pf start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Brook服务端 启动失败..." | tee -a ${brook_log} + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Brook服务端 启动成功..." | tee -a ${brook_log} + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Brook服务端 进程运行正常..." | tee -a ${brook_log} + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${bk_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${bk_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/brook-pf.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/brook-pf" ]]; then + rm -rf /etc/init.d/brook-pf + Service_brook + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/brook-pf.sh" && chmod +x brook.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +action=$1 +if [[ "${action}" == "monitor" ]]; then + crontab_monitor_brook +else + echo && echo -e " Brook 端口转发 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/wlzy-jc37 ---- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 Brook + ${Green_font_prefix} 2.${Font_color_suffix} 更新 Brook + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 Brook +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 Brook + ${Green_font_prefix} 5.${Font_color_suffix} 停止 Brook + ${Green_font_prefix} 6.${Font_color_suffix} 重启 Brook +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 Brook 端口转发 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 Brook 端口转发 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 Brook 日志 + ${Green_font_prefix}10.${Font_color_suffix} 监控 Brook 运行状态 +————————————" && echo +if [[ -e ${brook_file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-10]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_brook + ;; + 2) + Update_brook + ;; + 3) + Uninstall_brook + ;; + 4) + Start_brook + ;; + 5) + Stop_brook + ;; + 6) + Restart_brook + ;; + 7) + Set_brook + ;; + 8) + check_installed_status + list_port + ;; + 9) + View_Log + ;; + 10) + Set_crontab_monitor_brook + ;; + *) + echo "请输入正确数字 [0-10]" + ;; +esac +fi \ No newline at end of file diff --git a/brook.sh b/brook.sh new file mode 100644 index 0000000..d94c8f6 --- /dev/null +++ b/brook.sh @@ -0,0 +1,760 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: Brook +# Version: 1.1.13 +# Author: Toyo +# Blog: https://doub.io/brook-jc3/ +#================================================= + +sh_ver="1.1.13" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +file="/usr/local/brook" +brook_file="/usr/local/brook/brook" +brook_conf="/usr/local/brook/brook.conf" +brook_log="/usr/local/brook/brook.log" +Crontab_file="/usr/bin/crontab" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${brook_file} ]] && echo -e "${Error} Brook 没有安装,请检查 !" && exit 1 +} +check_crontab_installed_status(){ + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 没有安装,开始安装..." + if [[ ${release} == "centos" ]]; then + yum install crond -y + else + apt-get install cron -y + fi + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 安装失败,请检查!" && exit 1 + else + echo -e "${Info} Crontab 安装成功!" + fi + fi +} +check_pid(){ + PID=$(ps -ef| grep "./brook "| grep -v "grep" | grep -v "brook.sh" | grep -v "init.d" |grep -v "service" |awk '{print $2}') +} +check_new_ver(){ + echo -e "请输入要下载安装的 Brook 版本号 ${Green_font_prefix}[ 格式是日期,例如: v20180707 ]${Font_color_suffix} +版本列表请去这里获取:${Green_font_prefix}[ https://github.com/txthinking/brook/releases ]${Font_color_suffix}" + read -e -p "直接回车即自动获取:" brook_new_ver + if [[ -z ${brook_new_ver} ]]; then + brook_new_ver=$(wget -qO- https://api.github.com/repos/txthinking/brook/releases| grep "tag_name"| head -n 1| awk -F ":" '{print $2}'| sed 's/\"//g;s/,//g;s/ //g') + [[ -z ${brook_new_ver} ]] && echo -e "${Error} Brook 最新版本获取失败!" && exit 1 + echo -e "${Info} 检测到 Brook 最新版本为 [ ${brook_new_ver} ]" + else + echo -e "${Info} 开始下载 Brook [ ${brook_new_ver} ] 版本!" + fi +} +check_ver_comparison(){ + brook_now_ver=$(${brook_file} -v|awk '{print $3}') + [[ -z ${brook_now_ver} ]] && echo -e "${Error} Brook 当前版本获取失败 !" && exit 1 + brook_now_ver="v${brook_now_ver}" + if [[ "${brook_now_ver}" != "${brook_new_ver}" ]]; then + echo -e "${Info} 发现 Brook 已有新版本 [ ${brook_new_ver} ],旧版本 [ ${brook_now_ver} ]" + read -e -p "是否更新 ? [Y/n] :" yn + [[ -z "${yn}" ]] && yn="y" + if [[ $yn == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + rm -rf ${brook_file} + Download_brook + Start_brook + fi + else + echo -e "${Info} 当前 Brook 已是最新版本 [ ${brook_new_ver} ]" && exit 1 + fi +} +Download_brook(){ + [[ ! -e ${file} ]] && mkdir ${file} + cd ${file} + if [[ ${bit} == "x86_64" ]]; then + wget --no-check-certificate -N "https://github.com/txthinking/brook/releases/download/${brook_new_ver}/brook" + else + wget --no-check-certificate -N "https://github.com/txthinking/brook/releases/download/${brook_new_ver}/brook_linux_386" + mv brook_linux_386 brook + fi + [[ ! -e "brook" ]] && echo -e "${Error} Brook 下载失败 !" && rm -rf "${file}" && exit 1 + chmod +x brook +} +Service_brook(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/brook_centos" -O /etc/init.d/brook; then + echo -e "${Error} Brook服务 管理脚本下载失败 !" && rm -rf "${file}" && exit 1 + fi + chmod +x "/etc/init.d/brook" + chkconfig --add brook + chkconfig brook on + else + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/brook_debian" -O /etc/init.d/brook; then + echo -e "${Error} Brook服务 管理脚本下载失败 !" && rm -rf "${file}" && exit 1 + fi + chmod +x "/etc/init.d/brook" + update-rc.d -f brook defaults + fi + echo -e "${Info} Brook服务 管理脚本下载完成 !" +} +Installation_dependency(){ + if [[ ${release} == "centos" ]]; then + Centos_yum + else + Debian_apt + fi + \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +} +Centos_yum(){ + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + yum update + yum install -y net-tools + fi +} +Debian_apt(){ + cat /etc/issue |grep 9\..*>/dev/null + if [[ $? = 0 ]]; then + apt-get update + apt-get install -y net-tools + fi +} +Write_config(){ + cat > ${brook_conf}<<-EOF +${bk_protocol} +${bk_port} ${bk_passwd} +EOF +} +Read_config(){ + [[ ! -e ${brook_conf} ]] && echo -e "${Error} Brook 配置文件不存在 !" && exit 1 + user_all=$(cat ${brook_conf}|sed "1d") + user_all_num=$(echo "${user_all}"|wc -l) + [[ -z ${user_all} ]] && echo -e "${Error} Brook 配置文件中用户配置为空 !" && exit 1 + protocol=$(cat ${brook_conf}|sed -n "1p") +} +Set_port_Modify(){ + while true + do + echo -e "请选择并输入要修改的 Brook 账号端口 [1-65535]" + read -e -p "(默认取消):" bk_port_Modify + [[ -z "${bk_port_Modify}" ]] && echo "取消..." && exit 1 + echo $((${bk_port_Modify}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${bk_port_Modify} -ge 1 ]] && [[ ${bk_port_Modify} -le 65535 ]]; then + check_port "${bk_port_Modify}" + if [[ $? == 0 ]]; then + break + else + echo -e "${Error} 该端口不存在 [${bk_port_Modify}] !" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_port(){ + while true + do + echo -e "请输入 Brook 端口 [1-65535](端口不能重复,避免冲突)" + read -e -p "(默认: 2333):" bk_port + [[ -z "${bk_port}" ]] && bk_port="2333" + echo $((${bk_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${bk_port} -ge 1 ]] && [[ ${bk_port} -le 65535 ]]; then + echo && echo "========================" + echo -e " 端口 : ${Red_background_prefix} ${bk_port} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_passwd(){ + echo "请输入 Brook 密码(因分享链接特性,密码请勿包含 % 符号)" + read -e -p "(默认: doub.io):" bk_passwd + [[ -z "${bk_passwd}" ]] && bk_passwd="doub.io" + echo && echo "========================" + echo -e " 密码 : ${Red_background_prefix} ${bk_passwd} ${Font_color_suffix}" + echo "========================" && echo +} +Set_protocol(){ + echo -e "请选择 Brook 协议 + ${Green_font_prefix}1.${Font_color_suffix} Brook(新版协议,即 [servers]) + ${Green_font_prefix}2.${Font_color_suffix} Brook Stream(旧版协议,即 [streamservers],不推荐,除非使用新版协议速度慢)" && echo + read -e -p "(默认: 1. Brook(新版协议)):" bk_protocol + [[ -z "${bk_protocol}" ]] && bk_protocol="1" + if [[ ${bk_protocol} == "1" ]]; then + bk_protocol="servers" + elif [[ ${bk_protocol} == "2" ]]; then + bk_protocol="streamservers" + else + bk_protocol="servers" + fi + echo && echo "========================" + echo -e " 协议 : ${Green_font_prefix}${bk_protocol}${Font_color_suffix}" + echo "========================" && echo +} +Set_brook(){ + check_installed_status + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 添加 用户配置 + ${Green_font_prefix}2.${Font_color_suffix} 删除 用户配置 + ${Green_font_prefix}3.${Font_color_suffix} 修改 用户配置 + ${Green_font_prefix}4.${Font_color_suffix} 修改 混淆协议 +———————————————— + ${Green_font_prefix}5.${Font_color_suffix} 监控 运行状态 + + ${Tip} 用户的端口是不能重复的,密码可以重复 !" && echo + read -e -p "(默认: 取消):" bk_modify + [[ -z "${bk_modify}" ]] && echo "已取消..." && exit 1 + if [[ ${bk_modify} == "1" ]]; then + Add_port_user + elif [[ ${bk_modify} == "2" ]]; then + Del_port_user + elif [[ ${bk_modify} == "3" ]]; then + Modify_port_user + elif [[ ${bk_modify} == "4" ]]; then + Modify_protocol + elif [[ ${bk_modify} == "5" ]]; then + Set_crontab_monitor_brook + else + echo -e "${Error} 请输入正确的数字(1-5)" && exit 1 + fi +} +check_port(){ + check_port_1=$1 + user_all=$(cat ${brook_conf}|sed '1d;/^\s*$/d') + #[[ -z "${user_all}" ]] && echo -e "${Error} Brook 配置文件中用户配置为空 !" && exit 1 + check_port_statu=$(echo "${user_all}"|awk '{print $1}'|grep -w "${check_port_1}") + if [[ ! -z "${check_port_statu}" ]]; then + return 0 + else + return 1 + fi +} +list_port(){ + port_Type=$1 + user_all=$(cat ${brook_conf}|sed '1d;/^\s*$/d') + if [[ -z "${user_all}" ]]; then + if [[ "${port_Type}" != "ADD" ]]; then + echo -e "${Error} Brook 配置文件中用户配置为空 !" && exit 1 + fi + fi + port_all_1=$(echo "${user_all}"|awk '{print $1}') + echo -e "\n当前所有已使用端口:\n${port_all_1}\n========================\n" +} +Add_port_user(){ + list_port "ADD" + Set_port + check_port "${bk_port}" + [[ $? == 0 ]] && echo -e "${Error} 该端口已存在 [${bk_port}] !" && exit 1 + Set_passwd + echo "${bk_port} ${bk_passwd}" >> ${brook_conf} + Add_iptables + Save_iptables + Restart_brook +} +Del_port_user(){ + list_port + Set_port + check_port "${bk_port}" + [[ $? == 1 ]] && echo -e "${Error} 该端口不存在 [${bk_port}] !" && exit 1 + sed -i "/^${bk_port} /d" ${brook_conf} + port=${bk_port} + Del_iptables + Save_iptables + port_num=$(cat ${brook_conf}|sed '1d;/^\s*$/d'|wc -l) + if [[ ${port_num} == 0 ]]; then + echo -e "${Error} 已无任何端口 !" + Stop_brook + else + Restart_brook + fi +} +Modify_port_user(){ + list_port + Set_port_Modify + echo -e "\n${Info} 开始输入新端口... \n" + Set_port + check_port "${bk_port}" + if [[ $? == 0 ]]; then + if [[ "${bk_port_Modify}" != "${bk_port}" ]]; then + echo -e "${Error} 该端口已存在 [${bk_port}] !" && exit 1 + fi + fi + Set_passwd + sed -i "/^${bk_port_Modify} /d" ${brook_conf} + echo "${bk_port} ${bk_passwd}" >> ${brook_conf} + port=${bk_port_Modify} + Del_iptables + Add_iptables + Save_iptables + Restart_brook +} +Modify_protocol(){ + Set_protocol + sed -i "1d" ${brook_conf} + sed -i '1i\'${bk_protocol} ${brook_conf} + Restart_brook +} +Install_brook(){ + check_root + [[ -e ${brook_file} ]] && echo -e "${Error} 检测到 Brook 已安装 !" && exit 1 + echo -e "${Info} 开始设置 用户配置..." + Set_port + Set_passwd + Set_protocol + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始检测最新版本..." + check_new_ver + echo -e "${Info} 开始下载/安装..." + Download_brook + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_brook + echo -e "${Info} 开始写入 配置文件..." + Write_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_brook +} +Start_brook(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} Brook 正在运行,请检查 !" && exit 1 + /etc/init.d/brook start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View_brook +} +Stop_brook(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} Brook 没有运行,请检查 !" && exit 1 + /etc/init.d/brook stop +} +Restart_brook(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/brook stop + /etc/init.d/brook start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View_brook +} +Update_brook(){ + check_installed_status + check_new_ver + check_ver_comparison +} +Uninstall_brook(){ + check_installed_status + echo "确定要卸载 Brook ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + if [[ -e ${brook_conf} ]]; then + user_all=$(cat ${brook_conf}|sed "1d") + user_all_num=$(echo "${user_all}"|wc -l) + if [[ ! -z ${user_all} ]]; then + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + user_text=$(echo "${user_all}"|sed -n "${integer}p") + port=$(echo "${user_text}"|awk '{print $1}') + Del_iptables + done + Save_iptables + fi + fi + if [[ ! -z $(crontab -l | grep "brook.sh monitor") ]]; then + crontab_monitor_brook_cron_stop + fi + rm -rf "${file}" + if [[ ${release} = "centos" ]]; then + chkconfig --del brook + else + update-rc.d -f brook remove + fi + rm -rf "/etc/init.d/brook" + echo && echo "Brook 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +View_brook(){ + check_installed_status + Read_config + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi + if [[ ${protocol} == "servers" ]]; then + protocol="Brook(新版)" + elif [[ ${protocol} == "streamservers" ]]; then + protocol="Brook Stream(旧版)" + fi + clear && echo + echo -e "Brook 用户配置:" + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + user_text=$(echo "${user_all}"|sed -n "${integer}p") + port=$(echo "${user_text}"|awk '{print $1}') + password=$(echo "${user_text}"|awk '{print $2}') + brook_link + echo -e "————————————————" + echo -e " 地址\t: ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " 端口\t: ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " 密码\t: ${Green_font_prefix}${password}${Font_color_suffix}" + echo -e " 协议\t: ${Green_font_prefix}${protocol}${Font_color_suffix}" + echo -e "${Brook_link_1}" + done + echo + echo -e "${Tip} Brook链接 仅适用于Windows系统的 Brook Tools客户端(https://doub.io/dbrj-7/)。" + echo +} +brook_link(){ + if [[ "${protocol}" == "Brook(新版)" ]]; then + Brook_URL_1="default ${ip}:${port} ${password}" + else + Brook_URL_1="stream ${ip}:${port} ${password}" + fi + #printf $(echo -n "xxx" | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')"\n" + Brook_URL_1=$(echo "${Brook_URL_1}"|sed 's/ /%20/g;s/!/%21/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/'"'"'/%27/g;s/(/%28/g;s/)/%29/g;s/*/%2A/g;s/+/%2B/g;s/,/%2C/g;s/\//%2F/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/?/%3F/g;s/@/%40/g;s/\[/%5B/g;s/\]/%5D/g') + Brook_URL="brook://${Brook_URL_1}" + Brook_link_1=" Brook 链接 : ${Green_font_prefix}${Brook_URL}${Font_color_suffix}" +} +View_Log(){ + check_installed_status + [[ ! -e ${brook_log} ]] && echo -e "${Error} Brook 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志(正常情况是没有使用日志记录的)" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${brook_log}${Font_color_suffix} 命令。" && echo + tail -f ${brook_log} +} +# 显示 连接信息 +debian_View_user_connection_info(){ + format_1=$1 + Read_config + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'brook' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |wc -l` + echo -e "用户总数: ${Green_background_prefix} "${user_all_num}" ${Font_color_suffix} 链接IP总数: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + user_port=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $1}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'brook' |grep 'tcp6' |grep ":${user_port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP_1}") + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi + user_IP="" + done +} +centos_View_user_connection_info(){ + format_1=$1 + Read_config + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'brook' |grep 'tcp' | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |wc -l` + echo -e "用户总数: ${Green_background_prefix} "${user_all_num}" ${Font_color_suffix} 链接IP总数: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + user_port=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $1}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'brook' |grep 'tcp' |grep ":${user_port} "|grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP_1}") + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi + user_IP="" + done +} +View_user_connection_info(){ + check_installed_status + echo && echo -e "请选择要显示的格式: + ${Green_font_prefix}1.${Font_color_suffix} 显示 IP 格式 + ${Green_font_prefix}2.${Font_color_suffix} 显示 IP+IP归属地 格式" && echo + read -e -p "(默认: 1):" brook_connection_info + [[ -z "${brook_connection_info}" ]] && brook_connection_info="1" + if [[ "${brook_connection_info}" == "1" ]]; then + View_user_connection_info_1 "" + elif [[ "${brook_connection_info}" == "2" ]]; then + echo -e "${Tip} 检测IP归属地(ipip.net),如果IP较多,可能时间会比较长..." + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} 请输入正确的数字(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + #echo "user_IP_1=${user_IP_1}" + if [[ ! -z ${user_IP_1} ]]; then + #echo "user_IP_total=${user_IP_total}" + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=$(echo "${user_IP_1}" |sed -n "$integer_1"p) + #echo "IP=${IP}" + IP_address=$(wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g') + #echo "IP_address=${IP_address}" + #user_IP="${user_IP}\n${IP}(${IP_address})" + echo -e "${Green_font_prefix}${IP}${Font_color_suffix} (${IP_address})" + #echo "user_IP=${user_IP}" + sleep 1s + done + fi +} +Set_crontab_monitor_brook(){ + check_crontab_installed_status + crontab_monitor_brook_status=$(crontab -l|grep "brook.sh monitor") + if [[ -z "${crontab_monitor_brook_status}" ]]; then + echo && echo -e "当前监控模式: ${Green_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}Brook 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 Brook 服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_brook_status_ny + [[ -z "${crontab_monitor_brook_status_ny}" ]] && crontab_monitor_brook_status_ny="y" + if [[ ${crontab_monitor_brook_status_ny} == [Yy] ]]; then + crontab_monitor_brook_cron_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Green_font_prefix}Brook 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 Brook 服务端)[y/N]" + read -e -p "(默认: n):" crontab_monitor_brook_status_ny + [[ -z "${crontab_monitor_brook_status_ny}" ]] && crontab_monitor_brook_status_ny="n" + if [[ ${crontab_monitor_brook_status_ny} == [Yy] ]]; then + crontab_monitor_brook_cron_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_brook_cron_start(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/brook.sh monitor/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/brook.sh monitor" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "brook.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Brook 服务端运行状态监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} Brook 服务端运行状态监控功能 启动成功 !" + fi +} +crontab_monitor_brook_cron_stop(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/brook.sh monitor/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "brook.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Brook 服务端运行状态监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} Brook 服务端运行状态监控功能 停止成功 !" + fi +} +crontab_monitor_brook(){ + check_installed_status + check_pid + #echo "${PID}" + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 Brook服务端 未运行 , 开始启动..." | tee -a ${brook_log} + /etc/init.d/brook start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Brook服务端 启动失败..." | tee -a ${brook_log} + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Brook服务端 启动成功..." | tee -a ${brook_log} + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Brook服务端 进程运行正常..." | tee -a ${brook_log} + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${bk_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${bk_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/brook.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/brook" ]]; then + rm -rf /etc/init.d/brook + Service_brook + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/brook.sh" && chmod +x brook.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +action=$1 +if [[ "${action}" == "monitor" ]]; then + crontab_monitor_brook +else + echo && echo -e " Brook 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/brook-jc3 ---- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 Brook + ${Green_font_prefix} 2.${Font_color_suffix} 更新 Brook + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 Brook +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 Brook + ${Green_font_prefix} 5.${Font_color_suffix} 停止 Brook + ${Green_font_prefix} 6.${Font_color_suffix} 重启 Brook +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 账号配置 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 账号信息 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 日志信息 + ${Green_font_prefix}10.${Font_color_suffix} 查看 链接信息 +————————————" && echo + if [[ -e ${brook_file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi + else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" + fi + echo + read -e -p " 请输入数字 [0-10]:" num + case "$num" in + 0) + Update_Shell + ;; + 1) + Install_brook + ;; + 2) + Update_brook + ;; + 3) + Uninstall_brook + ;; + 4) + Start_brook + ;; + 5) + Stop_brook + ;; + 6) + Restart_brook + ;; + 7) + Set_brook + ;; + 8) + View_brook + ;; + 9) + View_Log + ;; + 10) + View_user_connection_info + ;; + *) + echo "请输入正确数字 [0-10]" + ;; + esac +fi \ No newline at end of file diff --git a/caddy_install.sh b/caddy_install.sh new file mode 100644 index 0000000..45a4e1d --- /dev/null +++ b/caddy_install.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: Caddy Install +# Version: 1.0.8 +# Author: Toyo +# Blog: https://doub.io/shell-jc1/ +#================================================= +file="/usr/local/caddy/" +caddy_file="/usr/local/caddy/caddy" +caddy_conf_file="/usr/local/caddy/Caddyfile" +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=$(uname -m) +} +check_installed_status(){ + [[ ! -e ${caddy_file} ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} Caddy 没有安装,请检查 !" && exit 1 +} +Download_caddy(){ + [[ ! -e ${file} ]] && mkdir "${file}" + cd "${file}" + PID=$(ps -ef |grep "caddy" |grep -v "grep" |grep -v "init.d" |grep -v "service" |grep -v "caddy_install" |awk '{print $2}') + [[ ! -z ${PID} ]] && kill -9 ${PID} + [[ -e "caddy_linux*.tar.gz" ]] && rm -rf "caddy_linux*.tar.gz" + + if [[ ! -z ${extension} ]]; then + extension_all="?plugins=${extension}&license=personal" + else + extension_all="?license=personal" + fi + + if [[ ${bit} == "x86_64" ]]; then + wget --no-check-certificate -O "caddy_linux.tar.gz" "https://caddyserver.com/download/linux/amd64${extension_all}" + elif [[ ${bit} == "i386" || ${bit} == "i686" ]]; then + wget --no-check-certificate -O "caddy_linux.tar.gz" "https://caddyserver.com/download/linux/386${extension_all}" + elif [[ ${bit} == "armv7l" ]]; then + wget --no-check-certificate -O "caddy_linux.tar.gz" "https://caddyserver.com/download/linux/arm7${extension_all}" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} 不支持 [${bit}] ! 请向本站反馈[]中的名称,我会看看是否可以添加支持。" && exit 1 + fi + [[ ! -e "caddy_linux.tar.gz" ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} Caddy 下载失败 !" && exit 1 + tar zxf "caddy_linux.tar.gz" + rm -rf "caddy_linux.tar.gz" + [[ ! -e ${caddy_file} ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} Caddy 解压失败或压缩文件错误 !" && exit 1 + rm -rf LICENSES.txt + rm -rf README.txt + rm -rf CHANGES.txt + rm -rf "init/" + chmod +x caddy +} +Service_caddy(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/caddy_centos -O /etc/init.d/caddy; then + echo -e "${Error_font_prefix}[错误]${Font_suffix} Caddy服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/caddy + chkconfig --add caddy + chkconfig caddy on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/caddy_debian -O /etc/init.d/caddy; then + echo -e "${Error_font_prefix}[错误]${Font_suffix} Caddy服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/caddy + update-rc.d -f caddy defaults + fi +} +install_caddy(){ + check_root + if [[ -e ${caddy_file} ]]; then + echo && echo -e "${Error_font_prefix}[信息]${Font_suffix} 检测到 Caddy 已安装,是否继续安装(覆盖更新)?[y/N]" + read -e -p "(默认: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Nn] ]]; then + echo && echo "已取消..." && exit 1 + fi + fi + Download_caddy + Service_caddy + echo && echo -e " Caddy 使用命令:${caddy_conf_file} + 日志文件:cat /tmp/caddy.log + 使用说明:service caddy start | stop | restart | status + 或者使用:/etc/init.d/caddy start | stop | restart | status + ${Info_font_prefix}[信息]${Font_suffix} Caddy 安装完成!" && echo +} +uninstall_caddy(){ + check_installed_status + echo && echo "确定要卸载 Caddy ? [y/N]" + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + PID=`ps -ef |grep "caddy" |grep -v "grep" |grep -v "init.d" |grep -v "service" |grep -v "caddy_install" |awk '{print $2}'` + [[ ! -z ${PID} ]] && kill -9 ${PID} + if [[ ${release} = "centos" ]]; then + chkconfig --del caddy + else + update-rc.d -f caddy remove + fi + [[ -s /tmp/caddy.log ]] && rm -rf /tmp/caddy.log + rm -rf ${caddy_file} + rm -rf ${caddy_conf_file} + rm -rf /etc/init.d/caddy + [[ ! -e ${caddy_file} ]] && echo && echo -e "${Info_font_prefix}[信息]${Font_suffix} Caddy 卸载完成 !" && echo && exit 1 + echo && echo -e "${Error_font_prefix}[错误]${Font_suffix} Caddy 卸载失败 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +check_sys +action=$1 +extension=$2 +[[ -z $1 ]] && action=install +case "$action" in + install|uninstall) + ${action}_caddy + ;; + *) + echo "输入错误 !" + echo "用法: {install | uninstall}" + ;; +esac \ No newline at end of file diff --git a/cloudt.sh b/cloudt.sh new file mode 100644 index 0000000..da35229 --- /dev/null +++ b/cloudt.sh @@ -0,0 +1,428 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: Cloud Torrent +# Version: 1.2.5 +# Author: Toyo +# Blog: https://doub.io/wlzy-12/ +#================================================= + +sh_ver="1.2.5" +file="/usr/local/cloudtorrent" +ct_file="/usr/local/cloudtorrent/cloud-torrent" +dl_file="/usr/local/cloudtorrent/downloads" +ct_config="/usr/local/cloudtorrent/cloud-torrent.json" +ct_conf="/usr/local/cloudtorrent/cloud-torrent.conf" +ct_log="/tmp/ct.log" +IncomingPort="50007" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=$(uname -m) +} +check_installed_status(){ + [[ ! -e ${ct_file} ]] && echo -e "${Error} Cloud Torrent 没有安装,请检查 !" && exit 1 +} +check_pid(){ + PID=$(ps -ef | grep cloud-torrent | grep -v grep | awk '{print $2}') +} +check_new_ver(){ + ct_new_ver=$(wget --no-check-certificate -qO- -t2 -T3 https://api.github.com/repos/jpillora/cloud-torrent/releases| grep "tag_name"| head -n 1| awk -F ":" '{print $2}'| sed 's/\"//g;s/,//g;s/ //g;s/v//g') + if [[ -z ${ct_new_ver} ]]; then + echo -e "${Error} Cloud Torrent 最新版本获取失败,请手动获取最新版本号[ https://github.com/jpillora/cloud-torrent/releases ]" + read -e -p "请输入版本号 [ 格式 x.x.xx , 如 0.8.21 ] :" ct_new_ver + [[ -z "${ct_new_ver}" ]] && echo "取消..." && exit 1 + else + echo -e "${Info} Cloud Torrent 目前最新版本为 ${ct_new_ver}" + fi +} +check_ver_comparison(){ + ct_now_ver=$(${ct_file} --version) + if [[ ${ct_now_ver} != ${ct_new_ver} ]]; then + echo -e "${Info} 发现 Cloud Torrent 已有新版本 [ ${ct_new_ver} ]" + read -e -p "是否更新 ? [Y/n] :" yn + [ -z "${yn}" ] && yn="y" + if [[ ${yn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + rm -rf ${ct_file} + Download_ct + Start_ct + fi + else + echo -e "${Info} 当前 Cloud Torrent 已是最新版本 [ ${ct_new_ver} ]" && exit 1 + fi +} +Download_ct(){ + cd ${file} + if [[ ${bit} == "x86_64" ]]; then + wget --no-check-certificate -O cloud-torrent.gz "https://github.com/jpillora/cloud-torrent/releases/download/${ct_new_ver}/cloud-torrent_linux_amd64.gz" + elif [[ ${bit} == "i386" || ${bit} == "i686" ]]; then + wget --no-check-certificate -O cloud-torrent.gz "https://github.com/jpillora/cloud-torrent/releases/download/${ct_new_ver}/cloud-torrent_linux_386.gz" + else + wget --no-check-certificate -O cloud-torrent.gz "https://github.com/jpillora/cloud-torrent/releases/download/${ct_new_ver}/cloud-torrent_linux_arm.gz" + fi + [[ ! -e "cloud-torrent.gz" ]] && echo -e "${Error} Cloud Torrent 下载失败 !" && exit 1 + gzip -d cloud-torrent.gz + [[ ! -e ${ct_file} ]] && echo -e "${Error} Cloud Torrent 解压失败(可能是 压缩包损坏 或者 没有安装 Gzip) !" && exit 1 + rm -rf cloud-torrent.gz + chmod +x cloud-torrent +} +Service_ct(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/cloudt_centos" -O /etc/init.d/cloudt; then + echo -e "${Error} Cloud Torrent服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/cloudt + chkconfig --add cloudt + chkconfig cloudt on + else + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/cloudt_debian" -O /etc/init.d/cloudt; then + echo -e "${Error} Cloud Torrent服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/cloudt + update-rc.d -f cloudt defaults + fi + echo -e "${Info} Cloud Torrent服务 管理脚本下载完成 !" +} +Installation_dependency(){ + gzip_ver=$(gzip -V) + if [[ -z ${gzip_ver} ]]; then + if [[ ${release} == "centos" ]]; then + yum update + yum install -y gzip + else + apt-get update + apt-get install -y gzip + fi + fi + mkdir ${file} + mkdir ${dl_file} +} +Write_config(){ + cat > ${ct_conf}<<-EOF +host = ${ct_host} +port = ${ct_port} +user = ${ct_user} +passwd = ${ct_passwd} +EOF +} +Read_config(){ + [[ ! -e ${ct_conf} ]] && echo -e "${Error} Cloud Torrent 配置文件不存在 !" && exit 1 + host=`cat ${ct_conf}|grep "host = "|awk -F "host = " '{print $NF}'` + port=`cat ${ct_conf}|grep "port = "|awk -F "port = " '{print $NF}'` + user=`cat ${ct_conf}|grep "user = "|awk -F "user = " '{print $NF}'` + passwd=`cat ${ct_conf}|grep "passwd = "|awk -F "passwd = " '{print $NF}'` +} +Set_host(){ + echo -e "请输入 Cloud Torrent 监听域名或IP(当你要绑定域名前,记得先做好域名解析,目前只支持http://访问,不要写http://,只写域名!)" + read -e -p "(默认: 0.0.0.0 监听网卡所有IP):" ct_host + [[ -z "${ct_host}" ]] && ct_host="0.0.0.0" + echo && echo "========================" + echo -e " 主机 : ${Red_background_prefix} ${ct_host} ${Font_color_suffix}" + echo "========================" && echo +} +Set_port(){ + while true + do + echo -e "请输入 Cloud Torrent 监听端口 [1-65535](如果是绑定的域名,那么建议80端口)" + read -e -p "(默认端口: 80):" ct_port + [[ -z "${ct_port}" ]] && ct_port="80" + echo $((${ct_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ct_port} -ge 1 ]] && [[ ${ct_port} -le 65535 ]]; then + echo && echo "========================" + echo -e " 端口 : ${Red_background_prefix} ${ct_port} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_user(){ + echo "请输入 Cloud Torrent 用户名" + read -e -p "(默认用户名: user):" ct_user + [[ -z "${ct_user}" ]] && ct_user="user" + echo && echo "========================" + echo -e " 用户名 : ${Red_background_prefix} ${ct_user} ${Font_color_suffix}" + echo "========================" && echo + + echo "请输入 Cloud Torrent 用户名的密码" + read -e -p "(默认密码: 随机生成10位数字+字母):" ct_passwd + [[ -z "${ct_passwd}" ]] && ct_passwd=$(date +%s%N | md5sum | head -c 10) + echo && echo "========================" + echo -e " 密码 : ${Red_background_prefix} ${ct_passwd} ${Font_color_suffix}" + echo "========================" && echo +} +Set_conf(){ + Set_host + Set_port + read -e -p "是否设置 用户名和密码 ? [y/N] :" yn + [[ -z "${yn}" ]] && yn="n" + if [[ ${yn} == [Yy] ]]; then + Set_user + else + ct_user="" && ct_passwd="" + fi +} +Set_ct(){ + check_installed_status + check_sys + check_pid + Set_conf + Read_config + Del_iptables + Write_config + Add_iptables + Save_iptables + Restart_ct +} +Install_ct(){ + check_root + [[ -e ${ct_file} ]] && echo -e "${Error} 检测到 Cloud Torrent 已安装 !" && exit 1 + check_sys + echo -e "${Info} 开始设置 用户配置..." + Set_conf + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始检测最新版本..." + check_new_ver + echo -e "${Info} 开始下载/安装..." + Download_ct + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_ct + echo -e "${Info} 开始写入 配置文件..." + Write_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_ct +} +Start_ct(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} Cloud Torrent 正在运行,请检查 !" && exit 1 + /etc/init.d/cloudt start +} +Stop_ct(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} Cloud Torrent 没有运行,请检查 !" && exit 1 + /etc/init.d/cloudt stop +} +Restart_ct(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/cloudt stop + /etc/init.d/cloudt start +} +Log_ct(){ + [[ ! -e "${ct_log}" ]] && echo -e "${Error} Cloud Torrent 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${ct_log}${Font_color_suffix} 命令。" && echo + tail -f "${ct_log}" +} +Update_ct(){ + check_installed_status + check_sys + check_new_ver + check_ver_comparison + /etc/init.d/cloudt start +} +Uninstall_ct(){ + check_installed_status + echo "确定要卸载 Cloud Torrent ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + Read_config + Del_iptables + Save_iptables + rm -rf ${file} && rm -rf /etc/init.d/cloudt + if [[ ${release} = "centos" ]]; then + chkconfig --del cloudt + else + update-rc.d -f cloudt remove + fi + echo && echo "Cloud torrent 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +View_ct(){ + check_installed_status + Read_config + if [[ "${host}" == "0.0.0.0" ]]; then + host=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${host}" ]]; then + host=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${host}" ]]; then + host=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${host}" ]]; then + host="VPS_IP" + fi + fi + fi + fi + if [[ "${port}" == "80" ]]; then + port="" + else + port=":${port}" + fi + if [[ -z ${user} ]]; then + clear && echo "————————————————" && echo + echo -e " 你的 Cloud Torrent 信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}http://${host}${port}${Font_color_suffix}" + echo && echo "————————————————" + else + clear && echo "————————————————" && echo + echo -e " 你的 Cloud Torrent 信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}http://${host}${port}${Font_color_suffix}" + echo -e " 用户\t: ${Green_font_prefix}${user}${Font_color_suffix}" + echo -e " 密码\t: ${Green_font_prefix}${passwd}${Font_color_suffix}" + echo && echo "————————————————" + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ct_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ct_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${IncomingPort} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${IncomingPort} -j ACCEPT + iptables -I OUTPUT -m state --state NEW -m tcp -p tcp --dport ${IncomingPort} -j ACCEPT + iptables -I OUTPUT -m state --state NEW -m udp -p udp --dport ${IncomingPort} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${IncomingPort} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${IncomingPort} -j ACCEPT + iptables -D OUTPUT -m state --state NEW -m tcp -p tcp --dport ${IncomingPort} -j ACCEPT + iptables -D OUTPUT -m state --state NEW -m udp -p udp --dport ${IncomingPort} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/cloudt.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/cloudt" ]]; then + rm -rf /etc/init.d/cloudt + Service_ct + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/cloudt.sh" && chmod +x cloudt.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +echo && echo -e " Cloud Torrent 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/wlzy-12/ ---- + + ${Green_font_prefix}0.${Font_color_suffix} 升级脚本 + + ${Green_font_prefix}1.${Font_color_suffix} 安装 Cloud Torrent + ${Green_font_prefix}2.${Font_color_suffix} 升级 Cloud Torrent + ${Green_font_prefix}3.${Font_color_suffix} 卸载 Cloud Torrent +———————————— + ${Green_font_prefix}4.${Font_color_suffix} 启动 Cloud Torrent + ${Green_font_prefix}5.${Font_color_suffix} 停止 Cloud Torrent + ${Green_font_prefix}6.${Font_color_suffix} 重启 Cloud Torrent +———————————— + ${Green_font_prefix}7.${Font_color_suffix} 设置 Cloud Torrent 账号 + ${Green_font_prefix}8.${Font_color_suffix} 查看 Cloud Torrent 账号 + ${Green_font_prefix}9.${Font_color_suffix} 查看 Cloud Torrent 日志 +————————————" && echo +if [[ -e ${ct_file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-9]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_ct + ;; + 2) + Update_ct + ;; + 3) + Uninstall_ct + ;; + 4) + Start_ct + ;; + 5) + Stop_ct + ;; + 6) + Restart_ct + ;; + 7) + Set_ct + ;; + 8) + View_ct + ;; + 9) + Log_ct + ;; + *) + echo "请输入正确数字 [0-9]" + ;; +esac \ No newline at end of file diff --git a/daze.sh b/daze.sh new file mode 100644 index 0000000..fa2f4ac --- /dev/null +++ b/daze.sh @@ -0,0 +1,721 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: DAZE +# Version: 1.0.1 +# Author: Toyo +# Blog: https://doub.io/daze-jc3/ +#================================================= + +sh_ver="1.0.1" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +Folder="/usr/local/daze" +File="/usr/local/daze/daze" +CONF="/usr/local/daze/daze.conf" +Now_ver_File="/usr/local/daze/ver.txt" +Log_File="/usr/local/daze/daze.log" +Crontab_file="/usr/bin/crontab" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${File} ]] && echo -e "${Error} DAZE 没有安装,请检查 !" && exit 1 +} +check_crontab_installed_status(){ + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 没有安装,开始安装..." + if [[ ${release} == "centos" ]]; then + yum install crond -y + else + apt-get install cron -y + fi + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 安装失败,请检查!" && exit 1 + else + echo -e "${Info} Crontab 安装成功!" + fi + fi +} +check_pid(){ + PID=$(ps -ef| grep "daze"| grep -v grep| grep -v "daze.sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}') +} +check_new_ver(){ + new_ver=$(wget --no-check-certificate -qO- -t1 -T3 https://api.github.com/repos/mohanson/daze/releases| grep "tag_name"| head -n 1| awk -F ":" '{print $2}'| sed 's/\"//g;s/,//g;s/ //g') + if [[ -z ${new_ver} ]]; then + echo -e "${Error} DAZE 最新版本获取失败,请手动获取最新版本号[ https://github.com/mohanson/daze/releases ]" + read -e -p "请输入版本号 [ 格式如 2018.10.15 ] :" new_ver + [[ -z "${new_ver}" ]] && echo "取消..." && exit 1 + else + echo -e "${Info} 检测到 DAZE 最新版本为 [ ${new_ver} ]" + fi +} +check_ver_comparison(){ + now_ver=$(cat ${Now_ver_File}) + [[ -z ${now_ver} ]] && echo "${new_ver}" > ${Now_ver_File} + if [[ ${now_ver} != ${new_ver} ]]; then + echo -e "${Info} 发现 DAZE 已有新版本 [ ${new_ver} ],当前版本 [ ${now_ver} ]" + read -e -p "是否更新 ? [Y/n] :" yn + [[ -z "${yn}" ]] && yn="y" + if [[ $yn == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + cp "${CONF}" "/tmp/daze.conf" + rm -rf ${Folder} + mkdir ${Folder} + Download + mv "/tmp/daze.conf" "${CONF}" + Start + fi + else + echo -e "${Info} 当前 DAZE 已是最新版本 [ ${new_ver} ]" && exit 1 + fi +} +Download(){ + cd ${Folder} + if [[ ${bit} == "x86_64" ]]; then + bit="amd64" + elif [[ ${bit} == "i386" || ${bit} == "i686" ]]; then + bit="386" + else + bit="arm" + fi + wget --no-check-certificate -N "https://github.com/mohanson/daze/releases/download/${new_ver}/daze_linux_${bit}" + [[ ! -e "daze_linux_${bit}" ]] && echo -e "${Error} DAZE 下载失败 !" && rm -rf "${Folder}" && exit 1 + mv "daze_linux_${bit}" "daze" + [[ ! -e "daze" ]] && echo -e "${Error} DAZE 重命名失败 !" && rm -rf "${Folder}" && exit 1 + chmod +x daze + echo "${new_ver}" > ${Now_ver_File} +} +Service(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/daze_centos -O /etc/init.d/daze; then + echo -e "${Error} DAZE 服务管理脚本下载失败 !" && rm -rf "${Folder}" && exit 1 + fi + chmod +x /etc/init.d/daze + chkconfig --add daze + chkconfig daze on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/daze_debian -O /etc/init.d/daze; then + echo -e "${Error} DAZE 服务管理脚本下载失败 !" && rm -rf "${Folder}" && exit 1 + fi + chmod +x /etc/init.d/daze + update-rc.d -f daze defaults + fi + echo -e "${Info} DAZE 服务管理脚本下载完成 !" +} +Installation_dependency(){ + \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + mkdir ${Folder} +} +Write_config(){ + cat > ${CONF}<<-EOF +port=${new_port} +password=${new_password} +method=${new_method} +obfs_url=${new_obfs_url} +dns=${new_dns} +EOF +} +Read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} DAZE 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep "port"|awk -F "=" '{print $NF}') + password=$(cat ${CONF}|grep "password"|awk -F "=" '{print $NF}') + method=$(cat ${CONF}|grep "method"|awk -F "=" '{print $NF}') + obfs_url=$(cat ${CONF}|grep "obfs_url"|awk -F "=" '{print $NF}') + dns=$(cat ${CONF}|grep "dns"|awk -F "=" '{print $NF}') +} +Set_port(){ + while true + do + echo -e "请输入 DAZE 监听端口 [1-65535](如果要混淆伪装,建议使用:80 8080 8880)" + read -e -p "(默认: 8880):" new_port + [[ -z "${new_port}" ]] && new_port="8880" + echo $((${new_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${new_port} -ge 1 ]] && [[ ${new_port} -le 65535 ]]; then + echo && echo "========================" + echo -e " 端口 : ${Red_background_prefix} ${new_port} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_password(){ + echo "请输入 DAZE 密码" + read -e -p "(默认: doub.io):" new_password + [[ -z "${new_password}" ]] && new_password="doub.io" + echo && echo "========================" + echo -e " 密码 : ${Red_background_prefix} ${new_password} ${Font_color_suffix}" + echo "========================" && echo +} +Set_method(){ + echo -e "请选择 DAZE 加密方式(或者说混淆) + + ${Green_font_prefix}1.${Font_color_suffix} ashe (仅加密无混淆) + ${Green_font_prefix}2.${Font_color_suffix} asheshadow (加密+HTTP混淆,注意后面务必填写混淆伪装的网站) + ${Tip} 如果使用 asheshadow,那么建议搭配 80 8080 等端口,如果你有域名,请域名A记录指向当前服务器IP,DAZE 客户端处服务器地址填写你的域名,即可混淆伪装为 http://域名:端口/" && echo + read -e -p "(默认: 1. ashe):" new_method + [[ -z "${new_method}" ]] && new_method="3" + if [[ ${new_method} == "1" ]]; then + new_method="ashe" + elif [[ ${new_method} == "2" ]]; then + new_method="asheshadow" + else + new_method="ashe" + fi + echo && echo "========================" + echo -e " 加密 : ${Red_background_prefix} ${new_method^^} ${Font_color_suffix}" + echo "========================" && echo +} +Set_obfs_url(){ + echo "请输入 DAZE 要混淆伪装的网站,如果加密方式为 asheshadow,请务必填写(反向代理,只支持 HTTP:// 网站) +建议混淆伪装网站具备以下特点:有 http:// 地址,且不强制重定向为 https://,该网站大流量传输属于正常情况,推荐使用 CentOS Debian Ubuntu 等系统的内核仓库地址。" + read -e -p "(默认不伪装):" new_obfs_url + if [[ ! -z ${new_obfs_url} ]]; then + echo && echo "========================" + echo -e " 伪装 : ${Red_background_prefix} ${new_obfs_url} ${Font_color_suffix}" + echo "========================" && echo + fi +} +Set_dns(){ + echo "请输入 DAZE 要来解析域名的 DNS (目前只支持 53 端口的DNS,例如:8.8.8.8:53)" + read -e -p "(默认: 8.8.8.8:53):" new_dns + [[ -z "${new_dns}" ]] && new_dns="8.8.8.8:53" + echo && echo "========================" + echo -e " DNS : ${Red_background_prefix} ${new_dns} ${Font_color_suffix}" + echo "========================" && echo +} +Set_conf(){ + Set_port + Set_password + Set_method + Set_obfs_url + Set_dns +} +Modify_restart(){ + echo -e "是否要立刻重启? (Y/n)" + read -e -p "(默认: Y):" Modify_restart_yn + [[ -z ${Modify_restart_yn} ]] && Modify_restart_yn="Y" + if [[ ${Modify_restart_yn} == [Yy] ]]; then + Restart + else + echo -e "已取消..." + fi +} +Modify_port(){ + Read_config + Set_port + new_password="${password}" + new_obfs_url="${obfs_url}" + new_method="${method}" + new_dns="${dns}" + Del_iptables + Write_config + Add_iptables + Save_iptables + Modify_restart +} +Modify_password(){ + Read_config + Set_password + new_port="${port}" + new_obfs_url="${obfs_url}" + new_method="${method}" + new_dns="${dns}" + Write_config + Modify_restart +} +Modify_obfs_url(){ + Read_config + Set_obfs_url + new_port="${port}" + new_password="${password}" + new_method="${method}" + new_dns="${dns}" + Write_config + Modify_restart +} +Modify_method(){ + Read_config + Set_method + new_port="${port}" + new_password="${password}" + new_obfs_url="${obfs_url}" + new_dns="${dns}" + Write_config + Modify_restart +} +Modify_dns(){ + Read_config + Set_method + new_port="${port}" + new_password="${password}" + new_method="${method}" + new_obfs_url="${obfs_url}" + Write_config + Modify_restart +} +Modify_all(){ + Read_config + Set_conf + Del_iptables + Write_config + Add_iptables + Save_iptables + Modify_restart +} +Set(){ + check_installed_status + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 修改 端口配置 + ${Green_font_prefix}2.${Font_color_suffix} 修改 密码配置 + ${Green_font_prefix}3.${Font_color_suffix} 修改 加密方式(以及混淆) + ${Green_font_prefix}4.${Font_color_suffix} 修改 伪装配置(反向代理) + ${Green_font_prefix}5.${Font_color_suffix} 修改 DNS 配置 + ${Green_font_prefix}6.${Font_color_suffix} 修改 全部配置 +———————————————— + ${Green_font_prefix}7.${Font_color_suffix} 监控 运行状态 + + ${Tip} 用户的端口是不能重复的,密码可以重复 !" && echo + read -e -p "(默认: 取消):" gf_modify + [[ -z "${gf_modify}" ]] && echo "已取消..." && exit 1 + if [[ ${gf_modify} == "1" ]]; then + Modify_port + elif [[ ${gf_modify} == "2" ]]; then + Modify_password + elif [[ ${gf_modify} == "3" ]]; then + Modify_method + elif [[ ${gf_modify} == "4" ]]; then + Modify_obfs_url + elif [[ ${gf_modify} == "5" ]]; then + Modify_dns + elif [[ ${gf_modify} == "6" ]]; then + Modify_all + elif [[ ${gf_modify} == "7" ]]; then + Set_crontab_monitor + else + echo -e "${Error} 请输入正确的数字(1-6)" && exit 1 + fi +} +Install(){ + check_root + [[ -e ${File} ]] && echo -e "${Error} 检测到 DAZE 已安装 !" && exit 1 + echo -e "${Info} 开始设置 用户配置..." + Set_conf + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始检测最新版本..." + check_new_ver + echo -e "${Info} 开始下载/安装..." + Download + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service + echo -e "${Info} 开始写入 配置文件..." + Write_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start +} +Start(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} DAZE 正在运行,请检查 !" && exit 1 + /etc/init.d/daze start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View_daze +} +Stop(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} DAZE 没有运行,请检查 !" && exit 1 + /etc/init.d/daze stop +} +Restart(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/daze stop + /etc/init.d/daze start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View_daze +} +Update(){ + check_installed_status + check_new_ver + check_ver_comparison +} +Uninstall(){ + check_installed_status + echo -e "确定要卸载 DAZE ? (y/N)" + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + Read_config + Del_iptables + Save_iptables + rm -rf ${Folder} + if [[ ${release} = "centos" ]]; then + chkconfig --del daze + else + update-rc.d -f daze remove + fi + rm -rf /etc/init.d/daze + echo && echo "DAZE 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +View_daze(){ + check_installed_status + Read_config + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi + [[ -z ${obfs_url} ]] && obfs_url="无" + link_qr + clear && echo "————————————————" && echo + echo -e " DAZE 账号信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " 端口\t: ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " 密码\t: ${Green_font_prefix}${password}${Font_color_suffix}" + echo -e " 加密\t: ${Green_font_prefix}${method}${Font_color_suffix}" + echo -e " 伪装\t: ${Green_font_prefix}${obfs_url}${Font_color_suffix}" + echo -e " DNS \t: ${Green_font_prefix}${dns}${Font_color_suffix}" + echo -e "${link}" + echo -e "${Tip} 链接仅适用于Windows系统的 DAZE Tools 客户端(https://doub.io/dbrj-17/)。" + echo && echo "————————————————" +} +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n//g;ta'|sed 's/=//g;s/+/-/g;s/\//_/g') + echo -e "${date}" +} +link_qr(){ + PWDbase64=$(urlsafe_base64 "${password}") + base64=$(urlsafe_base64 "${ip}:${port}@${PWDbase64}:${method}") + url="daze://${base64}" + QRcode="http://doub.pw/qr/qr.php?text=${url}" + link=" 链接\t: ${Red_font_prefix}${url}${Font_color_suffix} \n 二维码 : ${Red_font_prefix}${QRcode}${Font_color_suffix} \n " +} +View_Log(){ + check_installed_status + [[ ! -e ${Log_File} ]] && echo -e "${Error} DAZE 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" + echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${Log_File}${Font_color_suffix} 命令。" + echo -e "如果需要清理日志,请用 ${Red_font_prefix}echo \"\" > ${Log_File}${Font_color_suffix} 命令。" && echo + tail -f ${Log_File} +} +# 显示 连接信息 +debian_View_user_connection_info(){ + format_1=$1 + Read_config + user_port=${port} + user_IP_1=$(netstat -anp |grep 'ESTABLISHED' |grep 'daze' |grep 'tcp6' |grep ":${user_port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}") + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP_1}") + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi + user_IP="" +} +centos_View_user_connection_info(){ + format_1=$1 + Read_config + user_port=${port} + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'daze' |grep 'tcp' |grep ":${user_port} "|grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP_1}") + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi + user_IP="" +} +View_user_connection_info(){ + check_installed_status + echo && echo -e "请选择要显示的格式: + ${Green_font_prefix}1.${Font_color_suffix} 显示 IP 格式 + ${Green_font_prefix}2.${Font_color_suffix} 显示 IP+IP归属地 格式" && echo + read -e -p "(默认: 1):" daze_connection_info + [[ -z "${daze_connection_info}" ]] && daze_connection_info="1" + if [[ "${daze_connection_info}" == "1" ]]; then + View_user_connection_info_1 "" + elif [[ "${daze_connection_info}" == "2" ]]; then + echo -e "${Tip} 检测IP归属地(ipip.net),如果IP较多,可能时间会比较长..." + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} 请输入正确的数字(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + #echo "user_IP_1=${user_IP_1}" + if [[ ! -z ${user_IP_1} ]]; then + #echo "user_IP_total=${user_IP_total}" + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=$(echo "${user_IP_1}" |sed -n "$integer_1"p) + #echo "IP=${IP}" + IP_address=$(wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g') + #echo "IP_address=${IP_address}" + #user_IP="${user_IP}\n${IP}(${IP_address})" + echo -e "${Green_font_prefix}${IP}${Font_color_suffix} (${IP_address})" + #echo "user_IP=${user_IP}" + sleep 1s + done + fi +} +Set_crontab_monitor(){ + check_crontab_installed_status + crontab_monitor_status=$(crontab -l|grep "daze.sh monitor") + if [[ -z "${crontab_monitor_status}" ]]; then + echo && echo -e "当前监控模式: ${Green_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}DAZE 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 DAZE 服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_status_ny + [[ -z "${crontab_monitor_status_ny}" ]] && crontab_monitor_status_ny="y" + if [[ ${crontab_monitor_status_ny} == [Yy] ]]; then + crontab_monitor_cron_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Green_font_prefix}DAZE 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 DAZE 服务端)[y/N]" + read -e -p "(默认: n):" crontab_monitor_status_ny + [[ -z "${crontab_monitor_status_ny}" ]] && crontab_monitor_status_ny="n" + if [[ ${crontab_monitor_status_ny} == [Yy] ]]; then + crontab_monitor_cron_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_cron_start(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/daze.sh monitor/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/daze.sh monitor" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "daze.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} DAZE 服务端运行状态监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} DAZE 服务端运行状态监控功能 启动成功 !" + fi +} +crontab_monitor_cron_stop(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/daze.sh monitor/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "daze.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} DAZE 服务端运行状态监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} DAZE 服务端运行状态监控功能 停止成功 !" + fi +} +crontab_monitor(){ + check_installed_status + check_pid + echo "${PID}" + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 DAZE 服务端 未运行 , 开始启动..." | tee -a ${Log_File} + /etc/init.d/daze start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] DAZE 服务端 启动失败..." | tee -a ${Log_File} + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] DAZE 服务端 启动成功..." | tee -a ${Log_File} + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] DAZE 服务端 进程运行正常..." | tee -a ${Log_File} + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${new_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${new_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/daze.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/daze" ]]; then + rm -rf /etc/init.d/daze + Service + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/daze.sh" && chmod +x daze.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +action=$1 +if [[ "${action}" == "monitor" ]]; then + crontab_monitor +else +echo && echo -e " DAZE 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/daze-jc3 -- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 DAZE + ${Green_font_prefix} 2.${Font_color_suffix} 升级 DAZE + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 DAZE +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 DAZE + ${Green_font_prefix} 5.${Font_color_suffix} 停止 DAZE + ${Green_font_prefix} 6.${Font_color_suffix} 重启 DAZE +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 账号配置 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 账号信息 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 日志信息 + ${Green_font_prefix}10.${Font_color_suffix} 查看 链接信息 +————————————" && echo +if [[ -e ${File} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-10]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install + ;; + 2) + Update + ;; + 3) + Uninstall + ;; + 4) + Start + ;; + 5) + Stop + ;; + 6) + Restart + ;; + 7) + Set + ;; + 8) + View_daze + ;; + 9) + View_Log + ;; + 10) + View_user_connection_info + ;; + *) + echo "请输入正确数字 [0-10]" + ;; +esac +fi \ No newline at end of file diff --git a/dowsdns.sh b/dowsdns.sh new file mode 100644 index 0000000..8dbebad --- /dev/null +++ b/dowsdns.sh @@ -0,0 +1,626 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: dowsDNS +# Version: 1.0.10 +# Author: Toyo +# Blog: https://doub.io/dowsdns-jc3/ +#================================================= + +sh_ver="1.0.10" +file="/usr/local/dowsDNS" +dowsdns_conf="/usr/local/dowsDNS/conf/config.json" +dowsdns_data="/usr/local/dowsDNS/conf/hosts_repository_config.json" +dowsdns_wrcd="/usr/local/dowsDNS/data/wrcd.json" +dowsdns_log="/tmp/dowsdns.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" && Error="${Red_font_prefix}[错误]${Font_color_suffix}" && Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${file} ]] && echo -e "${Error} dowsDNS 没有安装,请检查 !" && exit 1 +} +check_pid(){ + PID=`ps -ef| grep "python start.py"| grep -v grep| grep -v ".sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}'` +} +Download_dowsdns(){ + cd "/usr/local" + #new_ver=$(wget --no-check-certificate -qO- -t1 -T3 https://api.github.com/repos/dowsnature/dowsDNS/releases| grep "tag_name"| head -n 1| awk -F ":" '{print $2}'| sed 's/\"//g;s/,//g;s/ //g;s/v//g') + #[[ -z "${new_ver}" ]] && echo -e "${Error} dowsDNS 最新版本号获取失败 !" && exit 1 + [[ -e "dowsDNS.zip" ]] && rm -rf "dowsDNS.zip" + wget --no-check-certificate -O "dowsDNS.zip" "https://github.com/dowsnature/dowsDNS/archive/master.zip" + [[ ! -e "dowsDNS.zip" ]] && echo -e "${Error} dowsDNS 下载失败 !" && exit 1 + unzip dowsDNS.zip && rm -rf dowsDNS.zip + [[ ! -e "dowsDNS-master" ]] && echo -e "${Error} dowsDNS 解压失败 !" && exit 1 + mv dowsDNS-master dowsDNS + [[ ! -e "dowsDNS" ]] && echo -e "${Error} dowsDNS 文件夹重命名失败 !" && rm -rf dowsDNS-master && exit 1 +} +Service_dowsdns(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/dowsdns_centos" -O /etc/init.d/dowsdns; then + echo -e "${Error} dowsDNS 服务管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/dowsdns + chkconfig --add dowsdns + chkconfig dowsdns on + else + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/dowsdns_debian" -O /etc/init.d/dowsdns; then + echo -e "${Error} dowsDNS 服务管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/dowsdns + update-rc.d -f dowsdns defaults + fi + echo -e "${Info} dowsDNS 服务管理脚本下载完成 !" +} +Installation_dependency(){ + python_status=$(python --help) + if [[ ${release} == "centos" ]]; then + yum update + if [[ -z ${python_status} ]]; then + yum install -y python python-pip unzip + else + yum install -y python-pip unzip + fi + else + apt-get update + if [[ -z ${python_status} ]]; then + apt-get install -y python python-pip unzip + else + apt-get install -y python-pip unzip + fi + fi + pip install requests +} +Write_config(){ + cat > ${dowsdns_conf}<<-EOF +{ + "Remote_dns_server":"${dd_remote_dns_server}", + "Remote_dns_port":${dd_remote_dns_port}, + "Rpz_json_path":"./data/rpz.json", + "Local_dns_server":"${dd_local_dns_server}", + "Local_dns_port":${dd_local_dns_port}, + "sni_proxy_on":${dd_sni_proxy_on}, + "Public_Server":${public_server}, + "sni_proxy_ip":"${dd_sni_proxy_ip}" +} +EOF + +} +Read_config(){ + [[ ! -e ${dowsdns_conf} ]] && echo -e "${Error} dowsDNS 配置文件不存在 !" && exit 1 + remote_dns_server=`cat ${dowsdns_conf}|grep "Remote_dns_server"|awk -F ":" '{print $NF}'|sed -r 's/.*\"(.+)\".*/\1/'` + remote_dns_port=`cat ${dowsdns_conf}|grep "Remote_dns_port"|sed -r 's/.*:(.+),.*/\1/'` + local_dns_server=`cat ${dowsdns_conf}|grep "Local_dns_server"|awk -F ":" '{print $NF}'|sed -r 's/.*\"(.+)\".*/\1/'` + local_dns_port=`cat ${dowsdns_conf}|grep "Local_dns_port"|sed -r 's/.*:(.+),.*/\1/'` + sni_proxy_ip=`cat ${dowsdns_conf}|grep "sni_proxy_ip"|awk -F ":" '{print $NF}'|sed -r 's/.*\"(.+)\".*/\1/'` +} +Read_wrcd(){ + [[ ! -e ${dowsdns_wrcd} ]] && echo -e "${Error} dowsDNS 泛域名解析 配置文件不存在 !" && exit 1 + wrcd_json=$(cat -n ${dowsdns_wrcd}|sed '$d;1d;s/\"//g;s/,//g') + wrcd_json_num=$(echo -e "${wrcd_json}"|wc -l) + wrcd_json_num=$(echo $((${wrcd_json_num}+1))) + echo -e "当前 dowsDNS 泛域名解析配置(不要问我为什么是从 2 开始):\n" + echo -e "${wrcd_json}\n" +} +Set_remote_dns_server(){ + echo "请输入 dowsDNS 远程(上游)DNS解析服务器IP" + read -e -p "(默认: 114.114.114.114):" dd_remote_dns_server + [[ -z "${dd_remote_dns_server}" ]] && dd_remote_dns_server="114.114.114.114" + echo +} +Set_remote_dns_port(){ + while true + do + echo -e "请输入 dowsDNS 远程(上游)DNS解析服务器端口 [1-65535]" + read -e -p "(默认: 53):" dd_remote_dns_port + [[ -z "$dd_remote_dns_port" ]] && dd_remote_dns_port="53" + echo $((${dd_remote_dns_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${dd_remote_dns_port} -ge 1 ]] && [[ ${dd_remote_dns_port} -le 65535 ]]; then + echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_remote_dns(){ + echo -e "请选择并输入 dowsDNS 的远程(上游)DNS解析服务器 + 说明:即一些dowsDNS没有指定的域名都由上游DNS解析,比如百度啥的。 + + ${Green_font_prefix}1.${Font_color_suffix} 114.114.114.114 53 + ${Green_font_prefix}2.${Font_color_suffix} 8.8.8.8 53 + ${Green_font_prefix}3.${Font_color_suffix} 208.67.222.222 53 + ${Green_font_prefix}4.${Font_color_suffix} 208.67.222.222 5353 + ${Green_font_prefix}5.${Font_color_suffix} 自定义输入" && echo + read -e -p "(默认: 1. 114.114.114.114 53):" dd_remote_dns + [[ -z "${dd_remote_dns}" ]] && dd_remote_dns="1" + if [[ ${dd_remote_dns} == "1" ]]; then + dd_remote_dns_server="114.114.114.114" + dd_remote_dns_port="53" + elif [[ ${dd_remote_dns} == "2" ]]; then + dd_remote_dns_server="8.8.8.8" + dd_remote_dns_port="53" + elif [[ ${dd_remote_dns} == "3" ]]; then + dd_remote_dns_server="208.67.222.222" + dd_remote_dns_port="53" + elif [[ ${dd_remote_dns} == "4" ]]; then + dd_remote_dns_server="208.67.222.222" + dd_remote_dns_port="5353" + elif [[ ${dd_remote_dns} == "5" ]]; then + echo + Set_remote_dns_server + Set_remote_dns_port + else + dd_remote_dns_server="114.114.114.114" + dd_remote_dns_port="53" + fi + echo && echo " ================================================" + echo -e " 远程(上游)DNS解析服务器 IP :\t ${Red_background_prefix} ${dd_remote_dns_server} ${Font_color_suffix} + 远程(上游)DNS解析服务器 端口 :\t ${Red_background_prefix} ${dd_remote_dns_port} ${Font_color_suffix}" + echo " ================================================" && echo +} +Set_local_dns_server(){ + echo -e "请选择并输入 dowsDNS 的本地监听方式 + ${Green_font_prefix}1.${Font_color_suffix} 127.0.0.1 (只允许本地和局域网设备访问) + ${Green_font_prefix}2.${Font_color_suffix} 0.0.0.0 (允许外网访问)" && echo + read -e -p "(默认: 2. 0.0.0.0):" dd_local_dns_server + [[ -z "${dd_local_dns_server}" ]] && dd_local_dns_server="2" + if [[ ${dd_local_dns_server} == "1" ]]; then + dd_local_dns_server="127.0.0.1" + public_server="false" + elif [[ ${dd_local_dns_server} == "2" ]]; then + dd_local_dns_server="0.0.0.0" + public_server="true" + else + dd_local_dns_server="0.0.0.0" + public_server="true" + fi + echo && echo " ================================================" + echo -e " 本地监听方式: ${Red_background_prefix} ${dd_local_dns_server} ${Font_color_suffix}" + echo " ================================================" && echo +} +Set_local_dns_port(){ + while true + do + echo -e "请输入 dowsDNS 监听端口 [1-65535] + 注意:大部分设备是不支持设置 非53端口的DNS服务器的,所以非必须请直接回车默认使用 53端口。" && echo + read -e -p "(默认: 53):" dd_local_dns_port + [[ -z "$dd_local_dns_port" ]] && dd_local_dns_port="53" + echo $((${dd_local_dns_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${dd_local_dns_port} -ge 1 ]] && [[ ${dd_local_dns_port} -le 65535 ]]; then + echo && echo " ================================================" + echo -e " 监听端口 : ${Red_background_prefix} ${dd_local_dns_port} ${Font_color_suffix}" + echo " ================================================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_sni_proxy_on(){ + echo "是否开启 dowsDNS SNI代理功能?[y/N] + 注意:开启此功能后,任何自定义设置的 hosts或泛域名解析(包括dowsDNS自带的),都指向设置的SNI代理IP,如果你没有SNI代理IP,请输入 N !" + read -e -p "(默认: N 关闭):" dd_sni_proxy_on + [[ -z "${dd_sni_proxy_on}" ]] && dd_sni_proxy_on="n" + if [[ ${dd_sni_proxy_on} == [Yy] ]]; then + dd_sni_proxy_on="true" + else + dd_sni_proxy_on="false" + fi + echo && echo " ================================================" + echo -e " SNI代理开关 : ${Red_background_prefix} ${dd_sni_proxy_on} ${Font_color_suffix}" + echo " ================================================" && echo +} +Set_sni_proxy_ip(){ + ddd_sni_proxy_ip=$(wget --no-check-certificate -t2 -T4 -qO- "https://raw.githubusercontent.com/dowsnature/dowsDNS/master/conf/config.json"|grep "sni_proxy_ip"|awk -F ":" '{print $NF}'|sed -r 's/.*\"(.+)\".*/\1/') + [[ -z ${ddd_sni_proxy_ip} ]] && ddd_sni_proxy_ip="219.76.4.3" + echo "请输入 dowsDNS SNI代理 IP(如果没有就直接回车)" + read -e -p "(默认: ${ddd_sni_proxy_ip}):" dd_sni_proxy_ip + [[ -z "${dd_sni_proxy_ip}" ]] && dd_sni_proxy_ip="${ddd_sni_proxy_ip}" + echo && echo " ================================================" + echo -e " SNI代理 IP : ${Red_background_prefix} ${dd_sni_proxy_ip} ${Font_color_suffix}" + echo " ================================================" && echo +} +Set_conf(){ + Set_remote_dns + Set_local_dns_server + Set_local_dns_port + Set_sni_proxy_on + Set_sni_proxy_ip +} +Set_dowsdns_basis(){ + check_installed_status + Set_conf + Read_config + Del_iptables + Write_config + Add_iptables + Save_iptables + Restart_dowsdns +} +Set_wrcd_name(){ + echo "请输入 dowsDNS 要添加/修改的域名(子域名或泛域名) + 注意:假如你想要 youtube.com 及其二级域名全部指向 指定的IP,那么你需要添加 *.youtube.com 和 youtube.com 这两个域名解析才有效。 + 这意味着 *.youtube.com 仅代表如 www.youtube.com xxx.youtube.com 这样的二级域名,而不能代表一级域名(顶级域名) youtube.com !" + read -e -p "(默认回车取消):" wrcd_name + [[ -z "${wrcd_name}" ]] && echo "已取消..." && exit 0 + echo +} +Set_wrcd_name_1(){ + echo "检测到当前添加的域名为 泛域名,是否自动添加 上级域名(如顶级域名,就是上面示例说的 youtube.com) [Y/n]" + read -e -p "(默认: Y 添加):" wrcd_name_1 + [[ -z "${wrcd_name_1}" ]] && wrcd_name_1="y" + if [[ ${wrcd_name_1} == [Yy] ]]; then + wrcd_name_1=$(echo -e "${wrcd_name}"|cut -c 3-100) + echo -e "检测到 上级域名为 : ${Red_font_prefix}${wrcd_name_1}${Font_color_suffix}" + else + wrcd_name_1="" + echo "已取消...继续..." + fi + echo +} +Set_wrcd_ip(){ + echo "请输入 dowsDNS 刚才添加/修改的域名要指向的IP + 注意:如果你开启了 SNI代理功能(config.json),那么你这里设置的自定义泛域名解析都会被 SNI代理功能的SNI代理IP设置所覆盖,也就是统一指向 SNI代理的IP,这里的IP设置就没意义了。" + read -e -p "(默认回车取消):" wrcd_ip + [[ -z "${wrcd_ip}" ]] && echo "已取消..." && exit 0 + echo +} +Set_dowsdns_wrcd(){ + check_installed_status + echo && echo -e "你要做什么? + ${Green_font_prefix}0.${Font_color_suffix} 查看 泛域名解析列表 + + ${Green_font_prefix}1.${Font_color_suffix} 添加 泛域名解析 + ${Green_font_prefix}2.${Font_color_suffix} 删除 泛域名解析 + ${Green_font_prefix}3.${Font_color_suffix} 修改 泛域名解析" && echo + read -e -p "(默认: 取消):" wrcd_modify + [[ -z "${wrcd_modify}" ]] && echo "已取消..." && exit 1 + if [[ ${wrcd_modify} == "0" ]]; then + Read_wrcd + elif [[ ${wrcd_modify} == "1" ]]; then + Add_wrcd + elif [[ ${wrcd_modify} == "2" ]]; then + Del_wrcd + elif [[ ${wrcd_modify} == "3" ]]; then + Modify_wrcd + else + echo -e "${Error} 请输入正确的数字 [0-3]" && exit 1 + fi +} +Add_wrcd(){ + while true + do + Set_wrcd_name + [[ $(echo -e "${wrcd_name}"|cut -c 1-2) == "*." ]] && Set_wrcd_name_1 + Set_wrcd_ip + sed -i "2 i \"${wrcd_name}\":\"${wrcd_ip}\"," ${dowsdns_wrcd} + if [[ $? == "0" ]]; then + echo -e "${Info} 添加泛域名解析 成功 [${wrcd_name} : ${wrcd_ip}]" + else + echo -e "${Error} 添加泛域名解析 失败!" && exit 0 + fi + if [[ ! -z ${wrcd_name_1} ]]; then + sed -i "2 i \"${wrcd_name_1}\":\"${wrcd_ip}\"," ${dowsdns_wrcd} + if [[ $? == "0" ]]; then + echo -e "${Info} 添加泛域名解析 成功 [${wrcd_name_1} : ${wrcd_ip}]" + else + echo -e "${Error} 添加泛域名解析 失败!" && exit 0 + fi + fi + echo && echo "是否继续添加 泛域名解析?[Y/n]" + read -e -p "(默认: Y 继续添加):" wrcd_add_1 + [[ -z "${wrcd_add_1}" ]] && wrcd_add_1="y" + if [[ ${wrcd_add_1} == [Yy] ]]; then + continue + else + break + fi + done + echo -e "${Info} 重启 dowsDNS中..." + Restart_dowsdns +} +Del_wrcd(){ + while true + do + Read_wrcd + echo "请根据上面的列表选择你要删除的 泛域名解析 序号数字 [ 2-${wrcd_json_num} ]" + read -e -p "(默认回车取消):" del_wrcd_num + [[ -z "$del_wrcd_num" ]] && echo "已取消..." && exit 0 + echo $((${del_wrcd_num}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${del_wrcd_num} -ge 2 ]] && [[ ${del_wrcd_num} -le ${wrcd_json_num} ]]; then + wrcd_text=$(cat ${dowsdns_wrcd}|sed -n "${del_wrcd_num}p") + wrcd_name=$(echo -e "${wrcd_text}"|sed 's/\"//g;s/,//g'|awk -F ":" '{print $1}') + wrcd_ip=$(echo -e "${wrcd_text}"|sed 's/\"//g;s/,//g'|awk -F ":" '{print $2}') + del_wrcd_determine=$(echo ${wrcd_text:((${#wrcd_text} - 1))}) + if [[ ${del_wrcd_num} == ${wrcd_json_num} ]]; then + del_wrcd_determine_num=$(echo $((${del_wrcd_num}-1))) + sed -i "${del_wrcd_determine_num}s/,//g" ${dowsdns_wrcd} + fi + sed -i "${del_wrcd_num}d" ${dowsdns_wrcd} + if [[ $? == "0" ]]; then + echo -e "${Info} 删除泛域名解析 成功 [${wrcd_name} : ${wrcd_ip}]" + else + echo -e "${Error} 删除泛域名解析 失败!" && exit 0 + fi + echo && echo "是否继续删除 泛域名解析?[Y/n]" + read -e -p "(默认: Y 继续删除):" wrcd_del_1 + [[ -z "${wrcd_del_1}" ]] && wrcd_del_1="y" + if [[ ${wrcd_del_1} == [Yy] ]]; then + continue + else + break + fi + else + echo "输入错误, 请输入正确的数字。" + fi + else + echo "输入错误, 请输入正确的数字。" + fi + done + echo -e "${Info} 重启 dowsDNS中..." + Restart_dowsdns +} +Modify_wrcd(){ + while true + do + Read_wrcd + echo "请根据上面的列表选择你要修改的 泛域名解析 序号数字 [ 2-${wrcd_json_num} ]" + read -e -p "(默认回车取消):" modify_wrcd_num + [[ -z "$modify_wrcd_num" ]] && echo "已取消..." && exit 0 + echo $((${modify_wrcd_num}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${modify_wrcd_num} -ge 2 ]] && [[ ${modify_wrcd_num} -le ${wrcd_json_num} ]]; then + wrcd_name_now=$(cat ${dowsdns_wrcd}|sed -n "${modify_wrcd_num}p"|sed 's/\"//g;s/,//g'|awk -F ":" '{print $1}') + wrcd_ip_now=$(cat ${dowsdns_wrcd}|sed -n "${modify_wrcd_num}p"|sed 's/\"//g;s/,//g'|awk -F ":" '{print $2}') + echo + Set_wrcd_name + Set_wrcd_ip + sed -i "${modify_wrcd_num}d" ${dowsdns_wrcd} + sed -i "${modify_wrcd_num} i \"${wrcd_name}\":\"${wrcd_ip}\"," ${dowsdns_wrcd} + #sed -i "s/\"${wrcd_name_now_1}\":\"${wrcd_ip_now}\"/\"${wrcd_name_1}\":\"${wrcd_ip}\"/g" ${dowsdns_wrcd} + if [[ $? == "0" ]]; then + echo -e "${Info} 修改泛域名解析 成功 [旧 ${wrcd_name_now} : ${wrcd_ip_now} , 新 ${wrcd_name} : ${wrcd_ip}]" + else + echo -e "${Error} 修改泛域名解析 失败!" && exit 0 + fi + break + else + echo "输入错误, 请输入正确的数字。" + fi + else + echo "输入错误, 请输入正确的数字。" + fi + done + echo -e "${Info} 重启 dowsDNS中..." + Restart_dowsdns +} +Install_dowsdns(){ + check_root + [[ -e ${file} ]] && echo -e "${Error} 检测到 dowsDNS 已安装 !" && exit 1 + check_sys + echo -e "${Info} 开始设置 用户配置..." + Set_conf + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装..." + Download_dowsdns + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_dowsdns + echo -e "${Info} 开始写入 配置文件..." + Write_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_dowsdns +} +Start_dowsdns(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} dowsDNS 正在运行,请检查 !" && exit 1 + /etc/init.d/dowsdns start +} +Stop_dowsdns(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} dowsDNS 没有运行,请检查 !" && exit 1 + /etc/init.d/dowsdns stop +} +Restart_dowsdns(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/dowsdns stop + /etc/init.d/dowsdns start +} +Update_dowsdns(){ + check_installed_status + check_sys + cd ${file} + python update.py +} +Uninstall_dowsdns(){ + check_installed_status + echo "确定要卸载 dowsDNS ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + Read_config + Del_iptables + Save_iptables + rm -rf ${file} && rm -rf /etc/init.d/dowsdns + if [[ ${release} = "centos" ]]; then + chkconfig --del dowsdns + else + update-rc.d -f dowsdns remove + fi + echo && echo "dowsDNS 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +View_dowsdns(){ + check_installed_status + Read_config + if [[ ${local_dns_server} == "127.0.0.1" ]]; then + ip="${local_dns_server} " + else + ip=`wget -qO- -t1 -T2 members.3322.org/dyndns/getip` + [[ -z ${ip} ]] && ip="VPS_IP" + fi + clear && echo "————————————————" && echo + echo -e " 请在你的设备中设置DNS服务器为: + IP : ${Green_font_prefix}${ip}${Font_color_suffix} ,端口 : ${Green_font_prefix}${local_dns_port}${Font_color_suffix} + + 注意:如果设备中没有 DNS端口设置选项,那么就只能使用默认的 53 端口" + echo && echo "————————————————" +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${dd_local_dns_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${dd_local_dns_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${local_dns_port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${local_dns_port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +View_Log(){ + [[ ! -e ${dowsdns_log} ]] && echo -e "${Error} dowsDNS 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${dowsdns_log}${Font_color_suffix} 命令。" && echo + tail -f ${dowsdns_log} +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/dowsdns.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/dowsdns" ]]; then + rm -rf /etc/init.d/dowsdns + Service_dowsdns + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/dowsdns.sh" && chmod +x dowsdns.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +echo && echo -e " dowsDNS 一键安装管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/dowsdns-jc3 -- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 + ———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 dowsDNS + ${Green_font_prefix} 2.${Font_color_suffix} 升级 dowsDNS + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 dowsDNS +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 dowsDNS + ${Green_font_prefix} 5.${Font_color_suffix} 停止 dowsDNS + ${Green_font_prefix} 6.${Font_color_suffix} 重启 dowsDNS +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 dowsDNS 基础配置 + ${Green_font_prefix} 8.${Font_color_suffix} 设置 dowsDNS 泛域名解析配置 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 dowsDNS 信息 + ${Green_font_prefix}10.${Font_color_suffix} 查看 dowsDNS 日志 +————————————" && echo +if [[ -e ${file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-9]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_dowsdns + ;; + 2) + Update_dowsdns + ;; + 3) + Uninstall_dowsdns + ;; + 4) + Start_dowsdns + ;; + 5) + Stop_dowsdns + ;; + 6) + Restart_dowsdns + ;; + 7) + Set_dowsdns_basis + ;; + 8) + Set_dowsdns_wrcd + ;; + 9) + View_dowsdns + ;; + 10) + View_Log + ;; + *) + echo "请输入正确数字 [0-10]" + ;; +esac \ No newline at end of file diff --git a/gfw_push.sh b/gfw_push.sh new file mode 100644 index 0000000..3132c9f --- /dev/null +++ b/gfw_push.sh @@ -0,0 +1,437 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: 监测IP是否被墙并推送消息至Telegram +# Version: 1.0.4 +# Author: Toyo +# Blog: https://doub.io/shell-jc8/ +#================================================= + +sh_ver="1.0.4" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +Crontab_file="/usr/bin/crontab" +CONF="${file_1}/gfw_push.conf" +LOG_file="${file_1}/gfw_push.log" +Test_link="www.189.cn +biz.10010.com +www.10086.cn" +Test_UA="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 +Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 +Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 +Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER +Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0 +Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134 +Mozilla/5.0 (Linux; Android 8.0.0; MHA-AL00 Build/HUAWEIMHA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 +Mozilla/5.0 (Linux; Android 7.0; LG-H850 Build/NRD90U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36 +Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 +Mozilla/5.0 (iPhone; CPU iPhone OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1 +Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A501 Safari/8536.25 MicroMessenger/6.1.0 +Mozilla/5.0 (iPad; CPU OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + #bit=`uname -m` +} +check_crontab_name(){ + if [[ ${release} == "centos" ]]; then + cron_name="crond" + else + cron_name="cron" + fi +} +check_crontab_monitor_status(){ + crontab -l &> ".crontab_tmp" + sed -i "/no crontab for/d" ".crontab_tmp" + cron_config=$(cat ".crontab_tmp" | grep "gfw_push.sh monitor") + rm -rf ".crontab_tmp" + if [[ -z ${cron_config} ]]; then + return 0 + else + return 1 + fi +} +check_crontab_pid(){ + Cron_PID=$(ps -ef| grep "${cron_name}"| grep -v "grep" | grep -v "init.d" |grep -v "service" |awk '{print $2}') + if [[ -z ${Cron_PID} ]]; then + return 0 + else + return 1 + fi +} +Install_crontab(){ + if [[ ! -e "${Crontab_file}" ]]; then + echo -e "${Error} Crontab 没有安装,开始安装..." + \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + if [[ ${release} == "centos" ]]; then + yum update + yum install "${cron_name}" -y + else + apt-get update + apt-get install "${cron_name}" -y + fi + if [[ ! -e "${Crontab_file}" ]]; then + echo -e "${Error} Crontab 安装失败,请检查!" && exit 1 + else + echo -e "${Info} Crontab 安装成功!" + sleep 2s + check_crontab_pid + [[ $? == 0 ]] && /etc/init.d/${cron_name} start + fi + else + \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + /etc/init.d/${cron_name} restart + fi +} +Set_Name(){ + echo "请输入该服务器的 [别名](可选) +用于推送消息时,使你快速分辨服务器。支持中文,但请勿包含一些特殊符号,否则可能导致推送出错。" + read -e -p "(默认为空):" new_name + echo && echo "========================" + echo -e " 别名 : ${Red_background_prefix} ${new_name} ${Font_color_suffix}" + echo "========================" && echo +} +Set_Token(){ + while true + do + echo -e "请输入推送机器人 [API密匙] +Token,通过 @notificationme_bot 机器人获取。 +获取步骤:向机器人发送 /start 后,机器人会告诉一个API URL,例如:https://tgbot.lbyczf.com/sendMessage/abc,其中的 abc 就是API密匙。" + read -e -p "(不能为空):" new_token + if [[ ! -z "${new_token}" ]]; then + echo && echo "========================" + echo -e " 密匙 : ${Red_background_prefix} ${new_token} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo -e "${Error} 请输入密匙。" + fi + done +} +Write_config(){ + cat > ${CONF}<<-EOF +NAME = ${new_name} +TOKEN = ${new_token} +SILL = ${SILL} +SILL_NOW = ${sill_new} +EOF +} +Write_config_now_sill(){ + new_name="${NAME}" + new_token="${TOKEN}" + Write_config +} +Read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} 脚本配置文件不存在 !" && exit 1 + NAME=$(cat ${CONF}|grep 'NAME = '|awk -F 'NAME = ' '{print $NF}') + #[[ -z "${NAME}" ]] && NAME="NO-NAME" + TOKEN=$(cat ${CONF}|grep 'TOKEN = '|awk -F 'TOKEN = ' '{print $NF}') + [[ -z "${TOKEN}" ]] && echo -e "${Error} 脚本配置文件中API密匙为空(Token) !" && exit 1 + SILL=$(cat ${CONF}|grep 'SILL = '|awk -F 'SILL = ' '{print $NF}') + [[ -z "${SILL}" ]] && SILL="3" + SILL_NOW=$(cat ${CONF}|grep 'SILL_NOW = '|awk -F 'SILL_NOW = ' '{print $NF}') + [[ -z "${SILL_NOW}" ]] && SILL_NOW="0" +} +POST_TG(){ + Get_IP + if [[ -z "${NAME}" ]]; then + wget -qO- --post-data="text=\`[疑似被墙警告]\` — \[\`${IP}\`]&parse_mode=Markdown&disable_notification=false" "https://tgbot.lbyczf.com/sendMessage/${TOKEN}" >> ${LOG_file} + else + wget -qO- --post-data="text=\`[疑似被墙警告]\` — \[${NAME}] (\`${IP}\`)&parse_mode=Markdown&disable_notification=false" "https://tgbot.lbyczf.com/sendMessage/${TOKEN}" >> ${LOG_file} + fi + echo "" >> ${LOG_file} +} +Get_IP(){ + IP=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${IP}" ]]; then + IP=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${IP}" ]]; then + IP=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${IP}" ]]; then + IP="IP获取失败" + fi + fi + fi +} +Add_Crontab(){ + crontab -l &> "$file_1/crontab.bak" + sed -i "/no crontab for/d" "$file_1/crontab.bak" + sed -i "/gfw_push.sh monitor/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/gfw_push.sh monitor" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + check_crontab_monitor_status + if [[ $? == 0 ]]; then + echo -e "${Error} 定时监控功能添加失败,请检查 !" && exit 1 + else + echo -e "${Info} 定时监控功能添加成功 !" + fi +} +Del_Crontab(){ + crontab -l &> "$file_1/crontab.bak" + sed -i "/no crontab for/d" "$file_1/crontab.bak" + sed -i "/gfw_push.sh monitor/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + check_crontab_monitor_status + if [[ $? == 1 ]]; then + echo -e "${Error} 定时监控功能取消失败,请检查 !" && exit 1 + else + echo -e "${Info} 定时监控功能取消成功 !" + fi +} +rand(){ + rand_min=$1 + rand_max=$(($2-$rand_min+1)) + rand_num=$(date +%s%N) + echo $(($rand_num%$rand_max+$rand_min)) +} +Test_SILL(){ + Detailed_output="${1}" + Read_config + echo "${SILL_NOW}|${SILL}" + if [[ "${SILL_NOW}" == "${SILL}" ]]; then + echo -e "${Error} 短时间内检测IP状态结果为被墙的次数已达到阈值 [${SILL}],将不会继续检测。跳过..." && exit 1 + elif [[ "${SILL_NOW}" > "${SILL}" ]]; then + sill_new="${SILL}" + Write_config_now_sill + echo -e "${Error} 短时间内检测IP状态结果为被墙的次数已达到阈值 [${SILL}],将不会继续检测。跳过..." && exit 1 + else + Test + fi +} +Test(){ + Detailed_output="${1}" + all_status_num="0" + Return_status_debug="" + status_num_debug="" + Test_total=$(echo "${Test_link}"|wc -l) + for((integer = 1; integer <= ${Test_total}; integer++)) + do + UA_num=$(rand 1 12) + UA=$(echo "${Test_UA}"|sed -n "${UA_num}p") + now_URL=$(echo "${Test_link}"|sed -n "${integer}p") + wget --spider -nv -t2 -T5 -4 -U "${UA}" "${now_URL}" -o "http_code.tmp" + #wget --spider -nv -t2 -T5 -U "${UA}" "${now_URL}" &> /dev/null + return_code=$(echo $?) + #cat "http_code.tmp" + #Return_status=$(cat "http_code.tmp"|sed -n '$p'|awk '{print $NF}') + Return_status_debug="${Return_status_debug} | $(cat "http_code.tmp")" + return_code_debug="${return_code_debug} | ${return_code}" + #Return_status_debug="${Return_status_debug} | ${return_code}" + #echo "${Return_status}" + rm -rf "http_code.tmp" + if [[ "${return_code}" == "0" ]]; then + status_num="1" + status_num_debug="${status_num_debug} | ${status_num}" + [[ "${Detailed_output}" == "1" ]] && echo -e "${Info} 正常连接至 [${now_URL}] 。" + else + status_num="0" + status_num_debug="${status_num_debug} | ${status_num}" + [[ "${Detailed_output}" == "1" ]] && echo -e "${Error} 无法连接至 [${now_URL}] 。" + fi + all_status_num=$(echo $((${all_status_num}+${status_num}))) + done +} +crontab_monitor(){ + Test_SILL + DATE=$(date "+%Y/%m/%d %H:%M:%S") + if [[ "${all_status_num}" == "${Test_total}" ]]; then + sill_new="0" + Write_config_now_sill + echo -e "${Info} ${DATE} 全部 URL 测试通过!该服务器没有被墙。"| tee -a ${LOG_file} + elif [[ "${all_status_num}" == "0" ]]; then + sill_new=$(echo $((${SILL_NOW}+1))) + Write_config_now_sill + echo "${Return_status_debug} / ${return_code_debug} / ${status_num_debug} / ${all_status_num}" >> ${LOG_file} + echo -e "${Error} ${DATE} 全部 URL 测试失败!该服务器可能被墙,累计次数中..."| tee -a ${LOG_file} + if [[ "${sill_new}" == "3" ]]; then + echo -e "${Error} ${DATE} 疑似被墙次数累计超过 ${Test_total} 次,开始推送..."| tee -a ${LOG_file} + POST_TG + fi + else + sill_new="0" + Write_config_now_sill + echo -e "${Info} ${DATE} 部分 URL 测试通过!该服务器没有被墙,但可能与大陆链接的线路存在问题。"| tee -a ${LOG_file} + fi +} +Init_config(){ + Set_Name + Set_Token + Install_crontab + Add_Crontab + SILL="3" + sill_new="0" + Write_config + echo -e "${Info} 初始化配置完成,目前已启动定时检测IP被墙状态。" +} +Uninstall_config(){ + echo -e "确定要卸载(即清除定时任务及脚本配置文件) ? (y/N)" + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + if [[ -e "${Crontab_file}" ]]; then + Del_Crontab + fi + [[ -e "${CONF}" ]] && rm -rf "${CONF}" + [[ -e "${LOG_file}" ]] && rm -rf "${LOG_file}" + echo && echo "卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +Manual_detection(){ + Test "1" + if [[ "${all_status_num}" == "${Test_total}" ]]; then + echo -e "${Info} 全部 URL 测试通过!该服务器没有被墙。" + elif [[ "${all_status_num}" == "0" ]]; then + echo -e "${Error} 全部 URL 测试失败!该服务器可能被墙。" + else + echo -e "${Info} 部分 URL 测试通过!该服务器没有被墙,但可能与大陆链接的线路存在问题。" + fi +} +Stop_monitor(){ + check_crontab_monitor_status + if [[ $? == 1 ]]; then + Read_config + Del_Crontab + else + echo -e "${Error} 检测IP定时任务已经暂停。" + fi +} +restart_monitor(){ + check_crontab_monitor_status + if [[ $? == 1 ]]; then + Read_config + new_name="${NAME}" + new_token="${TOKEN}" + sill_new="0" + Write_config + echo -e "${Info} 检测IP阈值已归零。" + else + Read_config + Add_Crontab + fi +} +Set_config(){ + Read_config + Set_Name + Set_Token + sill_new=${SILL_NOW} + Write_config + echo -e "${Info} 修改配置完成。" +} +View_config(){ + Read_config + Get_IP + echo -e "\n脚本配置信息: +———————————————— + 地址\t: ${Green_font_prefix}${IP}${Font_color_suffix} + 别名\t: ${Green_font_prefix}${NAME}${Font_color_suffix} + 密匙\t: ${Green_font_prefix}${TOKEN}${Font_color_suffix} + 阈值\t: ${Green_font_prefix}${SILL_NOW}/${SILL}${Font_color_suffix}\n" +} +View_Log(){ + [[ ! -e ${LOG_file} ]] && echo -e "${Error} 脚本日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志(正常情况是没有使用日志记录的)" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${LOG_file}${Font_color_suffix} 命令。" && echo + tail -f ${LOG_file} +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/gfw_push.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/gfw_push.sh" && chmod +x gfw_push.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +check_crontab_name +action=$1 +if [[ "${action}" == "monitor" ]]; then + crontab_monitor +else + echo && echo -e " 监测IP是否被墙脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/shell-jc8 ---- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 初始化 + ${Green_font_prefix} 2.${Font_color_suffix} 卸 载 +———————————— + ${Green_font_prefix} 3.${Font_color_suffix} 手动 检测IP + ${Green_font_prefix} 4.${Font_color_suffix} 暂停 监测IP + ${Green_font_prefix} 5.${Font_color_suffix} 重启 监测IP(或清零阈值) + —— 当暂停或脚本推送三次IP被墙信息后, + 可以用该选项使脚本继续监测IP。 +———————————— + ${Green_font_prefix} 6.${Font_color_suffix} 设置 配置信息 + ${Green_font_prefix} 7.${Font_color_suffix} 查看 配置信息 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 日志信息 +————————————" && echo + if [[ -e "${Crontab_file}" ]]; then + check_crontab_monitor_status + if [[ $? == 0 ]]; then + echo -e " 当前状态: ${Red_font_prefix}未启动监测${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已启动监测${Font_color_suffix}" + fi + check_crontab_pid + [[ $? == 0 ]] && echo -e " ${Error} 检查到 Crontab 没有运行,如果不是主动关闭的,请手动启动:/etc/init.d/${cron_name} start" + else + echo -e " 当前状态: ${Red_font_prefix}Crontab 未安装${Font_color_suffix}" + fi + echo + read -e -p " 请输入数字 [0-8]:" num + case "$num" in + 0) + Update_Shell + ;; + 1) + Init_config + ;; + 2) + Uninstall_config + ;; + 3) + Manual_detection + ;; + 4) + Stop_monitor + ;; + 5) + restart_monitor + ;; + 6) + Set_config + ;; + 7) + View_config + ;; + 8) + View_Log + ;; + *) + echo "请输入正确数字 [0-8]" + ;; + esac +fi \ No newline at end of file diff --git a/goflyway.sh b/goflyway.sh new file mode 100644 index 0000000..9d53d0e --- /dev/null +++ b/goflyway.sh @@ -0,0 +1,688 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: GoFlyway +# Version: 1.0.11 +# Author: Toyo +# Blog: https://doub.io/goflyway-jc2/ +#================================================= + +sh_ver="1.0.11" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +Folder="/usr/local/goflyway" +File="/usr/local/goflyway/goflyway" +CONF="/usr/local/goflyway/goflyway.conf" +Now_ver_File="/usr/local/goflyway/ver.txt" +Log_File="/usr/local/goflyway/goflyway.log" +Crontab_file="/usr/bin/crontab" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${File} ]] && echo -e "${Error} GoFlyway 没有安装,请检查 !" && exit 1 +} +check_crontab_installed_status(){ + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 没有安装,开始安装..." + if [[ ${release} == "centos" ]]; then + yum install crond -y + else + apt-get install cron -y + fi + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 安装失败,请检查!" && exit 1 + else + echo -e "${Info} Crontab 安装成功!" + fi + fi +} +check_pid(){ + PID=$(ps -ef| grep "goflyway"| grep -v grep| grep -v "goflyway.sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}') +} +check_new_ver(){ + new_ver=$(wget --no-check-certificate -qO- -t1 -T3 https://api.github.com/repos/coyove/goflyway/releases| grep "tag_name"|grep -v "caddy"| head -n 1| awk -F ":" '{print $2}'| sed 's/\"//g;s/,//g;s/ //g') + if [[ -z ${new_ver} ]]; then + echo -e "${Error} GoFlyway 最新版本获取失败,请手动获取最新版本号[ https://github.com/coyove/goflyway/releases ]" + read -e -p "请输入版本号 [ 格式如 1.3.0a ] :" new_ver + [[ -z "${new_ver}" ]] && echo "取消..." && exit 1 + else + echo -e "${Info} 检测到 GoFlyway 最新版本为 [ ${new_ver} ]" + fi +} +check_ver_comparison(){ + now_ver=$(cat ${Now_ver_File}) + [[ -z ${now_ver} ]] && echo "${new_ver}" > ${Now_ver_File} + if [[ ${now_ver} != ${new_ver} ]]; then + echo -e "${Info} 发现 GoFlyway 已有新版本 [ ${new_ver} ],当前版本 [ ${now_ver} ]" + read -e -p "是否更新 ? [Y/n] :" yn + [[ -z "${yn}" ]] && yn="y" + if [[ $yn == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + cp "${CONF}" "/tmp/goflyway.conf" + rm -rf ${Folder} + mkdir ${Folder} + Download_goflyway + mv "/tmp/goflyway.conf" "${CONF}" + Start_goflyway + fi + else + echo -e "${Info} 当前 GoFlyway 已是最新版本 [ ${new_ver} ]" && exit 1 + fi +} +Download_goflyway(){ + cd ${Folder} + if [[ ${bit} == "x86_64" ]]; then + wget --no-check-certificate -N "https://github.com/coyove/goflyway/releases/download/${new_ver}/goflyway_linux_amd64.tar.gz" + mv goflyway_linux_amd64.tar.gz goflyway_linux.tar.gz + else + wget --no-check-certificate -N "https://github.com/coyove/goflyway/releases/download/${new_ver}/goflyway_linux_386.tar.gz" + mv goflyway_linux_386.tar.gz goflyway_linux.tar.gz + fi + [[ ! -e "goflyway_linux.tar.gz" ]] && echo -e "${Error} GoFlyway 下载失败 !" && exit 1 + tar -xzf goflyway_linux.tar.gz + [[ ! -e "goflyway" ]] && echo -e "${Error} GoFlyway 解压失败 !" && rm -f goflyway_linux.tar.gz && exit 1 + rm -f goflyway_linux.tar.gz + chmod +x goflyway + ./goflyway -gen-ca + echo "${new_ver}" > ${Now_ver_File} +} +Service_goflyway(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/goflyway_centos -O /etc/init.d/goflyway; then + echo -e "${Error} GoFlyway 服务管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/goflyway + chkconfig --add goflyway + chkconfig goflyway on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/goflyway_debian -O /etc/init.d/goflyway; then + echo -e "${Error} GoFlyway 服务管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/goflyway + update-rc.d -f goflyway defaults + fi + echo -e "${Info} GoFlyway 服务管理脚本下载完成 !" +} +Installation_dependency(){ + mkdir ${Folder} +} +Write_config(){ + cat > ${CONF}<<-EOF +port=${new_port} +passwd=${new_passwd} +protocol=${new_protocol} +proxy_pass=${new_proxy_pass} +EOF +} +Read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} GoFlyway 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep "port"|awk -F "=" '{print $NF}') + passwd=$(cat ${CONF}|grep "passwd"|awk -F "=" '{print $NF}') + proxy_pass=$(cat ${CONF}|grep "proxy_pass"|awk -F "=" '{print $NF}') + protocol=$(cat ${CONF}|grep "protocol"|awk -F "=" '{print $NF}') + if [[ -z "${protocol}" ]]; then + protocol="http" + new_protocol="http" + new_port="${port}" + new_passwd="${passwd}" + new_proxy_pass="${proxy_pass}" + Write_config + fi +} +Set_port(){ + while true + do + echo -e "请输入 GoFlyway 监听端口 [1-65535](如果要伪装或者套CDN,那么只能使用端口:80 8080 8880 2052 2082 2086 2095)" + read -e -p "(默认: 8880):" new_port + [[ -z "${new_port}" ]] && new_port="8880" + echo $((${new_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${new_port} -ge 1 ]] && [[ ${new_port} -le 65535 ]]; then + echo && echo "========================" + echo -e " 端口 : ${Red_background_prefix} ${new_port} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_passwd(){ + echo "请输入 GoFlyway 密码" + read -e -p "(默认: doub.io):" new_passwd + [[ -z "${new_passwd}" ]] && new_passwd="doub.io" + echo && echo "========================" + echo -e " 密码 : ${Red_background_prefix} ${new_passwd} ${Font_color_suffix}" + echo "========================" && echo +} +Set_proxy_pass(){ + echo "请输入 GoFlyway 要伪装的网站(反向代理,只支持 HTTP:// 网站)" + read -e -p "(默认不伪装):" new_proxy_pass + if [[ ! -z ${new_proxy_pass} ]]; then + echo && echo "========================" + echo -e " 伪装 : ${Red_background_prefix} ${new_proxy_pass} ${Font_color_suffix}" + echo "========================" && echo + fi +} +Set_protocol(){ + echo -e "请选择 GoFlyway 传输协议 + + ${Green_font_prefix}1.${Font_color_suffix} HTTP (默认,要使用 CDN、WebSocket 则必须选择 HTTP 协议) + ${Green_font_prefix}2.${Font_color_suffix} KCP (将 TCP 数据转为 KCP,并通过UDP方式传输,可复活被TCP阻断的IP) + ${Tip} 如果使用 KCP 协议,那么将不能使用 CDN、WebSocket。另外,部分地区对海外的UDP链接会QOS限速,这可能导致 KCP 协议速度不理想。" && echo + read -e -p "(默认: 1. HTTP):" new_protocol + [[ -z "${new_protocol}" ]] && new_protocol="3" + if [[ ${new_protocol} == "1" ]]; then + new_protocol="http" + elif [[ ${new_protocol} == "2" ]]; then + new_protocol="kcp" + else + new_protocol="http" + fi + echo && echo "========================" + echo -e " 协议 : ${Red_background_prefix} ${new_protocol^^} ${Font_color_suffix}" + echo "========================" && echo +} +Set_conf(){ + Set_port + Set_passwd + Set_protocol + Set_proxy_pass +} +Modify_port(){ + Read_config + Set_port + new_passwd="${passwd}" + new_proxy_pass="${proxy_pass}" + new_protocol="${protocol}" + Del_iptables + Write_config + Add_iptables + Save_iptables + Restart_goflyway +} +Modify_passwd(){ + Read_config + Set_passwd + new_port="${port}" + new_proxy_pass="${proxy_pass}" + new_protocol="${protocol}" + Write_config + Restart_goflyway +} +Modify_proxy_pass(){ + Read_config + Set_proxy_pass + new_port="${port}" + new_passwd="${passwd}" + new_protocol="${protocol}" + Write_config + Restart_goflyway +} +Modify_protocol(){ + Read_config + Set_protocol + new_port="${port}" + new_passwd="${passwd}" + new_proxy_pass="${proxy_pass}" + Write_config + Restart_goflyway +} +Modify_all(){ + Read_config + Set_conf + Del_iptables + Write_config + Add_iptables + Save_iptables + Restart_goflyway +} +Set_goflyway(){ + check_installed_status + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 修改 端口配置 + ${Green_font_prefix}2.${Font_color_suffix} 修改 密码配置 + ${Green_font_prefix}3.${Font_color_suffix} 修改 传输协议 + ${Green_font_prefix}4.${Font_color_suffix} 修改 伪装配置(反向代理) + ${Green_font_prefix}5.${Font_color_suffix} 修改 全部配置 +———————————————— + ${Green_font_prefix}6.${Font_color_suffix} 监控 运行状态 + + ${Tip} 用户的端口是不能重复的,密码可以重复 !" && echo + read -e -p "(默认: 取消):" gf_modify + [[ -z "${gf_modify}" ]] && echo "已取消..." && exit 1 + if [[ ${gf_modify} == "1" ]]; then + Modify_port + elif [[ ${gf_modify} == "2" ]]; then + Modify_passwd + elif [[ ${gf_modify} == "3" ]]; then + Modify_protocol + elif [[ ${gf_modify} == "4" ]]; then + Modify_proxy_pass + elif [[ ${gf_modify} == "5" ]]; then + Modify_all + elif [[ ${gf_modify} == "6" ]]; then + Set_crontab_monitor_goflyway + else + echo -e "${Error} 请输入正确的数字(1-6)" && exit 1 + fi +} +Install_goflyway(){ + check_root + [[ -e ${File} ]] && echo -e "${Error} 检测到 GoFlyway 已安装 !" && exit 1 + echo -e "${Info} 开始设置 用户配置..." + Set_conf + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始检测最新版本..." + check_new_ver + echo -e "${Info} 开始下载/安装..." + Download_goflyway + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_goflyway + echo -e "${Info} 开始写入 配置文件..." + Write_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_goflyway +} +Start_goflyway(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} GoFlyway 正在运行,请检查 !" && exit 1 + /etc/init.d/goflyway start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View_goflyway +} +Stop_goflyway(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} GoFlyway 没有运行,请检查 !" && exit 1 + /etc/init.d/goflyway stop +} +Restart_goflyway(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/goflyway stop + /etc/init.d/goflyway start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View_goflyway +} +Update_goflyway(){ + check_installed_status + check_new_ver + check_ver_comparison +} +Uninstall_goflyway(){ + check_installed_status + echo "确定要卸载 GoFlyway ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + Read_config + Del_iptables + Save_iptables + rm -rf ${Folder} + if [[ ${release} = "centos" ]]; then + chkconfig --del goflyway + else + update-rc.d -f goflyway remove + fi + rm -rf /etc/init.d/goflyway + echo && echo "GoFlyway 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +View_goflyway(){ + check_installed_status + Read_config + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi + [[ -z ${proxy_pass} ]] && proxy_pass="无" + link_qr + clear && echo "————————————————" && echo + echo -e " GoFlyway 信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " 端口\t: ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " 密码\t: ${Green_font_prefix}${passwd}${Font_color_suffix}" + echo -e " 协议\t: ${Green_font_prefix}${protocol^^}${Font_color_suffix}" + echo -e " 伪装\t: ${Green_font_prefix}${proxy_pass}${Font_color_suffix}" + echo -e "${link}" + echo -e "${Tip} 链接仅适用于Windows系统的 Goflyway Tools 客户端(https://doub.io/dbrj-11/)。" + echo && echo "————————————————" +} +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n//g;ta'|sed 's/=//g;s/+/-/g;s/\//_/g') + echo -e "${date}" +} +link_qr(){ + PWDbase64=$(urlsafe_base64 "${passwd}") + base64=$(urlsafe_base64 "${ip}:${port}@${PWDbase64}:${protocol}") + url="goflyway://${base64}" + QRcode="http://doub.pw/qr/qr.php?text=${url}" + link=" 链接\t: ${Red_font_prefix}${url}${Font_color_suffix} \n 二维码 : ${Red_font_prefix}${QRcode}${Font_color_suffix} \n " +} +View_Log(){ + check_installed_status + [[ ! -e ${Log_File} ]] && echo -e "${Error} GoFlyway 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${Log_File}${Font_color_suffix} 命令。" && echo + tail -f ${Log_File} +} +# 显示 连接信息 +debian_View_user_connection_info(){ + format_1=$1 + Read_config + user_port=${port} + user_IP_1=$(netstat -anp |grep 'ESTABLISHED' |grep 'goflyway' |grep 'tcp6' |grep ":${user_port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}") + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP_1}") + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi + user_IP="" +} +centos_View_user_connection_info(){ + format_1=$1 + Read_config + user_port=${port} + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'goflyway' |grep 'tcp' |grep ":${user_port} "|grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP_1}") + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi + user_IP="" +} +View_user_connection_info(){ + check_installed_status + echo && echo -e "请选择要显示的格式: + ${Green_font_prefix}1.${Font_color_suffix} 显示 IP 格式 + ${Green_font_prefix}2.${Font_color_suffix} 显示 IP+IP归属地 格式" && echo + read -e -p "(默认: 1):" goflyway_connection_info + [[ -z "${goflyway_connection_info}" ]] && goflyway_connection_info="1" + if [[ "${goflyway_connection_info}" == "1" ]]; then + View_user_connection_info_1 "" + elif [[ "${goflyway_connection_info}" == "2" ]]; then + echo -e "${Tip} 检测IP归属地(ipip.net),如果IP较多,可能时间会比较长..." + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} 请输入正确的数字(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + #echo "user_IP_1=${user_IP_1}" + if [[ ! -z ${user_IP_1} ]]; then + #echo "user_IP_total=${user_IP_total}" + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=$(echo "${user_IP_1}" |sed -n "$integer_1"p) + #echo "IP=${IP}" + IP_address=$(wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g') + #echo "IP_address=${IP_address}" + #user_IP="${user_IP}\n${IP}(${IP_address})" + echo -e "${Green_font_prefix}${IP}${Font_color_suffix} (${IP_address})" + #echo "user_IP=${user_IP}" + sleep 1s + done + fi +} +Set_crontab_monitor_goflyway(){ + check_crontab_installed_status + crontab_monitor_goflyway_status=$(crontab -l|grep "goflyway.sh monitor") + if [[ -z "${crontab_monitor_goflyway_status}" ]]; then + echo && echo -e "当前监控模式: ${Green_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}Goflyway 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 Goflyway 服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_goflyway_status_ny + [[ -z "${crontab_monitor_goflyway_status_ny}" ]] && crontab_monitor_goflyway_status_ny="y" + if [[ ${crontab_monitor_goflyway_status_ny} == [Yy] ]]; then + crontab_monitor_goflyway_cron_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Green_font_prefix}Goflyway 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 Goflyway 服务端)[y/N]" + read -e -p "(默认: n):" crontab_monitor_goflyway_status_ny + [[ -z "${crontab_monitor_goflyway_status_ny}" ]] && crontab_monitor_goflyway_status_ny="n" + if [[ ${crontab_monitor_goflyway_status_ny} == [Yy] ]]; then + crontab_monitor_goflyway_cron_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_goflyway_cron_start(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/goflyway.sh monitor/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/goflyway.sh monitor" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "goflyway.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Goflyway 服务端运行状态监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} Goflyway 服务端运行状态监控功能 启动成功 !" + fi +} +crontab_monitor_goflyway_cron_stop(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/goflyway.sh monitor/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "goflyway.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Goflyway 服务端运行状态监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} Goflyway 服务端运行状态监控功能 停止成功 !" + fi +} +crontab_monitor_goflyway(){ + check_installed_status + check_pid + echo "${PID}" + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 Goflyway服务端 未运行 , 开始启动..." | tee -a ${Log_File} + /etc/init.d/goflyway start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Goflyway服务端 启动失败..." | tee -a ${Log_File} + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Goflyway服务端 启动成功..." | tee -a ${Log_File} + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Goflyway服务端 进程运行正常..." | tee -a ${Log_File} + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${new_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${new_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/goflyway.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/goflyway" ]]; then + rm -rf /etc/init.d/goflyway + Service_goflyway + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/goflyway.sh" && chmod +x goflyway.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +action=$1 +if [[ "${action}" == "monitor" ]]; then + crontab_monitor_goflyway +else +echo && echo -e " GoFlyway 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/goflyway-jc2 -- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 GoFlyway + ${Green_font_prefix} 2.${Font_color_suffix} 升级 GoFlyway + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 GoFlyway +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 GoFlyway + ${Green_font_prefix} 5.${Font_color_suffix} 停止 GoFlyway + ${Green_font_prefix} 6.${Font_color_suffix} 重启 GoFlyway +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 账号配置 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 账号信息 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 日志信息 + ${Green_font_prefix}10.${Font_color_suffix} 查看 链接信息 +————————————" && echo +if [[ -e ${File} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-10]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_goflyway + ;; + 2) + Update_goflyway + ;; + 3) + Uninstall_goflyway + ;; + 4) + Start_goflyway + ;; + 5) + Stop_goflyway + ;; + 6) + Restart_goflyway + ;; + 7) + Set_goflyway + ;; + 8) + View_goflyway + ;; + 9) + View_Log + ;; + 10) + View_user_connection_info + ;; + *) + echo "请输入正确数字 [0-10]" + ;; +esac +fi \ No newline at end of file diff --git a/gogo.sh b/gogo.sh new file mode 100644 index 0000000..8f69e68 --- /dev/null +++ b/gogo.sh @@ -0,0 +1,239 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/java/jre/bin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: GoGo Server +# Version: 1.0.0 +# Author: Toyo +# Blog: https://doub.io/wlzy-24/ +#================================================= + +gogo_directory="/etc/gogoserver" +gogo_file="/etc/gogoserver/gogo-server.jar" +java_directory="/usr/java" +java_file="/usr/java/jre" +profile_file="/etc/profile" +httpsport="8443" + +#检查是否安装gogo +check_gogo(){ + [[ ! -e ${gogo_file} ]] && echo -e "\033[41;37m [错误] \033[0m 没有安装GoGo,请检查 !" && exit 1 +} +#检查是否安装java +check_java(){ + java_check=`java -version` + [[ -z ${java_check} ]] && echo -e "\033[41;37m [错误] \033[0m 没有安装JAVA,请检查 !" && exit 1 +} +#检查系统 +check_sys(){ + bit=`uname -m` +} +# 安装java +installjava(){ + mkdir ${java_directory} + cd ${java_directory} + check_sys +# 系统判断 + if [ ${bit} == "x86_64" ]; then + wget -N -O java.tar.gz "http://javadl.oracle.com/webapps/download/AutoDL?BundleId=216424" + elif [ ${bit} == "i386" ]; then + wget -N -O java.tar.gz "http://javadl.oracle.com/webapps/download/AutoDL?BundleId=216422" + else + echo -e "\033[41;37m [错误] \033[0m 不支持 ${bit} !" && exit 1 + fi + tar zxvf java.tar.gz + jre_file=`ls -a | grep 'jre'` + mv ${jre_file} jre + rm -rf java.tar.gz +# 设置java环境变量 + echo '#set java JDK +JAVA_HOME=/usr/java/jre +JRE_HOME=/usr/java/jre/jre/ +PATH=$PATH:$JAVA_HOME/bin:$JRE_home/bin +CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar +export JAVA_HOME +export JRE_HOME +export PATH +export CLASSPATH' >> ${profile_file} + source ${profile_file} +#判断java是否安装成功 + #java_check=`java -version` + #[[ -z ${java_check} ]] && echo -e "\033[41;37m [错误] \033[0m 安装 JAVA 失败,请检查 !" && exit 1 +} +# 安装gogo +installgogo(){ +# 判断是否安装gogo + [[ -e ${gogo_file} ]] && echo -e "\033[41;37m [错误] \033[0m 已经安装 GoGo,请检查 !" && exit 1 +# 判断是否安装java + #java_check=`java -version` + if [[ ! -e ${java_directory} ]]; then + echo -e "\033[42;37m [信息] \033[0m 没有检测到安装 JAVA,开始安装..." + installjava + fi + chmod +x /etc/rc.local + mkdir ${gogo_directory} + cd ${gogo_directory} + wget -N -O gogo-server.jar --no-check-certificate "https://gogohome.herokuapp.com/getLatestGoGoServer" + #判断gogo是否下载成功 + if [[ ! -e ${gogo_file} ]]; then + echo -e "\033[41;37m [错误] \033[0m 下载GoGo失败,请检查 !" && exit 1 + else + startgogo + fi +} +setgogo(){ +#设置端口 + while true + do + echo -e "请输入GoGo Server 的 HTTP监听端口 [1-65535]:" + read -e -p "(默认端口: 8080):" httpport + [ -z "$httpport" ] && httpport="8080" + expr ${httpport} + 0 &>/dev/null + if [ $? -eq 0 ]; then + if [ ${httpport} -ge 1 ] && [ ${httpport} -le 65535 ]; then + echo + echo "——————————————————————————————" + echo -e " 端口 : \033[41;37m ${httpport} \033[0m" + echo "——————————————————————————————" + echo + break + else + echo "输入错误,请输入正确的数字 !" + fi + else + echo "输入错误,请输入正确的数字 !" + fi + done +} +# 查看gogo列表 +viewgogo(){ +# 检查是否安装 + check_gogo + + PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` + [[ -z $PID ]] && echo -e "\033[42;37m [信息] \033[0m GoGo 没有运行 !" && exit 1 + + gogo_http_port=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $12}'` +# 获取IP + ip=`curl -m 10 -s http://members.3322.org/dyndns/getip` + [[ -z $ip ]] && ip="vps_ip" + echo + echo "——————————————————————————————" + echo " GoGo Server 配置信息: " + echo + echo -e " 本地 IP : \033[41;37m ${ip} \033[0m" + echo -e " HTTP监听端口 : \033[41;37m ${gogo_http_port} \033[0m" + echo -e " HTTPS监听端口 : \033[41;37m ${httpsport} \033[0m" + echo "——————————————————————————————" + echo +} +# 启动aProxy +startgogo(){ +# 检查是否安装 + check_gogo +# 判断进程是否存在 + PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` + [[ ! -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m 发现 GoGo 正在运行,请检查 !" && exit 1 + cd ${gogo_directory} + setgogo + nohup java -Xmx300m -jar gogo-server.jar ${httpport} &>/dev/null & + sleep 2s + PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` + [[ -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m GoGo 启动失败 !" && exit 1 + iptables -I INPUT -p tcp --dport ${httpport} -j ACCEPT + iptables -I INPUT -p udp --dport ${httpport} -j ACCEPT + iptables -I INPUT -p tcp --dport ${httpsport} -j ACCEPT + iptables -I INPUT -p udp --dport ${httpsport} -j ACCEPT +# 系统判断,开机启动 + check_sys + if [[ ${release} == "debian" ]]; then + sed -i '$d' /etc/rc.local + echo -e "nohup java -Xmx300m -jar gogo-server.jar ${httpport} &>/dev/null &" >> /etc/rc.local + echo -e "exit 0" >> /etc/rc.local + else + echo -e "nohup java -Xmx300m -jar gogo-server.jar ${httpport} &>/dev/null &" >> /etc/rc.local + fi + + clear + echo + echo "——————————————————————————————" + echo + echo " GoGo 已启动 !" + viewgogo +} +# 停止aProxy +stopgogo(){ +# 检查是否安装 + check_gogo +# 判断进程是否存在 + PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` + [[ -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m 发现 GoGo 没有运行,请检查 !" && exit 1 + gogo_http_port=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $12}'` + sed -i "/nohup java -Xmx300m -jar gogo-server.jar ${gogo_http_port} &>\/dev\/null &/d" /etc/rc.local + iptables -D INPUT -p tcp --dport ${gogo_http_port} -j ACCEPT + iptables -D INPUT -p udp --dport ${gogo_http_port} -j ACCEPT + iptables -D INPUT -p tcp --dport ${httpsport} -j ACCEPT + iptables -D INPUT -p udp --dport ${httpsport} -j ACCEPT + kill -9 ${PID} + sleep 2s + PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` + if [[ ! -z $PID ]]; then + echo -e "\033[41;37m [错误] \033[0m GoGo 停止失败 !" && exit 1 + else + echo " GoGo 已停止 !" + fi +} +restartgogo(){ +# 检查是否安装 + check_gogo + PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` + [[ ! -z $PID ]] && stopgogo + startgogo +} +statusgogo(){ +# 检查是否安装 + check_gogo +# 判断进程是否存在 + PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` + if [[ ! -z $PID ]]; then + echo -e "\033[42;37m [信息] \033[0m GoGo 正在运行,PID: ${PID} !" + else + echo -e "\033[42;37m [信息] \033[0m GoGo 没有运行 !" + fi +} +uninstallgogo(){ +# 检查是否安装 + check_gogo + printf "确定要卸载 GoGo ? (y/N)" + printf "\n" + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` + [[ ! -z $PID ]] && stopgogo + rm -rf ${gogo_directory} + sed -i "/nohup java -Xmx300m -jar gogo-server.jar ${gogo_http_port} &>\/dev\/null &/d" /etc/rc.local + [[ -e ${gogo_directory} ]] && echo -e "\033[41;37m [错误] \033[0m GoGo卸载失败,请检查 !" && exit 1 + echo + echo " GoGo 已卸载 !" + echo + else + echo + echo "卸载已取消..." + echo + fi +} + +action=$1 +[[ -z $1 ]] && action=install +case "$action" in + install|view|start|stop|restart|status|uninstall) + ${action}gogo + ;; + *) + echo "输入错误 !" + echo "用法: { install | view | start | stop | restart | status | uninstall }" + ;; +esac \ No newline at end of file diff --git a/haproxy.sh b/haproxy.sh new file mode 100644 index 0000000..e356f9a --- /dev/null +++ b/haproxy.sh @@ -0,0 +1,273 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: HaProxy +# Version: 1.0.7 +# Author: Toyo +# Blog: https://doub.io/wlzy-19/ +#================================================= + +HaProxy_file="/etc/haproxy" +HaProxy_cfg_file="/etc/haproxy/haproxy.cfg" + +#检查是否安装HaProxy +check_HaProxy(){ + HaProxy_exist=`haproxy -v` + if [[ ${HaProxy_exist} = "" ]]; then + echo -e "\033[41;37m [错误] \033[0m 没有安装HaProxy,请检查 !" && exit 1 + fi +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + #bit=`uname -m` +} +# 设置 防火墙规则 +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +# 安装HaProxy +installHaProxy(){ + HaProxy_exist=`haproxy -v` + if [[ ${HaProxy_exist} != "" ]]; then + echo -e "\033[41;37m [错误] \033[0m 已经安装HaProxy,请检查 !" && exit 1 + fi + if [[ ${release} == "centos" ]]; then + yum update && yum install -y vim haproxy + else + apt-get update && apt-get install -y vim haproxy + fi + chmod +x /etc/rc.local + HaProxy_exist=`haproxy -v` + if [[ ${HaProxy_exist} = "" ]]; then + echo -e "\033[41;37m [错误] \033[0m 安装HaProxy失败,请检查 !" && exit 1 + else + Set_iptables + if [[ ${release} == "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + systemctl enable haproxy.service + else + chmod +x /etc/init.d/haproxy + chkconfig --add haproxy + chkconfig haproxy on + fi + else + chmod +x /etc/init.d/haproxy + update-rc.d -f haproxy defaults + fi + setHaProxy + fi +} +setHaProxy(){ + check_HaProxy + read -e -p "请输入 HaProxy 的 本地监听端口(转发端口) [1-65535](支持端口段: 2333-6666): " HaProxyport + [[ -z "${HaProxyport}" ]] && echo "取消..." && exit 1 + read -e -p "请输入 HaProxy 欲转发的 IP:" HaProxyip + [[ -z "${HaProxyip}" ]] && echo "取消..." && exit 1 + echo + echo "——————————————————————————————" + echo " 请检查 HaProxy 配置是否有误 !" + echo + echo -e " 本地监听端口 : \033[41;37m ${HaProxyport} \033[0m" + echo -e " 欲转发 IP : \033[41;37m ${HaProxyip} \033[0m" + echo "——————————————————————————————" + echo + read -e -p "请按任意键继续,如有配置错误请使用 Ctrl+C 退出。" var + HaProxy_port_1=`cat ${HaProxy_cfg_file} | sed -n "12p" | cut -c 12-23 | grep "-"` + HaProxy_port=`cat ${HaProxy_cfg_file} | sed -n "12p" | cut -c 12-23` + if [[ ${HaProxy_port_1} = "" ]]; then + iptables -D INPUT -p tcp --dport ${HaProxy_port} -j ACCEPT + else + HaProxy_port_1=`echo ${HaProxy_port_1} | sed 's/-/:/g'` + iptables -D INPUT -p tcp --dport ${HaProxy_port_1} -j ACCEPT + fi + cat > ${HaProxy_cfg_file}<<-EOF +global + +defaults + log global + mode tcp + option dontlognull + timeout connect 5000 + timeout client 50000 + timeout server 50000 + +frontend ss-in1 + bind *:${HaProxyport} + default_backend ss-out1 + +backend ss-out1 + server server1 ${HaProxyip} maxconn 20480 +EOF + restartHaProxy +} +# 查看HaProxy列表 +viewHaProxy(){ + check_HaProxy + HaProxy_port=`cat ${HaProxy_cfg_file} | sed -n "12p" | cut -c 12-23` + HaProxy_ip=`cat ${HaProxy_cfg_file} | sed -n "16p" | awk '{print $3}'` + ip=`wget -qO- -t1 -T2 ipinfo.io/ip` + [[ -z $ip ]] && ip="VPS_IP" + echo + echo "——————————————————————————————" + echo " HaProxy 配置信息: " + echo + echo -e " 本地 IP : \033[41;37m ${ip} \033[0m" + echo -e " 本地监听端口 : \033[41;37m ${HaProxy_port} \033[0m" + echo + echo -e " 欲转发 IP : \033[41;37m ${HaProxy_ip} \033[0m" + echo -e " 欲转发端口 : \033[41;37m ${HaProxy_port} \033[0m" + echo "——————————————————————————————" + echo +} +# 启动aProxy +startHaProxy(){ + check_HaProxy + PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` + [[ ! -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m 发现 HaProxy 正在运行,请检查 !" && exit 1 + if [[ ${release} == "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + systemctl start haproxy.service + else + /etc/init.d/haproxy start + fi + else + /etc/init.d/haproxy start + fi + sleep 2s + PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` + [[ -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m HaProxy 启动失败 !" && exit 1 + HaProxy_port_1=`cat ${HaProxy_cfg_file} | sed -n "12p" | cut -c 12-23 | grep "-"` + HaProxy_port=`cat ${HaProxy_cfg_file} | sed -n "12p" | cut -c 12-23` + if [[ ${HaProxy_port_1} = "" ]]; then + iptables -I INPUT -p tcp --dport ${HaProxy_port} -j ACCEPT + else + HaProxy_port_1=`echo ${HaProxy_port_1} | sed 's/-/:/g'` + iptables -I INPUT -p tcp --dport ${HaProxy_port_1} -j ACCEPT + fi + echo && echo "——————————————————————————————" && echo + echo " HaProxy 已启动 !" + Save_iptables + viewHaProxy +} +# 停止aProxy +stopHaProxy(){ + check_HaProxy + PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` + [[ -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m 发现 HaProxy 没有运行,请检查 !" && exit 1 + if [[ ${release} == "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + systemctl stop haproxy.service + else + /etc/init.d/haproxy stop + fi + else + /etc/init.d/haproxy stop + fi + HaProxy_port_1=`cat ${HaProxy_cfg_file} | sed -n "12p" | cut -c 12-23 | grep "-"` + HaProxy_port=`cat ${HaProxy_cfg_file} | sed -n "12p" | cut -c 12-23` + if [[ ${HaProxy_port_1} = "" ]]; then + iptables -D INPUT -p tcp --dport ${HaProxy_port} -j ACCEPT + else + HaProxy_port_1=`echo ${HaProxy_port_1} | sed 's/-/:/g'` + iptables -D INPUT -p tcp --dport ${HaProxy_port_1} -j ACCEPT + fi + sleep 2s + PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` + if [[ ! -z $PID ]]; then + echo -e "\033[41;37m [错误] \033[0m HaProxy 停止失败 !" && exit 1 + else + Save_iptables + echo " HaProxy 已停止 !" + fi +} +restartHaProxy(){ +# 检查是否安装 + check_HaProxy + PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` + if [[ ! -z $PID ]]; then + stopHaProxy + fi + startHaProxy +} +statusHaProxy(){ + check_HaProxy + PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` + if [[ ! -z $PID ]]; then + echo -e "\033[42;37m [信息] \033[0m HaProxy 正在运行,PID: ${PID} !" + else + echo -e "\033[42;37m [信息] \033[0m HaProxy 没有运行 !" + fi +} +uninstallHaProxy(){ + check_HaProxy + echo "确定要卸载 HaProxy ? [y/N]" + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` + if [[ ! -z $PID ]]; then + stopHaProxy + fi + if [[ ${release} == "centos" ]]; then + yum remove haproxy -y + else + apt-get remove haproxy -y + apt-get autoremove + fi + rm -rf ${HaProxy_file} + HaProxy_exist=`haproxy -v` + if [[ ${HaProxy_exist} != "" ]]; then + echo -e "\033[41;37m [错误] \033[0m HaProxy卸载失败,请检查 !" && exit 1 + fi + echo && echo " HaProxy 已卸载 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +check_sys +action=$1 +[[ -z $1 ]] && action=install +case "$action" in + install|set|view|start|stop|restart|status|uninstall) + ${action}HaProxy + ;; + *) + echo "输入错误 !" + echo "用法: { install | view | set | start | stop | restart | status | uninstall }" + ;; +esac \ No newline at end of file diff --git a/iptables-pf.sh b/iptables-pf.sh new file mode 100644 index 0000000..31d2cb2 --- /dev/null +++ b/iptables-pf.sh @@ -0,0 +1,288 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: iptables Port forwarding +# Version: 1.1.1 +# Author: Toyo +# Blog: https://doub.io/wlzy-20/ +#================================================= +sh_ver="1.1.1" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_iptables(){ + iptables_exist=$(iptables -V) + [[ ${iptables_exist} = "" ]] && echo -e "${Error} 没有安装iptables,请检查 !" && exit 1 +} +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + #bit=`uname -m` +} +install_iptables(){ + iptables_exist=$(iptables -V) + if [[ ${iptables_exist} != "" ]]; then + echo -e "${Info} 已经安装iptables,继续..." + else + echo -e "${Info} 检测到未安装 iptables,开始安装..." + if [[ ${release} == "centos" ]]; then + yum update + yum install -y iptables + else + apt-get update + apt-get install -y iptables + fi + iptables_exist=$(iptables -V) + if [[ ${iptables_exist} = "" ]]; then + echo -e "${Error} 安装iptables失败,请检查 !" && exit 1 + else + echo -e "${Info} iptables 安装完成 !" + fi + fi + echo -e "${Info} 开始配置 iptables !" + Set_iptables + echo -e "${Info} iptables 配置完毕 !" +} +Set_forwarding_port(){ + read -e -p "请输入 iptables 欲转发至的 远程端口 [1-65535] (支持端口段 如 2333-6666, 被转发服务器):" forwarding_port + [[ -z "${forwarding_port}" ]] && echo "取消..." && exit 1 + echo && echo -e " 欲转发端口 : ${Red_font_prefix}${forwarding_port}${Font_color_suffix}" && echo +} +Set_forwarding_ip(){ + read -e -p "请输入 iptables 欲转发至的 远程IP(被转发服务器):" forwarding_ip + [[ -z "${forwarding_ip}" ]] && echo "取消..." && exit 1 + echo && echo -e " 欲转发服务器IP : ${Red_font_prefix}${forwarding_ip}${Font_color_suffix}" && echo +} +Set_local_port(){ + echo -e "请输入 iptables 本地监听端口 [1-65535] (支持端口段 如 2333-6666)" + read -e -p "(默认端口: ${forwarding_port}):" local_port + [[ -z "${local_port}" ]] && local_port="${forwarding_port}" + echo && echo -e " 本地监听端口 : ${Red_font_prefix}${local_port}${Font_color_suffix}" && echo +} +Set_local_ip(){ + read -e -p "请输入 本服务器的 网卡IP(注意是网卡绑定的IP,而不仅仅是公网IP,回车自动检测外网IP):" local_ip + if [[ -z "${local_ip}" ]]; then + local_ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${local_ip}" ]]; then + echo "${Error} 无法检测到本服务器的公网IP,请手动输入" + read -e -p "请输入 本服务器的 网卡IP(注意是网卡绑定的IP,而不仅仅是公网IP):" local_ip + [[ -z "${local_ip}" ]] && echo "取消..." && exit 1 + fi + fi + echo && echo -e " 本服务器IP : ${Red_font_prefix}${local_ip}${Font_color_suffix}" && echo +} +Set_forwarding_type(){ + echo -e "请输入数字 来选择 iptables 转发类型: + 1. TCP + 2. UDP + 3. TCP+UDP\n" + read -e -p "(默认: TCP+UDP):" forwarding_type_num + [[ -z "${forwarding_type_num}" ]] && forwarding_type_num="3" + if [[ ${forwarding_type_num} == "1" ]]; then + forwarding_type="TCP" + elif [[ ${forwarding_type_num} == "2" ]]; then + forwarding_type="UDP" + elif [[ ${forwarding_type_num} == "3" ]]; then + forwarding_type="TCP+UDP" + else + forwarding_type="TCP+UDP" + fi +} +Set_Config(){ + Set_forwarding_port + Set_forwarding_ip + Set_local_port + Set_local_ip + Set_forwarding_type + echo && echo -e "—————————————————————————————— + 请检查 iptables 端口转发规则配置是否有误 !\n + 本地监听端口 : ${Green_font_prefix}${local_port}${Font_color_suffix} + 服务器 IP\t: ${Green_font_prefix}${local_ip}${Font_color_suffix}\n + 欲转发的端口 : ${Green_font_prefix}${forwarding_port}${Font_color_suffix} + 欲转发 IP\t: ${Green_font_prefix}${forwarding_ip}${Font_color_suffix} + 转发类型\t: ${Green_font_prefix}${forwarding_type}${Font_color_suffix} +——————————————————————————————\n" + read -e -p "请按任意键继续,如有配置错误请使用 Ctrl+C 退出。" var +} +Add_forwarding(){ + check_iptables + Set_Config + local_port=$(echo ${local_port} | sed 's/-/:/g') + forwarding_port_1=$(echo ${forwarding_port} | sed 's/-/:/g') + if [[ ${forwarding_type} == "TCP" ]]; then + Add_iptables "tcp" + elif [[ ${forwarding_type} == "UDP" ]]; then + Add_iptables "udp" + elif [[ ${forwarding_type} == "TCP+UDP" ]]; then + Add_iptables "tcp" + Add_iptables "udp" + fi + Save_iptables + clear && echo && echo -e "—————————————————————————————— + iptables 端口转发规则配置完成 !\n + 本地监听端口 : ${Green_font_prefix}${local_port}${Font_color_suffix} + 服务器 IP\t: ${Green_font_prefix}${local_ip}${Font_color_suffix}\n + 欲转发的端口 : ${Green_font_prefix}${forwarding_port_1}${Font_color_suffix} + 欲转发 IP\t: ${Green_font_prefix}${forwarding_ip}${Font_color_suffix} + 转发类型\t: ${Green_font_prefix}${forwarding_type}${Font_color_suffix} +——————————————————————————————\n" +} +View_forwarding(){ + check_iptables + forwarding_text=$(iptables -t nat -vnL PREROUTING|tail -n +3) + [[ -z ${forwarding_text} ]] && echo -e "${Error} 没有发现 iptables 端口转发规则,请检查 !" && exit 1 + forwarding_total=$(echo -e "${forwarding_text}"|wc -l) + forwarding_list_all="" + for((integer = 1; integer <= ${forwarding_total}; integer++)) + do + forwarding_type=$(echo -e "${forwarding_text}"|awk '{print $4}'|sed -n "${integer}p") + forwarding_listen=$(echo -e "${forwarding_text}"|awk '{print $11}'|sed -n "${integer}p"|awk -F "dpt:" '{print $2}') + [[ -z ${forwarding_listen} ]] && forwarding_listen=$(echo -e "${forwarding_text}"| awk '{print $11}'|sed -n "${integer}p"|awk -F "dpts:" '{print $2}') + forwarding_fork=$(echo -e "${forwarding_text}"| awk '{print $12}'|sed -n "${integer}p"|awk -F "to:" '{print $2}') + forwarding_list_all=${forwarding_list_all}"${Green_font_prefix}"${integer}".${Font_color_suffix} 类型: ${Green_font_prefix}"${forwarding_type}"${Font_color_suffix} 监听端口: ${Red_font_prefix}"${forwarding_listen}"${Font_color_suffix} 转发IP和端口: ${Red_font_prefix}"${forwarding_fork}"${Font_color_suffix}\n" + done + echo && echo -e "当前有 ${Green_background_prefix} "${forwarding_total}" ${Font_color_suffix} 个 iptables 端口转发规则。" + echo -e ${forwarding_list_all} +} +Del_forwarding(){ + check_iptables + while true + do + View_forwarding + read -e -p "请输入数字 来选择要删除的 iptables 端口转发规则(默认回车取消):" Del_forwarding_num + [[ -z "${Del_forwarding_num}" ]] && Del_forwarding_num="0" + echo $((${Del_forwarding_num}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${Del_forwarding_num} -ge 1 ]] && [[ ${Del_forwarding_num} -le ${forwarding_total} ]]; then + forwarding_type=$(echo -e "${forwarding_text}"| awk '{print $4}' | sed -n "${Del_forwarding_num}p") + forwarding_listen=$(echo -e "${forwarding_text}"| awk '{print $11}' | sed -n "${Del_forwarding_num}p" | awk -F "dpt:" '{print $2}' | sed 's/-/:/g') + [[ -z ${forwarding_listen} ]] && forwarding_listen=$(echo -e "${forwarding_text}"| awk '{print $11}' |sed -n "${Del_forwarding_num}p" | awk -F "dpts:" '{print $2}') + Del_iptables "${forwarding_type}" "${Del_forwarding_num}" + Save_iptables + echo && echo -e "${Info} iptables 端口转发规则删除完成 !" && echo + else + echo -e "${Error} 请输入正确的数字 !" + fi + else + break && echo "取消..." + fi + done +} +Uninstall_forwarding(){ + check_iptables + echo -e "确定要清空 iptables 所有端口转发规则 ? [y/N]" + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + forwarding_text=$(iptables -t nat -vnL PREROUTING|tail -n +3) + [[ -z ${forwarding_text} ]] && echo -e "${Error} 没有发现 iptables 端口转发规则,请检查 !" && exit 1 + forwarding_total=$(echo -e "${forwarding_text}"|wc -l) + for((integer = 1; integer <= ${forwarding_total}; integer++)) + do + forwarding_type=$(echo -e "${forwarding_text}"|awk '{print $4}'|sed -n "${integer}p") + forwarding_listen=$(echo -e "${forwarding_text}"|awk '{print $11}'|sed -n "${integer}p"|awk -F "dpt:" '{print $2}') + [[ -z ${forwarding_listen} ]] && forwarding_listen=$(echo -e "${forwarding_text}"| awk '{print $11}'|sed -n "${integer}p"|awk -F "dpts:" '{print $2}') + # echo -e "${forwarding_text} ${forwarding_type} ${forwarding_listen}" + Del_iptables "${forwarding_type}" "${integer}" + done + Save_iptables + echo && echo -e "${Info} iptables 已清空 所有端口转发规则 !" && echo + else + echo && echo "清空已取消..." && echo + fi +} +Add_iptables(){ + iptables -t nat -A PREROUTING -p "$1" --dport "${local_port}" -j DNAT --to-destination "${forwarding_ip}":"${forwarding_port}" + iptables -t nat -A POSTROUTING -p "$1" -d "${forwarding_ip}" --dport "${forwarding_port_1}" -j SNAT --to-source "${local_ip}" + echo "iptables -t nat -A PREROUTING -p $1 --dport ${local_port} -j DNAT --to-destination ${forwarding_ip}:${forwarding_port}" + echo "iptables -t nat -A POSTROUTING -p $1 -d ${forwarding_ip} --dport ${forwarding_port_1} -j SNAT --to-source ${local_ip}" + echo "${local_port}" + iptables -I INPUT -m state --state NEW -m "$1" -p "$1" --dport "${local_port}" -j ACCEPT +} +Del_iptables(){ + iptables -t nat -D POSTROUTING "$2" + iptables -t nat -D PREROUTING "$2" + iptables -D INPUT -m state --state NEW -m "$1" -p "$1" --dport "${forwarding_listen}" -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + echo -e "net.ipv4.ip_forward=1" >> /etc/sysctl.conf + sysctl -p + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/iptables-pf.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/iptables-pf.sh" && chmod +x iptables-pf.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +echo && echo -e " iptables 端口转发一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/wlzy-20 -- + + ${Green_font_prefix}0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix}1.${Font_color_suffix} 安装 iptables + ${Green_font_prefix}2.${Font_color_suffix} 清空 iptables 端口转发 +———————————— + ${Green_font_prefix}3.${Font_color_suffix} 查看 iptables 端口转发 + ${Green_font_prefix}4.${Font_color_suffix} 添加 iptables 端口转发 + ${Green_font_prefix}5.${Font_color_suffix} 删除 iptables 端口转发 +———————————— +注意:初次使用前请请务必执行 ${Green_font_prefix}1. 安装 iptables${Font_color_suffix}(不仅仅是安装)" && echo +read -e -p " 请输入数字 [0-5]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + install_iptables + ;; + 2) + Uninstall_forwarding + ;; + 3) + View_forwarding + ;; + 4) + Add_forwarding + ;; + 5) + Del_forwarding + ;; + *) + echo "请输入正确数字 [0-5]" + ;; +esac \ No newline at end of file diff --git a/libsodium.sh b/libsodium.sh new file mode 100644 index 0000000..ce44e53 --- /dev/null +++ b/libsodium.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: Libsodium Install +# Version: 1.0.0 +# Author: Toyo +# Blog: https://doub.io/shell-jc6/ +#================================================= + +Libsodiumr_file="/usr/local/lib/libsodium.so" +Libsodiumr_ver_backup="1.0.15" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" && Error="${Red_font_prefix}[错误]${Font_color_suffix}" && Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +Check_Libsodium_ver(){ + echo -e "${Info} 开始获取 libsodium 最新版本..." + Libsodiumr_ver=$(wget -qO- "https://github.com/jedisct1/libsodium/tags"|grep "/jedisct1/libsodium/releases/tag/"|head -1|sed -r 's/.*tag\/(.+)\">.*/\1/') + [[ -z ${Libsodiumr_ver} ]] && Libsodiumr_ver=${Libsodiumr_ver_backup} + echo -e "${Info} libsodium 最新版本为 ${Green_font_prefix}[${Libsodiumr_ver}]${Font_color_suffix} !" +} +Install_Libsodium(){ + if [[ -e ${Libsodiumr_file} ]]; then + echo -e "${Error} libsodium 已安装 , 是否覆盖安装(或者更新)?[y/N]" + read -e -p "(默认: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Nn] ]]; then + echo "已取消..." && exit 1 + fi + else + echo -e "${Info} libsodium 未安装,开始安装..." + fi + Check_Libsodium_ver + if [[ ${release} == "centos" ]]; then + yum update + echo -e "${Info} 安装依赖..." + yum -y groupinstall "Development Tools" + echo -e "${Info} 下载..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} 解压..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz + cd libsodium-${Libsodiumr_ver} + echo -e "${Info} 编译安装..." + ./configure --disable-maintainer-mode + make -j2 + make install + echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf + else + apt-get update + echo -e "${Info} 安装依赖..." + apt-get install -y build-essential + echo -e "${Info} 下载..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} 解压..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz + cd libsodium-${Libsodiumr_ver} + echo -e "${Info} 编译安装..." + ./configure --disable-maintainer-mode + make -j2 + make install + fi + ldconfig + cd .. + rm -rf libsodium-${Libsodiumr_ver}.tar.gz + rm -rf libsodium-${Libsodiumr_ver} + [[ ! -e ${Libsodiumr_file} ]] && echo -e "${Error} libsodium 安装失败 !" && exit 1 + echo && echo -e "${Info} libsodium 安装成功 !" && echo +} +action=$1 +[[ -z $1 ]] && action=install +case "$action" in + install) + Install_Libsodium + ;; + *) + echo "输入错误 !" + echo "用法: [ install ]" + ;; +esac \ No newline at end of file diff --git a/lightsocks.sh b/lightsocks.sh new file mode 100644 index 0000000..769e502 --- /dev/null +++ b/lightsocks.sh @@ -0,0 +1,623 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: Lightsocks +# Version: 1.0.1 +# Author: Toyo +# Blog: https://doub.io/lightsocks-jc1/ +#================================================= + +sh_ver="1.0.1" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +file="/usr/local/lightsocks" +lightsocks_file="/usr/local/lightsocks/lightsocks" +lightsocks_conf=$(echo ${HOME})"/.lightsocks.json" +lightsocks_log="/usr/local/lightsocks/lightsocks.log" +Crontab_file="/usr/bin/crontab" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${lightsocks_file} ]] && echo -e "${Error} Lightsocks 没有安装,请检查 !" && exit 1 +} +check_crontab_installed_status(){ + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 没有安装,开始安装..." && exit 1 + if [[ ${release} == "centos" ]]; then + yum install crond -y + else + apt-get install cron -y + fi + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 安装失败,请检查!" && exit 1 + else + echo -e "${Info} Crontab 安装成功!" + fi + fi +} +check_pid(){ + PID=`ps -ef| grep "lightsocks"| grep -v "grep" | grep -v "lightsocks.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` +} +check_new_ver(){ + lightsocks_new_ver=$(wget --no-check-certificate -qO- https://github.com/gwuhaolin/lightsocks/releases/latest | grep "" | sed -r 's/.*Release (.+) · gwuhaolin.*/\1/') + if [[ -z ${lightsocks_new_ver} ]]; then + echo -e "${Error} Lightsocks 最新版本获取失败,请手动获取最新版本号[ https://github.com/gwuhaolin/lightsocks/releases/latest ]" + read -e -p "请输入版本号 [ 格式是日期 , 如 1.0.6 ] :" lightsocks_new_ver + [[ -z "${lightsocks_new_ver}" ]] && echo "取消..." && exit 1 + else + echo -e "${Info} 检测到 Lightsocks 最新版本为 [ ${lightsocks_new_ver} ]" + fi +} +check_ver_comparison(){ + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + rm -rf ${lightsocks_file} + Download_lightsocks + Start_lightsocks +} +Download_lightsocks(){ + cd ${file} + if [ ${bit} == "x86_64" ]; then + wget --no-check-certificate -N "https://github.com/gwuhaolin/lightsocks/releases/download/${lightsocks_new_ver}/lightsocks_${lightsocks_new_ver}_linux_amd64.tar.gz" + mv "lightsocks_${lightsocks_new_ver}_linux_amd64.tar.gz" "lightsocks_linux.tar.gz" + else + wget --no-check-certificate -N "https://github.com/gwuhaolin/lightsocks/releases/download/${lightsocks_new_ver}/lightsocks_${lightsocks_new_ver}_linux_386.tar.gz" + mv "lightsocks_${lightsocks_new_ver}_linux_386.tar.gz" "lightsocks_linux.tar.gz" + fi + [[ ! -s "lightsocks_linux.tar.gz" ]] && echo -e "${Error} Lightsocks 压缩包下载失败 !" && rm -rf "${file}" && exit 1 + tar -xzf "lightsocks_linux.tar.gz" + rm -rf lightsocks_linux.tar.gz + [[ ! -e "lightsocks-server" ]] && echo -e "${Error} Lightsocks 压缩包解压失败 !" && rm -rf "${file}" && exit 1 + mv lightsocks-server lightsocks + chmod +x lightsocks + rm -rf lightsocks-local + rm -rf LICENSE + rm -rf readme.md +} +Service_lightsocks(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/lightsocks_centos" -O /etc/init.d/lightsocks; then + echo -e "${Error} Lightsocks服务 管理脚本下载失败 !" && rm -rf "${file}" && exit 1 + fi + chmod +x "/etc/init.d/lightsocks" + chkconfig --add lightsocks + chkconfig lightsocks on + else + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/lightsocks_debian" -O /etc/init.d/lightsocks; then + echo -e "${Error} Lightsocks服务 管理脚本下载失败 !" && rm -rf "${file}" && exit 1 + fi + chmod +x "/etc/init.d/lightsocks" + update-rc.d -f lightsocks defaults + fi + echo -e "${Info} Lightsocks服务 管理脚本下载完成 !" +} +Installation_dependency(){ + if [[ ${release} == "centos" ]]; then + Centos_yum + else + Debian_apt + fi + cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + mkdir ${file} +} +Centos_yum(){ + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + yum update + yum install -y net-tools + fi +} +Debian_apt(){ + cat /etc/issue |grep 9\..*>/dev/null + if [[ $? = 0 ]]; then + apt-get update + apt-get install -y net-tools + fi +} +Generate_the_port(){ + min=$1 + max=$(($2-$min+1)) + num=$(date +%s%N) + echo $(($num%$max+$min)) +} +Write_config(){ + cat > ${lightsocks_conf}<<-EOF +{ + "listen": ":${ls_port}", + "remote": "" +} +EOF +} +Read_config(){ + [[ ! -e ${lightsocks_conf} ]] && echo -e "${Error} Lightsocks 配置文件不存在 !" && exit 1 + user_all=$(cat ${lightsocks_conf}|sed "1d;$d") + [[ -z ${user_all} ]] && echo -e "${Error} Lightsocks 配置文件中用户配置为空 !" && exit 1 + port=$(echo "${user_all}"|grep "listen"|awk -F ': ' '{print $NF}'|sed 's/\"//g;s/://g;s/,//g') + password=$(echo "${user_all}"|grep "password"|awk -F ': ' '{print $NF}'|sed 's/\"//g') +} +Set_port(){ + while true + do + echo -e "请输入 Lightsocks 端口 [1-65535](端口不能重复,避免冲突)" + read -e -p "(默认: 随机端口):" ls_port + [[ -z "${ls_port}" ]] && ls_port=$(Generate_the_port 443 65500) + echo $((${ls_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ls_port} -ge 1 ]] && [[ ${ls_port} -le 65535 ]]; then + echo && echo "========================" + echo -e " 端口 : ${Red_background_prefix} ${ls_port} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_lightsocks(){ + check_installed_status + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 修改 端口配置 + ${Green_font_prefix}2.${Font_color_suffix} 修改 密码配置 +———————————————— + ${Green_font_prefix}3.${Font_color_suffix} 监控 运行状态 + + ${Tip} 因为 Lightsocks 限制,所以密码只能自动生成 !" && echo + read -e -p "(默认: 取消):" ls_modify + [[ -z "${ls_modify}" ]] && echo "已取消..." && exit 1 + if [[ ${ls_modify} == "1" ]]; then + Modify_user "port" + elif [[ ${ls_modify} == "2" ]]; then + Modify_user "password" + elif [[ ${ls_modify} == "3" ]]; then + Set_crontab_monitor_lightsocks + else + echo -e "${Error} 请输入正确的数字(1-2)" && exit 1 + fi +} +Modify_user(){ + Read_config + Modify_user_type=$1 + if [[ ${Modify_user_type} == "port" ]]; then + Set_port + Modify_config_port + Del_iptables + Add_iptables + Save_iptables + else + Modify_config_password + fi + Restart_lightsocks +} +Modify_config_port(){ + sed -i 's/"listen": ":'"$(echo ${port})"'"/"listen": ":'"$(echo ${ls_port})"'"/g' ${lightsocks_conf} +} +Modify_config_password(){ + Read_config + password_num=$(cat "${lightsocks_conf}"|grep -n '"password":'|awk -F ':' '{print $1}') + if [[ ${password_num} -gt 0 ]];then + sed -i "${password_num}d" ${lightsocks_conf} + password_num_1=$(echo $((${password_num}-1))) + sed -i "${password_num_1}s/,//g" ${lightsocks_conf} + else + echo -e "${Error} 配置文件修改错误!" + fi +} +Install_lightsocks(){ + check_root + [[ -e ${lightsocks_file} ]] && echo -e "${Error} 检测到 Lightsocks 已安装 !" && exit 1 + echo -e "${Info} 开始设置 用户配置..." + Set_port + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始检测最新版本..." + check_new_ver + echo -e "${Info} 开始下载/安装..." + Download_lightsocks + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_lightsocks + echo -e "${Info} 开始写入 配置文件..." + Write_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_lightsocks +} +Start_lightsocks(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} Lightsocks 正在运行,请检查 !" && exit 1 + /etc/init.d/lightsocks start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View_lightsocks +} +Stop_lightsocks(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} Lightsocks 没有运行,请检查 !" && exit 1 + /etc/init.d/lightsocks stop +} +Restart_lightsocks(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/lightsocks stop + /etc/init.d/lightsocks start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View_lightsocks +} +Update_lightsocks(){ + check_installed_status + check_new_ver + check_ver_comparison +} +Uninstall_lightsocks(){ + check_installed_status + echo "确定要卸载 Lightsocks ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + if [[ -e ${lightsocks_conf} ]]; then + Read_config + Del_iptables + Save_iptables + rm -rf "${lightsocks_conf}" + fi + rm -rf "${file}" + if [[ ${release} = "centos" ]]; then + chkconfig --del lightsocks + else + update-rc.d -f lightsocks remove + fi + rm -rf "/etc/init.d/lightsocks" + echo && echo "Lightsocks 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +View_lightsocks(){ + check_installed_status + Read_config + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi + clear && echo + echo -e "Lightsocks 用户配置:" + lightsocks_link + echo -e "————————————————" + echo -e " 地址\t: ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " 端口\t: ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " 密码\t: ${Green_font_prefix}${password}${Font_color_suffix}" + echo -e "${Lightsocks_link_1}" + echo + echo -e "${Tip} Lightsocks链接 仅适用于Windows系统的 Lightsocks Tools客户端[https://doub.io/dbrj-12/]。" + echo +} +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n//g;s/=//g;s/+/-/g;s/\//_/g;ta') + echo -e "${date}" +} +lightsocks_link(){ + Lightsocks_URL_1=$(urlsafe_base64 "${ip}:${port}:${password}") + Lightsocks_URL="lightsocks://${Lightsocks_URL_1}" + Lightsocks_QRcode="http://doub.pw/qr/qr.php?text=${Lightsocks_URL}" + Lightsocks_link_1=" 链接\t: ${Red_font_prefix}${Lightsocks_URL}${Font_color_suffix} \n 二维码 : ${Red_font_prefix}${Lightsocks_QRcode}${Font_color_suffix} \n " +} +View_Log(){ + check_installed_status + [[ ! -e ${lightsocks_log} ]] && echo -e "${Error} Lightsocks 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志(正常情况下是没有多少日志输出的)" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${lightsocks_log}${Font_color_suffix} 命令。" && echo + tail -f ${lightsocks_log} +} +# 显示 连接信息 +debian_View_user_connection_info(){ + format_1=$1 + Read_config + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'lightsocks' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |wc -l` + echo -e "链接IP总数: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'lightsocks' |grep 'tcp6' |grep ":${port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP_1}") + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi +} +centos_View_user_connection_info(){ + format_1=$1 + Read_config + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'lightsocks' |grep 'tcp' | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |wc -l` + echo -e "链接IP总数: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'lightsocks' |grep 'tcp' |grep ":${port} "|grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP_1}") + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi +} +View_user_connection_info(){ + check_installed_status + echo && echo -e "请选择要显示的格式: + ${Green_font_prefix}1.${Font_color_suffix} 显示 IP 格式 + ${Green_font_prefix}2.${Font_color_suffix} 显示 IP+IP归属地 格式" && echo + read -e -p "(默认: 1):" lightsocks_connection_info + [[ -z "${lightsocks_connection_info}" ]] && lightsocks_connection_info="1" + if [[ "${lightsocks_connection_info}" == "1" ]]; then + View_user_connection_info_1 "" + elif [[ "${lightsocks_connection_info}" == "2" ]]; then + echo -e "${Tip} 检测IP归属地(ipip.net),如果IP较多,可能时间会比较长..." + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} 请输入正确的数字(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + #echo "user_IP_1=${user_IP_1}" + if [[ ! -z ${user_IP_1} ]]; then + #echo "user_IP_total=${user_IP_total}" + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=$(echo "${user_IP_1}" |sed -n "$integer_1"p) + #echo "IP=${IP}" + IP_address=$(wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g') + #echo "IP_address=${IP_address}" + #user_IP="${user_IP}\n${IP}(${IP_address})" + echo -e "${Green_font_prefix}${IP}${Font_color_suffix} (${IP_address})" + #echo "user_IP=${user_IP}" + sleep 1s + done + fi +} +Set_crontab_monitor_lightsocks(){ + check_crontab_installed_status + crontab_monitor_lightsocks_status=$(crontab -l|grep "lightsocks.sh monitor") + if [[ -z "${crontab_monitor_lightsocks_status}" ]]; then + echo && echo -e "当前监控模式: ${Green_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}Lightsocks 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动SSR服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_lightsocks_status_ny + [[ -z "${crontab_monitor_lightsocks_status_ny}" ]] && crontab_monitor_lightsocks_status_ny="y" + if [[ ${crontab_monitor_lightsocks_status_ny} == [Yy] ]]; then + crontab_monitor_lightsocks_cron_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Green_font_prefix}Lightsocks 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动SSR服务端)[y/N]" + read -e -p "(默认: n):" crontab_monitor_lightsocks_status_ny + [[ -z "${crontab_monitor_lightsocks_status_ny}" ]] && crontab_monitor_lightsocks_status_ny="n" + if [[ ${crontab_monitor_lightsocks_status_ny} == [Yy] ]]; then + crontab_monitor_lightsocks_cron_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_lightsocks_cron_start(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/lightsocks.sh monitor/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/lightsocks.sh monitor" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "lightsocks.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Lightsocks 服务端运行状态监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} Lightsocks 服务端运行状态监控功能 启动成功 !" + fi +} +crontab_monitor_lightsocks_cron_stop(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/lightsocks.sh monitor/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "lightsocks.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Lightsocks 服务端运行状态监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} Lightsocks 服务端运行状态监控功能 停止成功 !" + fi +} +crontab_monitor_lightsocks(){ + check_installed_status + check_pid + echo "${PID}" + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 Lightsocks服务端 未运行 , 开始启动..." | tee -a ${lightsocks_log} + /etc/init.d/lightsocks start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Lightsocks服务端 启动失败..." | tee -a ${lightsocks_log} + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Lightsocks服务端 启动成功..." | tee -a ${lightsocks_log} + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Lightsocks服务端 进程运行正常..." | tee -a ${lightsocks_log} + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ls_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ls_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/lightsocks.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/lightsocks" ]]; then + rm -rf /etc/init.d/lightsocks + Service_lightsocks + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/lightsocks.sh" && chmod +x lightsocks.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +action=$1 +if [[ "${action}" == "monitor" ]]; then + crontab_monitor_lightsocks +else + echo && echo -e " Lightsocks 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/lightsocks-jc1 ---- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 Lightsocks + ${Green_font_prefix} 2.${Font_color_suffix} 升级 Lightsocks + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 Lightsocks +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 Lightsocks + ${Green_font_prefix} 5.${Font_color_suffix} 停止 Lightsocks + ${Green_font_prefix} 6.${Font_color_suffix} 重启 Lightsocks +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 账号配置 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 账号信息 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 日志信息 + ${Green_font_prefix}10.${Font_color_suffix} 查看 链接信息 +————————————" && echo + if [[ -e ${lightsocks_file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi + else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" + fi + echo + read -e -p " 请输入数字 [0-10]:" num + case "$num" in + 0) + Update_Shell + ;; + 1) + Install_lightsocks + ;; + 2) + Update_lightsocks + ;; + 3) + Uninstall_lightsocks + ;; + 4) + Start_lightsocks + ;; + 5) + Stop_lightsocks + ;; + 6) + Restart_lightsocks + ;; + 7) + Set_lightsocks + ;; + 8) + View_lightsocks + ;; + 9) + View_Log + ;; + 10) + View_user_connection_info + ;; + *) + echo "请输入正确数字 [0-10]" + ;; + esac +fi \ No newline at end of file diff --git a/mtproxy.sh b/mtproxy.sh new file mode 100644 index 0000000..f70755e --- /dev/null +++ b/mtproxy.sh @@ -0,0 +1,834 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: MTProxy +# Version: 1.0.8 +# Author: Toyo +# Blog: https://doub.io/shell-jc7/ +#================================================= + +sh_ver="1.0.8" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +file="/usr/local/mtproxy" +mtproxy_file="/usr/local/mtproxy/mtproto-proxy" +mtproxy_conf="/usr/local/mtproxy/mtproxy.conf" +mtproxy_log="/usr/local/mtproxy/mtproxy.log" +mtproxy_secret="/usr/local/mtproxy/proxy-secret" +mtproxy_multi="/usr/local/mtproxy/proxy-multi.conf" +Crontab_file="/usr/bin/crontab" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + #bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${mtproxy_file} ]] && echo -e "${Error} MTProxy 没有安装,请检查 !" && exit 1 +} +check_crontab_installed_status(){ + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 没有安装,开始安装..." + if [[ ${release} == "centos" ]]; then + yum install crond -y + else + apt-get install cron -y + fi + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 安装失败,请检查!" && exit 1 + else + echo -e "${Info} Crontab 安装成功!" + fi + fi +} +check_pid(){ + PID=`ps -ef| grep "./mtproto-proxy "| grep -v "grep" | grep -v "init.d" |grep -v "service" |awk '{print $2}'` +} +Download_mtproxy(){ + mkdir '/tmp/mtproxy' + cd '/tmp/mtproxy' + # wget -N --no-check-certificate "https://github.com/TelegramMessenger/MTProxy/archive/master.zip" + git clone https://github.com/TelegramMessenger/MTProxy.git + [[ ! -e "MTProxy/" ]] && echo -e "${Error} MTProxy 下载失败!" && cd '/tmp' && rm -rf '/tmp/mtproxy' && exit 1 + cd MTProxy + make + [[ ! -e "objs/bin/mtproto-proxy" ]] && echo -e "${Error} MTProxy 编译失败!" && echo -e "另外,如果在上面几行看到 ${Green_font_prefix}xxxxx option \"-std=gnu11\"${Font_color_suffix} 字样,说明是系统版本过低,请尝试更换系统重试!" && make clean && cd '/tmp' && rm -rf '/tmp/mtproxy' && exit 1 + [[ ! -e "${file}" ]] && mkdir "${file}" + \cp -f objs/bin/mtproto-proxy "${file}" + chmod +x "${mtproxy_file}" + cd '/tmp' + rm -rf '/tmp/mtproxy' +} +Download_secret(){ + [[ -e "${mtproxy_secret}" ]] && rm -rf "${mtproxy_secret}" + wget --no-check-certificate -q "https://core.telegram.org/getProxySecret" -O "${mtproxy_secret}" + [[ ! -e "${mtproxy_secret}" ]] && echo -e "${Error} MTProxy Secret下载失败! 脚本将会继续安装但会启动失败,请尝试手动下载:${Green_font_prefix}wget --no-check-certificate -q \"https://core.telegram.org/getProxySecret\" -O \"${mtproxy_secret}\"${Font_color_suffix}" + echo -e "${Info} MTProxy Secret下载成功!" +} +Download_multi(){ + [[ -e "${mtproxy_multi}" ]] && rm -rf "${mtproxy_multi}" + wget --no-check-certificate -q "https://core.telegram.org/getProxyConfig" -O "${mtproxy_multi}" + [[ ! -e "${mtproxy_multi}" ]] && echo -e "${Error} MTProxy Multi下载失败!脚本将会继续安装但会启动失败,请尝试手动下载:${Green_font_prefix}wget --no-check-certificate -q \"https://core.telegram.org/getProxyConfig\" -O \"${mtproxy_multi}\"${Font_color_suffix}" + echo -e "${Info} MTProxy Secret下载成功!" +} +Service_mtproxy(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/mtproxy_centos" -O /etc/init.d/mtproxy; then + echo -e "${Error} MTProxy服务 管理脚本下载失败 !" + rm -rf "${file}" + exit 1 + fi + chmod +x "/etc/init.d/mtproxy" + chkconfig --add mtproxy + chkconfig mtproxy on + else + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/mtproxy_debian" -O /etc/init.d/mtproxy; then + echo -e "${Error} MTProxy服务 管理脚本下载失败 !" + rm -rf "${file}" + exit 1 + fi + chmod +x "/etc/init.d/mtproxy" + update-rc.d -f mtproxy defaults + fi + echo -e "${Info} MTProxy服务 管理脚本下载完成 !" +} +Installation_dependency(){ + if [[ ${release} == "centos" ]]; then + Centos_yum + else + Debian_apt + fi + \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +} +Centos_yum(){ + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + yum update + if [[ $? = 0 ]]; then + yum install -y openssl-devel zlib-devel git + else + yum install -y openssl-devel zlib-devel git + fi + yum groupinstall "Development Tools" -y +} +Debian_apt(){ + cat /etc/issue |grep 9\..*>/dev/null + apt-get update + if [[ $? = 0 ]]; then + apt-get install -y build-essential libssl-dev zlib1g-dev git + else + apt-get install -y build-essential libssl-dev zlib1g-dev git + fi +} +Write_config(){ + cat > ${mtproxy_conf}<<-EOF +PORT = ${mtp_port} +PASSWORD = ${mtp_passwd} +TAG = ${mtp_tag} +NAT = ${mtp_nat} +EOF +} +Read_config(){ + [[ ! -e ${mtproxy_conf} ]] && echo -e "${Error} MTProxy 配置文件不存在 !" && exit 1 + port=$(cat ${mtproxy_conf}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + passwd=$(cat ${mtproxy_conf}|grep 'PASSWORD = '|awk -F 'PASSWORD = ' '{print $NF}') + tag=$(cat ${mtproxy_conf}|grep 'TAG = '|awk -F 'TAG = ' '{print $NF}') + nat=$(cat ${mtproxy_conf}|grep 'NAT = '|awk -F 'NAT = ' '{print $NF}') +} +Set_port(){ + while true + do + echo -e "请输入 MTProxy 端口 [1-65535]" + read -e -p "(默认: 443):" mtp_port + [[ -z "${mtp_port}" ]] && mtp_port="443" + echo $((${mtp_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${mtp_port} -ge 1 ]] && [[ ${mtp_port} -le 65535 ]]; then + echo && echo "========================" + echo -e " 端口 : ${Red_background_prefix} ${mtp_port} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_passwd(){ + while true + do + echo "请输入 MTProxy 密匙(手动输入必须为32位,[0-9][a-z][A-Z],建议随机生成)" + read -e -p "(避免出错,强烈推荐随机生成,直接回车):" mtp_passwd + if [[ -z "${mtp_passwd}" ]]; then + mtp_passwd=$(date +%s%N | md5sum | head -c 32) + else + [[ ${#mtp_passwd} != 32 ]] && echo -e "${Error} 请输入正确的密匙(32位字符)。" && continue + fi + echo && echo "========================" + echo -e " 密码 : ${Red_background_prefix} dd${mtp_passwd} ${Font_color_suffix}" + echo "========================" && echo + break + done +} +Set_tag(){ + echo "请输入 MTProxy 的 TAG标签(TAG标签必须是32位,TAG标签只有在通过官方机器人 @MTProxybot 分享代理账号后才会获得,不清楚请留空回车)" + read -e -p "(默认:回车跳过):" mtp_tag + if [[ ! -z "${mtp_tag}" ]]; then + echo && echo "========================" + echo -e " TAG : ${Red_background_prefix} ${mtp_tag} ${Font_color_suffix}" + echo "========================" && echo + fi +} +Set_nat(){ + echo -e "\n=== 当前服务器所有网卡信息:\n" + if [[ -e "/sbin/ip" ]]; then + ip addr show + else + ifconfig + fi + echo -e "\n== 解释:网卡名 lo 指的是本机,请无视。 +== 解释:一般情况下,主网卡名为 eth0,Debian9系统为 ens3,CentOS Ubuntu最新系统可能为 enpXsX(X代表数字或字母)。OpenVZ 虚拟化为 venet0\n" + echo -e "如果本机是NAT服务器(谷歌云、微软云、阿里云等,网卡绑定的IP为 10.xx.xx.xx 开头的),则请输入你的服务器内网IP,否则会导致无法使用。如果不是请直接回车!" + read -e -p "(默认:回车跳过):" mtp_nat + if [[ -z "${mtp_nat}" ]]; then + mtp_nat="" + else + getip + mtp_nat="${mtp_nat}:${ip}" + echo && echo "========================" + echo -e " NAT : ${Red_background_prefix} ${mtp_nat} ${Font_color_suffix}" + echo "========================" && echo + fi +} +Set_mtproxy(){ + check_installed_status + echo && echo -e "你要做什么? + ${Green_font_prefix} 1.${Font_color_suffix} 修改 端口配置 + ${Green_font_prefix} 2.${Font_color_suffix} 修改 密码配置 + ${Green_font_prefix} 3.${Font_color_suffix} 修改 TAG 配置 + ${Green_font_prefix} 4.${Font_color_suffix} 修改 NAT 配置 + ${Green_font_prefix} 5.${Font_color_suffix} 修改 全部配置 +———————————————— + ${Green_font_prefix} 6.${Font_color_suffix} 更新 Telegram IP段(无需频繁更新) + ${Green_font_prefix} 7.${Font_color_suffix} 更新 Telegram 密匙(一般不用管) +———————————————— + ${Green_font_prefix} 8.${Font_color_suffix} 定时 更新 Telegram IP段 + ${Green_font_prefix} 9.${Font_color_suffix} 监控 运行状态 + ${Green_font_prefix}10.${Font_color_suffix} 监控 外网IP变更" && echo + read -e -p "(默认: 取消):" mtp_modify + [[ -z "${mtp_modify}" ]] && echo "已取消..." && exit 1 + if [[ "${mtp_modify}" == "1" ]]; then + Read_config + Set_port + mtp_passwd=${passwd} + mtp_tag=${tag} + mtp_nat=${nat} + Write_config + Del_iptables + Add_iptables + Restart_mtproxy + elif [[ "${mtp_modify}" == "2" ]]; then + Read_config + Set_passwd + mtp_port=${port} + mtp_tag=${tag} + mtp_nat=${nat} + Write_config + Restart_mtproxy + elif [[ "${mtp_modify}" == "3" ]]; then + Read_config + Set_tag + mtp_port=${port} + mtp_passwd=${passwd} + mtp_nat=${nat} + Write_config + Restart_mtproxy + elif [[ "${mtp_modify}" == "4" ]]; then + Read_config + Set_nat + mtp_port=${port} + mtp_passwd=${passwd} + mtp_tag=${tag} + Write_config + Restart_mtproxy + elif [[ "${mtp_modify}" == "5" ]]; then + Read_config + Set_port + Set_passwd + Set_tag + Set_nat + Write_config + Restart_mtproxy + elif [[ "${mtp_modify}" == "6" ]]; then + Update_multi + elif [[ "${mtp_modify}" == "7" ]]; then + Update_secret + elif [[ "${mtp_modify}" == "8" ]]; then + Set_crontab_update_multi + elif [[ "${mtp_modify}" == "9" ]]; then + Set_crontab_monitor_mtproxy + elif [[ "${mtp_modify}" == "10" ]]; then + Set_crontab_monitorip + else + echo -e "${Error} 请输入正确的数字(1-10)" && exit 1 + fi +} +Install_mtproxy(){ + check_root + [[ -e ${mtproxy_file} ]] && echo -e "${Error} 检测到 MTProxy 已安装 !" && exit 1 + echo -e "${Info} 开始设置 用户配置..." + Set_port + Set_passwd + Set_tag + Set_nat + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装..." + Download_mtproxy + Download_secret + Download_multi + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_mtproxy + echo -e "${Info} 开始写入 配置文件..." + Write_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_mtproxy +} +Start_mtproxy(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} MTProxy 正在运行,请检查 !" && exit 1 + /etc/init.d/mtproxy start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View_mtproxy +} +Stop_mtproxy(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} MTProxy 没有运行,请检查 !" && exit 1 + /etc/init.d/mtproxy stop +} +Restart_mtproxy(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/mtproxy stop + /etc/init.d/mtproxy start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View_mtproxy +} +Update_mtproxy(){ + echo -e "${Tip} 因为官方无最新版本号,所以无法对比版本,请自行判断是否需要更新。是否更新?[Y/n]" + read -e -p "(默认: y):" yn + [[ -z "${yn}" ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + check_installed_status + check_pid + [[ ! -z $PID ]] && /etc/init.d/mtproxy stop + rm -rf ${mtproxy_file} + Download_mtproxy + echo -e "${Info} MTProxy 更新完成..." + Start_mtproxy + fi + +} +Uninstall_mtproxy(){ + check_installed_status + echo "确定要卸载 MTProxy ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + if [[ -e ${mtproxy_conf} ]]; then + port=$(cat ${mtproxy_conf}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + Del_iptables + Save_iptables + fi + if [[ ! -z $(crontab -l | grep "mtproxy.sh monitor") ]]; then + crontab_monitor_mtproxy_cron_stop + fi + if [[ ! -z $(crontab -l | grep "mtproxy.sh update") ]]; then + crontab_update_mtproxy_cron_stop + fi + rm -rf "${file}" + if [[ ${release} = "centos" ]]; then + chkconfig --del mtproxy + else + update-rc.d -f mtproxy remove + fi + rm -rf "/etc/init.d/mtproxy" + echo && echo "MTProxy 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +getip(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi +} +View_mtproxy(){ + check_installed_status + Read_config + getip + clear && echo + echo -e "Mtproto Proxy 用户配置:" + echo -e "————————————————" + echo -e " 地址\t: ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " 端口\t: ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " 密匙\t: ${Green_font_prefix}dd${passwd}${Font_color_suffix}" + [[ ! -z "${nat}" ]] && echo -e " NAT \t: ${Green_font_prefix}${nat}${Font_color_suffix}" + [[ ! -z "${tag}" ]] && echo -e " TAG \t: ${Green_font_prefix}${tag}${Font_color_suffix}" + echo -e " 链接\t: ${Red_font_prefix}tg://proxy?server=${ip}&port=${port}&secret=dd${passwd}${Font_color_suffix}" + echo -e " 链接\t: ${Red_font_prefix}https://t.me/proxy?server=${ip}&port=${port}&secret=dd${passwd}${Font_color_suffix}" + echo + echo -e " ${Red_font_prefix}注意\t:${Font_color_suffix} 密匙头部的 ${Green_font_prefix}dd${Font_color_suffix} 字符是代表客户端启用${Green_font_prefix}随机填充混淆模式${Font_color_suffix},如果不需要请手动删除。\n \t 另外,在官方机器人处分享账号获取TAG标签时记得删除,获取TAG标签后分享时可以再加上。" +} +View_Log(){ + check_installed_status + [[ ! -e ${mtproxy_log} ]] && echo -e "${Error} MTProxy 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${mtproxy_log}${Font_color_suffix} 命令。" && echo + tail -f ${mtproxy_log} +} +Update_secret(){ + rm -rf "${mtproxy_secret}" + Download_secret + Restart_mtproxy +} +Update_multi(){ + rm -rf "${mtproxy_multi}" + Download_multi + Restart_mtproxy +} +# 显示 连接信息 +debian_View_user_connection_info(){ + format_1=$1 + Read_config + user_IP=`netstat -anp |grep 'ESTABLISHED' |grep 'mtproto' |grep 'tcp' |grep ":${port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=`echo -e "${user_IP}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP}") + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi + user_IP="" +} +centos_View_user_connection_info(){ + format_1=$1 + Read_config + user_IP=`netstat -anp |grep 'ESTABLISHED' |grep 'mtproto' |grep 'tcp' |grep ":${port} "|awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=`echo -e "${user_IP}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP}") + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi + user_IP="" +} +View_user_connection_info(){ + check_installed_status + echo && echo -e "请选择要显示的格式: + ${Green_font_prefix}1.${Font_color_suffix} 显示 IP 格式 + ${Green_font_prefix}2.${Font_color_suffix} 显示 IP+IP归属地 格式" && echo + read -e -p "(默认: 1):" mtproxy_connection_info + [[ -z "${mtproxy_connection_info}" ]] && mtproxy_connection_info="1" + if [[ "${mtproxy_connection_info}" == "1" ]]; then + View_user_connection_info_1 "" + elif [[ "${mtproxy_connection_info}" == "2" ]]; then + echo -e "${Tip} 检测IP归属地(ipip.net),如果IP较多,可能时间会比较长..." + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} 请输入正确的数字(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + if [[ ! -z ${user_IP} ]]; then + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=$(echo "${user_IP}" |sed -n "$integer_1"p) + IP_address=$(wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g') + echo -e "${Green_font_prefix}${IP}${Font_color_suffix} (${IP_address})" + sleep 1s + done + fi +} +Set_crontab_monitor_mtproxy(){ + check_crontab_installed_status + crontab_monitor_mtproxy_status=$(crontab -l|grep "mtproxy.sh monitor") + if [[ -z "${crontab_monitor_mtproxy_status}" ]]; then + echo && echo -e "当前监控运行状态模式: ${Red_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}MTProxy 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 MTProxy 服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_mtproxy_status_ny + [[ -z "${crontab_monitor_mtproxy_status_ny}" ]] && crontab_monitor_mtproxy_status_ny="y" + if [[ ${crontab_monitor_mtproxy_status_ny} == [Yy] ]]; then + crontab_monitor_mtproxy_cron_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控运行状态模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Red_font_prefix}MTProxy 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 MTProxy 服务端)[y/N]" + read -e -p "(默认: n):" crontab_monitor_mtproxy_status_ny + [[ -z "${crontab_monitor_mtproxy_status_ny}" ]] && crontab_monitor_mtproxy_status_ny="n" + if [[ ${crontab_monitor_mtproxy_status_ny} == [Yy] ]]; then + crontab_monitor_mtproxy_cron_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_mtproxy_cron_start(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/mtproxy.sh monitor/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/mtproxy.sh monitor" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "mtproxy.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} MTProxy 服务端运行状态监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} MTProxy 服务端运行状态监控功能 启动成功 !" + fi +} +crontab_monitor_mtproxy_cron_stop(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/mtproxy.sh monitor/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "mtproxy.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} MTProxy 服务端运行状态监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} MTProxy 服务端运行状态监控功能 停止成功 !" + fi +} +crontab_monitor_mtproxy(){ + check_installed_status + check_pid + #echo "${PID}" + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 MTProxy服务端 未运行 , 开始启动..." | tee -a ${mtproxy_log} + /etc/init.d/mtproxy start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] MTProxy服务端 启动失败..." | tee -a ${mtproxy_log} + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] MTProxy服务端 启动成功..." | tee -a ${mtproxy_log} + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] MTProxy服务端 进程运行正常..." | tee -a ${mtproxy_log} + fi +} +Set_crontab_update_multi(){ + check_crontab_installed_status + crontab_update_mtproxy_status=$(crontab -l|grep "mtproxy.sh update") + if [[ -z "${crontab_update_mtproxy_status}" ]]; then + echo && echo -e "当前自动更新 Telegram IP段功能: ${Red_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}MTProxy 自动更新 Telegram IP段${Font_color_suffix} 功能吗?[Y/n]" + read -e -p "(默认: y):" crontab_update_mtproxy_status_ny + [[ -z "${crontab_update_mtproxy_status_ny}" ]] && crontab_update_mtproxy_status_ny="y" + if [[ ${crontab_update_mtproxy_status_ny} == [Yy] ]]; then + crontab_update_mtproxy_cron_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前自动更新 Telegram IP段功能: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Red_font_prefix}MTProxy 自动更新 Telegram IP段${Font_color_suffix} 功能吗?[y/N]" + read -e -p "(默认: n):" crontab_update_mtproxy_status_ny + [[ -z "${crontab_update_mtproxy_status_ny}" ]] && crontab_update_mtproxy_status_ny="n" + if [[ ${crontab_update_mtproxy_status_ny} == [Yy] ]]; then + crontab_update_mtproxy_cron_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_update_mtproxy_cron_start(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/mtproxy.sh update/d" "$file_1/crontab.bak" + echo -e "\n10 3 * * * /bin/bash $file_1/mtproxy.sh update" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "mtproxy.sh update") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} MTProxy 自动更新 Telegram IP段功能 启动失败 !" && exit 1 + else + echo -e "${Info} MTProxy 自动更新 Telegram IP段功能 启动成功 !" + fi +} +crontab_update_mtproxy_cron_stop(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/mtproxy.sh update/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "mtproxy.sh update") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} MTProxy 自动更新 Telegram IP段功能 停止失败 !" && exit 1 + else + echo -e "${Info} MTProxy 自动更新 Telegram IP段功能 停止成功 !" + fi +} +crontab_update_mtproxy(){ + check_installed_status + check_pid + rm -rf "${mtproxy_multi}" + Download_multi + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Telegram IP段自动更新完成..." | tee -a ${mtproxy_log} + /etc/init.d/mtproxy restart +} +Set_crontab_monitorip(){ + check_crontab_installed_status + crontab_monitor_status=$(crontab -l|grep "mtproxy.sh monitorip") + if [[ -z "${crontab_monitor_status}" ]]; then + echo && echo -e "当前监控外网IP模式: ${Red_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}服务器外网IP变更监控${Font_color_suffix} 功能吗?(当服务器外网IP变化后,自动重新配置并重启服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_status_ny + [[ -z "${crontab_monitor_status_ny}" ]] && crontab_monitor_status_ny="y" + if [[ ${crontab_monitor_status_ny} == [Yy] ]]; then + crontab_monitor_cron_start2 + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控外网IP模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Red_font_prefix}服务器外网IP变更监控${Font_color_suffix} 功能吗?(当服务器外网IP变化后,自动重新配置并重启服务端)[Y/n]" + read -e -p "(默认: n):" crontab_monitor_status_ny + [[ -z "${crontab_monitor_status_ny}" ]] && crontab_monitor_status_ny="n" + if [[ ${crontab_monitor_status_ny} == [Yy] ]]; then + crontab_monitor_cron_stop2 + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_cron_start2(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/mtproxy.sh monitorip/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/mtproxy.sh monitorip" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "mtproxy.sh monitorip") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} 服务器外网IP变更监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} 服务器外网IP变更监控功能 启动成功 !" + fi +} +crontab_monitor_cron_stop2(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/mtproxy.sh monitorip/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "mtproxy.sh monitorip") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} 服务器外网IP变更监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} 服务器外网IP变更监控功能 停止成功 !" + fi +} +crontab_monitorip(){ + check_installed_status + Read_config + getip + ipv4=$(echo "${nat}"|awk -F ':' '{print $2}') + nat_ipv4=$(echo "${nat}"|awk -F ':' '{print $1}') + if [[ "${ip}" != "VPS_IP" ]]; then + if [[ "${ip}" != "${ipv4}" ]]; then + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 服务器外网IP变更[旧: ${ipv4},新: ${ip}], 开始重新配置并准备重启服务端..." | tee -a ${mtproxy_log} + mtp_nat="${nat_ipv4}:${ip}" + mtp_port=${port} + mtp_passwd=${passwd} + mtp_tag=${tag} + Write_config + Restart_mtproxy + fi + else + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 服务器外网IPv4获取失败..." | tee -a ${mtproxy_log} + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${mtp_port} -j ACCEPT + #iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${mtp_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + #iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/mtproxy.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/mtproxy" ]]; then + rm -rf /etc/init.d/mtproxy + Service_mtproxy + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/mtproxy.sh" && chmod +x mtproxy.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +action=$1 +if [[ "${action}" == "monitor" ]]; then + crontab_monitor_mtproxy +elif [[ "${action}" == "update" ]]; then + crontab_update_mtproxy +elif [[ "${action}" == "monitorip" ]]; then + crontab_monitorip +else + echo && echo -e " MTProxy 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/shell-jc7 ---- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 MTProxy + ${Green_font_prefix} 2.${Font_color_suffix} 更新 MTProxy + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 MTProxy +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 MTProxy + ${Green_font_prefix} 5.${Font_color_suffix} 停止 MTProxy + ${Green_font_prefix} 6.${Font_color_suffix} 重启 MTProxy +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 账号配置 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 账号信息 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 日志信息 + ${Green_font_prefix}10.${Font_color_suffix} 查看 链接信息 +————————————" && echo + if [[ -e ${mtproxy_file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi + else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" + fi + echo + read -e -p " 请输入数字 [0-10]:" num + case "$num" in + 0) + Update_Shell + ;; + 1) + Install_mtproxy + ;; + 2) + Update_mtproxy + ;; + 3) + Uninstall_mtproxy + ;; + 4) + Start_mtproxy + ;; + 5) + Stop_mtproxy + ;; + 6) + Restart_mtproxy + ;; + 7) + Set_mtproxy + ;; + 8) + View_mtproxy + ;; + 9) + View_Log + ;; + 10) + View_user_connection_info + ;; + *) + echo "请输入正确数字 [0-10]" + ;; + esac +fi \ No newline at end of file diff --git a/mtproxy_go.sh b/mtproxy_go.sh new file mode 100644 index 0000000..e7a82b9 --- /dev/null +++ b/mtproxy_go.sh @@ -0,0 +1,782 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: MTProxy Golang +# Version: 1.0.1 +# Author: Toyo +# Blog: https://doub.io/shell-jc9/ +#================================================= + +sh_ver="1.0.1" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +file="/usr/local/mtproxy-go" +mtproxy_file="/usr/local/mtproxy-go/mtg" +mtproxy_conf="/usr/local/mtproxy-go/mtproxy.conf" +mtproxy_log="/usr/local/mtproxy-go/mtproxy.log" +Now_ver_File="/usr/local/mtproxy-go/ver.txt" +Crontab_file="/usr/bin/crontab" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${mtproxy_file} ]] && echo -e "${Error} MTProxy 没有安装,请检查 !" && exit 1 +} +check_crontab_installed_status(){ + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 没有安装,开始安装..." + if [[ ${release} == "centos" ]]; then + yum install crond -y + else + apt-get install cron -y + fi + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 安装失败,请检查!" && exit 1 + else + echo -e "${Info} Crontab 安装成功!" + fi + fi +} +check_pid(){ + PID=$(ps -ef| grep "./mtg "| grep -v "grep" | grep -v "init.d" |grep -v "service" |awk '{print $2}') +} +check_new_ver(){ + new_ver=$(wget -qO- https://api.github.com/repos/9seconds/mtg/releases| grep "tag_name"| head -n 1| awk -F ":" '{print $2}'| sed 's/\"//g;s/,//g;s/ //g') + [[ -z ${new_ver} ]] && echo -e "${Error} MTProxy 最新版本获取失败!" && exit 1 + echo -e "${Info} 检测到 MTProxy 最新版本为 [ ${new_ver} ]" +} +check_ver_comparison(){ + now_ver=$(cat ${Now_ver_File}) + if [[ "${now_ver}" != "${new_ver}" ]]; then + echo -e "${Info} 发现 MTProxy 已有新版本 [ ${new_ver} ],旧版本 [ ${now_ver} ]" + read -e -p "是否更新 ? [Y/n] :" yn + [[ -z "${yn}" ]] && yn="y" + if [[ $yn == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + \cp "${mtproxy_conf}" "/tmp/mtproxy.conf" + rm -rf ${file} + Download + mv "/tmp/mtproxy.conf" "${mtproxy_conf}" + Start + fi + else + echo -e "${Info} 当前 MTProxy 已是最新版本 [ ${new_ver} ]" && exit 1 + fi +} +Download(){ + if [[ ! -e "${file}" ]]; then + mkdir "${file}" + else + [[ -e "${mtproxy_file}" ]] && rm -rf "${mtproxy_file}" + fi + cd "${file}" + if [[ ${bit} == "x86_64" ]]; then + bit="amd64" + elif [[ ${bit} == "i386" || ${bit} == "i686" ]]; then + bit="386" + else + bit="arm" + fi + wget --no-check-certificate -N "https://github.com/9seconds/mtg/releases/download/${new_ver}/mtg-linux-${bit}" + [[ ! -e "mtg-linux-${bit}" ]] && echo -e "${Error} MTProxy 下载失败 !" && rm -rf "${file}" && exit 1 + mv "mtg-linux-${bit}" "mtg" + [[ ! -e "mtg" ]] && echo -e "${Error} MTProxy 重命名失败 !" && rm -rf "${file}" && exit 1 + chmod +x mtg + echo "${new_ver}" > ${Now_ver_File} +} +Service(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/mtproxy_go_centos" -O /etc/init.d/mtproxy-go; then + echo -e "${Error} MTProxy服务 管理脚本下载失败 !" + rm -rf "${file}" + exit 1 + fi + chmod +x "/etc/init.d/mtproxy-go" + chkconfig --add mtproxy-go + chkconfig mtproxy-go on + else + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/mtproxy_go_debian" -O /etc/init.d/mtproxy-go; then + echo -e "${Error} MTProxy服务 管理脚本下载失败 !" + rm -rf "${file}" + exit 1 + fi + chmod +x "/etc/init.d/mtproxy-go" + update-rc.d -f mtproxy-go defaults + fi + echo -e "${Info} MTProxy服务 管理脚本下载完成 !" +} +Installation_dependency(){ + \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +} +Write_config(){ + cat > ${mtproxy_conf}<<-EOF +PORT = ${mtp_port} +PASSWORD = ${mtp_passwd} +TAG = ${mtp_tag} +NAT-IPv4 = ${mtp_nat_ipv4} +NAT-IPv6 = ${mtp_nat_ipv6} +SECURE = ${mtp_secure} +EOF +} +Read_config(){ + [[ ! -e ${mtproxy_conf} ]] && echo -e "${Error} MTProxy 配置文件不存在 !" && exit 1 + port=$(cat ${mtproxy_conf}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + passwd=$(cat ${mtproxy_conf}|grep 'PASSWORD = '|awk -F 'PASSWORD = ' '{print $NF}') + tag=$(cat ${mtproxy_conf}|grep 'TAG = '|awk -F 'TAG = ' '{print $NF}') + nat_ipv4=$(cat ${mtproxy_conf}|grep 'NAT-IPv4 = '|awk -F 'NAT-IPv4 = ' '{print $NF}') + nat_ipv6=$(cat ${mtproxy_conf}|grep 'NAT-IPv6 = '|awk -F 'NAT-IPv6 = ' '{print $NF}') + secure=$(cat ${mtproxy_conf}|grep 'SECURE = '|awk -F 'SECURE = ' '{print $NF}') +} +Set_port(){ + while true + do + echo -e "请输入 MTProxy 端口 [1-65535]" + read -e -p "(默认: 443):" mtp_port + [[ -z "${mtp_port}" ]] && mtp_port="443" + echo $((${mtp_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${mtp_port} -ge 1 ]] && [[ ${mtp_port} -le 65535 ]]; then + echo && echo "========================" + echo -e " 端口 : ${Red_background_prefix} ${mtp_port} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_passwd(){ + while true + do + echo "请输入 MTProxy 密匙(手动输入必须为32位,[0-9][a-z][A-Z],建议随机生成)" + read -e -p "(避免出错,强烈推荐随机生成,直接回车):" mtp_passwd + if [[ -z "${mtp_passwd}" ]]; then + mtp_passwd=$(date +%s%N | md5sum | head -c 32) + else + [[ ${#mtp_passwd} != 32 ]] && echo -e "${Error} 请输入正确的密匙(32位字符)。" && continue + fi + echo && echo "========================" + echo -e " 密码 : ${Red_background_prefix} dd${mtp_passwd} ${Font_color_suffix}" + echo "========================" && echo + break + done +} +Set_tag(){ + echo "请输入 MTProxy 的 TAG标签(TAG标签必须是32位,TAG标签只有在通过官方机器人 @MTProxybot 分享代理账号后才会获得,不清楚请留空回车)" + read -e -p "(默认:回车跳过):" mtp_tag + if [[ ! -z "${mtp_tag}" ]]; then + echo && echo "========================" + echo -e " TAG : ${Red_background_prefix} ${mtp_tag} ${Font_color_suffix}" + echo "========================" && echo + else + echo + fi +} +Set_nat(){ + echo -e "如果本机是NAT服务器(谷歌云、微软云、阿里云等,网卡绑定的IP为 10.xx.xx.xx 开头的),则需要指定公网 IPv4。" + read -e -p "(默认:自动检测 IPv4 地址):" mtp_nat_ipv4 + if [[ -z "${mtp_nat_ipv4}" ]]; then + getipv4 + if [[ "${ipv4}" == "IPv4_Error" ]]; then + mtp_nat_ipv4="" + else + mtp_nat_ipv4="${ipv4}" + fi + echo && echo "========================" + echo -e " NAT-IPv4 : ${Red_background_prefix} ${mtp_nat_ipv4} ${Font_color_suffix}" + echo "========================" && echo + fi + echo -e "如果本机是NAT服务器(谷歌云、微软云、阿里云等),则需要指定公网 IPv6。" + read -e -p "(默认:自动检测 IPv6 地址):" mtp_nat_ipv6 + if [[ -z "${mtp_nat_ipv6}" ]]; then + getipv6 + if [[ "${ipv6}" == "IPv6_Error" ]]; then + mtp_nat_ipv6="" + else + mtp_nat_ipv6="${ipv6}" + fi + echo && echo "========================" + echo -e " NAT-IPv6 : ${Red_background_prefix} ${mtp_nat_ipv6} ${Font_color_suffix}" + echo "========================" && echo + fi +} +Set_secure(){ + echo -e "是否启用强制安全模式?[Y/n] +只有启用[安全混淆模式]的客户端才能链接(即密匙头部有 dd 字符),降低服务器被墙几率,建议开启。" + read -e -p "(默认:Y 启用):" mtp_secure + [[ -z "${mtp_secure}" ]] && mtp_secure="Y" + if [[ "${mtp_secure}" == [Yy] ]]; then + mtp_secure="YES" + else + mtp_secure="NO" + fi + echo && echo "========================" + echo -e " 强制安全模式 : ${Red_background_prefix} ${mtp_secure} ${Font_color_suffix}" + echo "========================" && echo +} +Set(){ + check_installed_status + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 修改 端口配置 + ${Green_font_prefix}2.${Font_color_suffix} 修改 密码配置 + ${Green_font_prefix}3.${Font_color_suffix} 修改 TAG 配置 + ${Green_font_prefix}4.${Font_color_suffix} 修改 NAT 配置 + ${Green_font_prefix}5.${Font_color_suffix} 修改 强制安全模式 配置 + ${Green_font_prefix}6.${Font_color_suffix} 修改 全部配置 +———————————————— + ${Green_font_prefix}7.${Font_color_suffix} 监控 运行状态 + ${Green_font_prefix}8.${Font_color_suffix} 监控 外网IP变更" && echo + read -e -p "(默认: 取消):" mtp_modify + [[ -z "${mtp_modify}" ]] && echo "已取消..." && exit 1 + if [[ "${mtp_modify}" == "1" ]]; then + Read_config + Set_port + mtp_passwd=${passwd} + mtp_tag=${tag} + mtp_nat_ipv4=${nat_ipv4} + mtp_nat_ipv6=${nat_ipv6} + mtp_secure=${secure} + Write_config + Del_iptables + Add_iptables + Restart + elif [[ "${mtp_modify}" == "2" ]]; then + Read_config + Set_passwd + mtp_port=${port} + mtp_tag=${tag} + mtp_nat_ipv4=${nat_ipv4} + mtp_nat_ipv6=${nat_ipv6} + mtp_secure=${secure} + Write_config + Restart + elif [[ "${mtp_modify}" == "3" ]]; then + Read_config + Set_tag + mtp_port=${port} + mtp_passwd=${passwd} + mtp_nat_ipv4=${nat_ipv4} + mtp_nat_ipv6=${nat_ipv6} + mtp_secure=${secure} + Write_config + Restart + elif [[ "${mtp_modify}" == "4" ]]; then + Read_config + Set_nat + mtp_port=${port} + mtp_passwd=${passwd} + mtp_tag=${tag} + mtp_secure=${secure} + Write_config + Restart + elif [[ "${mtp_modify}" == "5" ]]; then + Read_config + Set_secure + mtp_port=${port} + mtp_passwd=${passwd} + mtp_tag=${tag} + mtp_nat_ipv4=${nat_ipv4} + mtp_nat_ipv6=${nat_ipv6} + Write_config + Restart + elif [[ "${mtp_modify}" == "6" ]]; then + Read_config + Set_port + Set_passwd + Set_tag + Set_nat + Set_secure + Write_config + Restart + elif [[ "${mtp_modify}" == "7" ]]; then + Set_crontab_monitor + elif [[ "${mtp_modify}" == "8" ]]; then + Set_crontab_monitorip + else + echo -e "${Error} 请输入正确的数字(1-8)" && exit 1 + fi +} +Install(){ + check_root + [[ -e ${mtproxy_file} ]] && echo -e "${Error} 检测到 MTProxy 已安装 !" && exit 1 + echo -e "${Info} 开始设置 用户配置..." + Set_port + Set_passwd + Set_tag + Set_nat + Set_secure + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装..." + check_new_ver + Download + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service + echo -e "${Info} 开始写入 配置文件..." + Write_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start +} +Start(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} MTProxy 正在运行,请检查 !" && exit 1 + /etc/init.d/mtproxy-go start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View +} +Stop(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} MTProxy 没有运行,请检查 !" && exit 1 + /etc/init.d/mtproxy-go stop +} +Restart(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/mtproxy-go stop + /etc/init.d/mtproxy-go start + sleep 1s + check_pid + [[ ! -z ${PID} ]] && View +} +Update(){ + check_installed_status + check_new_ver + check_ver_comparison +} +Uninstall(){ + check_installed_status + echo "确定要卸载 MTProxy ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + if [[ -e ${mtproxy_conf} ]]; then + port=$(cat ${mtproxy_conf}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + Del_iptables + Save_iptables + fi + if [[ ! -z $(crontab -l | grep "mtproxy_go.sh monitor") ]]; then + crontab_monitor_cron_stop + fi + rm -rf "${file}" + if [[ ${release} = "centos" ]]; then + chkconfig --del mtproxy-go + else + update-rc.d -f mtproxy-go remove + fi + rm -rf "/etc/init.d/mtproxy-go" + echo && echo "MTProxy 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +getipv4(){ + ipv4=$(wget -qO- -4 -t1 -T2 ipinfo.io/ip) + if [[ -z "${ipv4}" ]]; then + ipv4=$(wget -qO- -4 -t1 -T2 api.ip.sb/ip) + if [[ -z "${ipv4}" ]]; then + ipv4=$(wget -qO- -4 -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ipv4}" ]]; then + ipv4="IPv4_Error" + fi + fi + fi +} +getipv6(){ + ipv6=$(wget -qO- -6 -t1 -T3 ifconfig.co) + if [[ -z "${ipv6}" ]]; then + ipv6="IPv6_Error" + fi +} +View(){ + check_installed_status + Read_config + #getipv4 + #getipv6 + clear && echo + echo -e "Mtproto Proxy 用户配置:" + echo -e "————————————————" + echo -e " 地址\t: ${Green_font_prefix}${nat_ipv4}${Font_color_suffix}" + [[ ! -z "${nat_ipv6}" ]] && echo -e " 地址\t: ${Green_font_prefix}${nat_ipv6}${Font_color_suffix}" + echo -e " 端口\t: ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " 密匙\t: ${Green_font_prefix}dd${passwd}${Font_color_suffix}" + [[ ! -z "${tag}" ]] && echo -e " TAG \t: ${Green_font_prefix}${tag}${Font_color_suffix}" + echo -e " 链接\t: ${Red_font_prefix}tg://proxy?server=${nat_ipv4}&port=${port}&secret=dd${passwd}${Font_color_suffix}" + echo -e " 链接\t: ${Red_font_prefix}https://t.me/proxy?server=${nat_ipv4}&port=${port}&secret=dd${passwd}${Font_color_suffix}" + [[ ! -z "${nat_ipv6}" ]] && echo -e " 链接\t: ${Red_font_prefix}tg://proxy?server=${nat_ipv6}&port=${port}&secret=dd${passwd}${Font_color_suffix}" + [[ ! -z "${nat_ipv6}" ]] && echo -e " 链接\t: ${Red_font_prefix}https://t.me/proxy?server=${nat_ipv6}&port=${port}&secret=dd${passwd}${Font_color_suffix}" + echo + echo -e " 强制安全模式\t: ${Green_font_prefix}${secure}${Font_color_suffix}" + echo + echo -e " ${Red_font_prefix}注意\t:${Font_color_suffix} 密匙头部的 ${Green_font_prefix}dd${Font_color_suffix} 字符是代表客户端启用${Green_font_prefix}安全混淆模式${Font_color_suffix},可以降低服务器被墙几率。\n \t 另外,在官方机器人处分享账号获取TAG标签时记得删除,获取TAG标签后分享时可以再加上。" +} +View_Log(){ + check_installed_status + [[ ! -e ${mtproxy_log} ]] && echo -e "${Error} MTProxy 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${mtproxy_log}${Font_color_suffix} 命令。" && echo + tail -f ${mtproxy_log} +} +# 显示 连接信息 +debian_View_user_connection_info(){ + format_1=$1 + Read_config + user_IP=$(ss state connected sport = :${port} -tn|sed '1d'|awk '{print $NF}'|awk -F ':' '{print $(NF-1)}'|sort -u) + if [[ -z ${user_IP} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=$(echo -e "${user_IP}"|wc -l) + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP}") + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi + user_IP="" +} +View_user_connection_info(){ + check_installed_status + echo && echo -e "请选择要显示的格式: + ${Green_font_prefix}1.${Font_color_suffix} 显示 IP 格式 + ${Green_font_prefix}2.${Font_color_suffix} 显示 IP+IP归属地 格式" && echo + read -e -p "(默认: 1):" mtproxy_connection_info + [[ -z "${mtproxy_connection_info}" ]] && mtproxy_connection_info="1" + if [[ "${mtproxy_connection_info}" == "1" ]]; then + View_user_connection_info_1 "" + elif [[ "${mtproxy_connection_info}" == "2" ]]; then + echo -e "${Tip} 检测IP归属地(ipip.net),如果IP较多,可能时间会比较长..." + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} 请输入正确的数字(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + debian_View_user_connection_info "$format" +} +get_IP_address(){ + if [[ ! -z ${user_IP} ]]; then + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=$(echo "${user_IP}" |sed -n "$integer_1"p) + IP_address=$(wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g') + echo -e "${Green_font_prefix}${IP}${Font_color_suffix} (${IP_address})" + sleep 1s + done + fi +} +Set_crontab_monitor(){ + check_crontab_installed_status + crontab_monitor_status=$(crontab -l|grep "mtproxy_go.sh monitor") + if [[ -z "${crontab_monitor_status}" ]]; then + echo && echo -e "当前监控运行状态模式: ${Red_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}MTProxy 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 MTProxy 服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_status_ny + [[ -z "${crontab_monitor_status_ny}" ]] && crontab_monitor_status_ny="y" + if [[ ${crontab_monitor_status_ny} == [Yy] ]]; then + crontab_monitor_cron_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控运行状态模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Red_font_prefix}MTProxy 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 MTProxy 服务端)[y/N]" + read -e -p "(默认: n):" crontab_monitor_status_ny + [[ -z "${crontab_monitor_status_ny}" ]] && crontab_monitor_status_ny="n" + if [[ ${crontab_monitor_status_ny} == [Yy] ]]; then + crontab_monitor_cron_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_cron_start(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/mtproxy_go.sh monitor/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/mtproxy_go.sh monitor" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "mtproxy_go.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} MTProxy 服务端运行状态监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} MTProxy 服务端运行状态监控功能 启动成功 !" + fi +} +crontab_monitor_cron_stop(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/mtproxy_go.sh monitor/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "mtproxy_go.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} MTProxy 服务端运行状态监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} MTProxy 服务端运行状态监控功能 停止成功 !" + fi +} +crontab_monitor(){ + check_installed_status + check_pid + #echo "${PID}" + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 MTProxy服务端 未运行 , 开始启动..." | tee -a ${mtproxy_log} + /etc/init.d/mtproxy-go start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] MTProxy服务端 启动失败..." | tee -a ${mtproxy_log} + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] MTProxy服务端 启动成功..." | tee -a ${mtproxy_log} + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] MTProxy服务端 进程运行正常..." | tee -a ${mtproxy_log} + fi +} +Set_crontab_monitorip(){ + check_crontab_installed_status + crontab_monitor_status=$(crontab -l|grep "mtproxy_go.sh monitorip") + if [[ -z "${crontab_monitor_status}" ]]; then + echo && echo -e "当前监控外网IP模式: ${Red_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}服务器外网IP变更监控${Font_color_suffix} 功能吗?(当服务器外网IP变化后,自动重新配置并重启服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_status_ny + [[ -z "${crontab_monitor_status_ny}" ]] && crontab_monitor_status_ny="y" + if [[ ${crontab_monitor_status_ny} == [Yy] ]]; then + crontab_monitor_cron_start2 + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控外网IP模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Red_font_prefix}服务器外网IP变更监控${Font_color_suffix} 功能吗?(当服务器外网IP变化后,自动重新配置并重启服务端)[Y/n]" + read -e -p "(默认: n):" crontab_monitor_status_ny + [[ -z "${crontab_monitor_status_ny}" ]] && crontab_monitor_status_ny="n" + if [[ ${crontab_monitor_status_ny} == [Yy] ]]; then + crontab_monitor_cron_stop2 + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_cron_start2(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/mtproxy_go.sh monitorip/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/mtproxy_go.sh monitorip" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "mtproxy_go.sh monitorip") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} 服务器外网IP变更监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} 服务器外网IP变更监控功能 启动成功 !" + fi +} +crontab_monitor_cron_stop2(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/mtproxy_go.sh monitorip/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "mtproxy_go.sh monitorip") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} 服务器外网IP变更监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} 服务器外网IP变更监控功能 停止成功 !" + fi +} +crontab_monitorip(){ + check_installed_status + Read_config + getipv4 + getipv6 + monitorip_yn="NO" + if [[ "${ipv4}" != "IPv4_Error" ]]; then + if [[ "${ipv4}" != "${nat_ipv4}" ]]; then + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 服务器外网IPv4变更[旧: ${nat_ipv4},新: ${ipv4}], 开始重新配置并准备重启服务端..." | tee -a ${mtproxy_log} + monitorip_yn="YES" + mtp_nat_ipv4=${ipv4} + fi + else + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 服务器外网IPv4获取失败..." | tee -a ${mtproxy_log} + mtp_nat_ipv4=${nat_ipv4} + fi + if [[ "${ipv6}" != "IPv6_Error" ]]; then + if [[ "${ipv6}" != "${nat_ipv6}" ]]; then + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 服务器外网IPv6变更[旧: ${nat_ipv6},新: ${ipv6}], 开始重新配置并准备重启服务端..." | tee -a ${mtproxy_log} + monitorip_yn="YES" + mtp_nat_ipv6=${ipv6} + fi + else + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 服务器外网IPv6获取失败..." | tee -a ${mtproxy_log} + mtp_nat_ipv6=${nat_ipv6} + fi + if [[ ${monitorip_yn} == "YES" ]]; then + mtp_port=${port} + mtp_passwd=${passwd} + mtp_tag=${tag} + mtp_secure=${secure} + Write_config + Restart + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${mtp_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${mtp_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + chkconfig --level 2345 iptables on + chkconfig --level 2345 ip6tables on + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules\n/sbin/ip6tables-restore < /etc/ip6tables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/mtproxy_go.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/mtproxy-go" ]]; then + rm -rf /etc/init.d/mtproxy-go + Service + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/mtproxy_go.sh" && chmod +x mtproxy_go.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +action=$1 +if [[ "${action}" == "monitor" ]]; then + crontab_monitor +elif [[ "${action}" == "monitorip" ]]; then + crontab_monitorip +else + echo && echo -e " MTProxy-Go 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/shell-jc9 ---- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 MTProxy + ${Green_font_prefix} 2.${Font_color_suffix} 更新 MTProxy + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 MTProxy +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 MTProxy + ${Green_font_prefix} 5.${Font_color_suffix} 停止 MTProxy + ${Green_font_prefix} 6.${Font_color_suffix} 重启 MTProxy +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 账号配置 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 账号信息 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 日志信息 + ${Green_font_prefix}10.${Font_color_suffix} 查看 链接信息 +————————————" && echo + if [[ -e ${mtproxy_file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi + else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" + fi + echo + read -e -p " 请输入数字 [0-10]:" num + case "$num" in + 0) + Update_Shell + ;; + 1) + Install + ;; + 2) + Update + ;; + 3) + Uninstall + ;; + 4) + Start + ;; + 5) + Stop + ;; + 6) + Restart + ;; + 7) + Set + ;; + 8) + View + ;; + 9) + View_Log + ;; + 10) + View_user_connection_info + ;; + *) + echo "请输入正确数字 [0-10]" + ;; + esac +fi \ No newline at end of file diff --git a/ocserv.sh b/ocserv.sh new file mode 100644 index 0000000..20f0ca6 --- /dev/null +++ b/ocserv.sh @@ -0,0 +1,582 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: Debian/Ubuntu +# Description: ocserv AnyConnect +# Version: 1.0.5 +# Author: Toyo +# Blog: https://doub.io/vpnzy-7/ +#================================================= +sh_ver="1.0.5" +file="/usr/local/sbin/ocserv" +conf_file="/etc/ocserv" +conf="/etc/ocserv/ocserv.conf" +passwd_file="/etc/ocserv/ocpasswd" +log_file="/tmp/ocserv.log" +ocserv_ver="0.11.8" +PID_FILE="/var/run/ocserv.pid" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + #bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${file} ]] && echo -e "${Error} ocserv 没有安装,请检查 !" && exit 1 + [[ ! -e ${conf} ]] && echo -e "${Error} ocserv 配置文件不存在,请检查 !" && [[ $1 != "un" ]] && exit 1 +} +check_pid(){ + if [[ ! -e ${PID_FILE} ]]; then + PID="" + else + PID=$(cat ${PID_FILE}) + fi +} +Get_ip(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi +} +Download_ocserv(){ + mkdir "ocserv" && cd "ocserv" + wget "ftp://ftp.infradead.org/pub/ocserv/ocserv-${ocserv_ver}.tar.xz" + [[ ! -s "ocserv-${ocserv_ver}.tar.xz" ]] && echo -e "${Error} ocserv 源码文件下载失败 !" && rm -rf "ocserv/" && rm -rf "ocserv-${ocserv_ver}.tar.xz" && exit 1 + tar -xJf ocserv-0.11.8.tar.xz && cd ocserv-0.11.8 + ./configure + make + make install + cd .. && cd .. + rm -rf ocserv/ + + if [[ -e ${file} ]]; then + mkdir "${conf_file}" + wget --no-check-certificate -N -P "${conf_file}" "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/ocserv.conf" + [[ ! -s "${conf}" ]] && echo -e "${Error} ocserv 配置文件下载失败 !" && rm -rf "${conf_file}" && exit 1 + else + echo -e "${Error} ocserv 编译安装失败,请检查!" && exit 1 + fi +} +Service_ocserv(){ + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/ocserv_debian -O /etc/init.d/ocserv; then + echo -e "${Error} ocserv 服务 管理脚本下载失败 !" && over + fi + chmod +x /etc/init.d/ocserv + update-rc.d -f ocserv defaults + echo -e "${Info} ocserv 服务 管理脚本下载完成 !" +} +rand(){ + min=10000 + max=$((60000-$min+1)) + num=$(date +%s%N) + echo $(($num%$max+$min)) +} +Generate_SSL(){ + lalala=$(rand) + mkdir /tmp/ssl && cd /tmp/ssl + echo -e 'cn = "'${lalala}'" +organization = "'${lalala}'" +serial = 1 +expiration_days = 365 +ca +signing_key +cert_signing_key +crl_signing_key' > ca.tmpl + [[ $? != 0 ]] && echo -e "${Error} 写入SSL证书签名模板失败(ca.tmpl) !" && over + certtool --generate-privkey --outfile ca-key.pem + [[ $? != 0 ]] && echo -e "${Error} 生成SSL证书密匙文件失败(ca-key.pem) !" && over + certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem + [[ $? != 0 ]] && echo -e "${Error} 生成SSL证书文件失败(ca-cert.pem) !" && over + + Get_ip + if [[ -z "$ip" ]]; then + echo -e "${Error} 检测外网IP失败 !" + read -e -p "请手动输入你的服务器外网IP:" ip + [[ -z "${ip}" ]] && echo "取消..." && over + fi + echo -e 'cn = "'${ip}'" +organization = "'${lalala}'" +expiration_days = 365 +signing_key +encryption_key +tls_www_server' > server.tmpl + [[ $? != 0 ]] && echo -e "${Error} 写入SSL证书签名模板失败(server.tmpl) !" && over + certtool --generate-privkey --outfile server-key.pem + [[ $? != 0 ]] && echo -e "${Error} 生成SSL证书密匙文件失败(server-key.pem) !" && over + certtool --generate-certificate --load-privkey server-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template server.tmpl --outfile server-cert.pem + [[ $? != 0 ]] && echo -e "${Error} 生成SSL证书文件失败(server-cert.pem) !" && over + + mkdir /etc/ocserv/ssl + mv ca-cert.pem /etc/ocserv/ssl/ca-cert.pem + mv ca-key.pem /etc/ocserv/ssl/ca-key.pem + mv server-cert.pem /etc/ocserv/ssl/server-cert.pem + mv server-key.pem /etc/ocserv/ssl/server-key.pem + cd .. && rm -rf /tmp/ssl/ +} +Installation_dependency(){ + [[ ! -e "/dev/net/tun" ]] && echo -e "${Error} 你的VPS没有开启TUN,请联系IDC或通过VPS控制面板打开TUN/TAP开关 !" && exit 1 + if [[ ${release} = "centos" ]]; then + echo -e "${Error} 本脚本不支持 CentOS 系统 !" && exit 1 + elif [[ ${release} = "debian" ]]; then + cat /etc/issue |grep 9\..*>/dev/null + if [[ $? = 0 ]]; then + apt-get update + apt-get install vim net-tools pkg-config build-essential libgnutls28-dev libwrap0-dev liblz4-dev libseccomp-dev libreadline-dev libnl-nf-3-dev libev-dev gnutls-bin -y + else + mv /etc/apt/sources.list /etc/apt/sources.list.bak + wget --no-check-certificate -O "/etc/apt/sources.list" "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/sources/us.sources.list" + apt-get update + apt-get install vim net-tools pkg-config build-essential libgnutls28-dev libwrap0-dev liblz4-dev libseccomp-dev libreadline-dev libnl-nf-3-dev libev-dev gnutls-bin -y + rm -rf /etc/apt/sources.list + mv /etc/apt/sources.list.bak /etc/apt/sources.list + apt-get update + fi + else + apt-get update + apt-get install vim net-tools pkg-config build-essential libgnutls28-dev libwrap0-dev liblz4-dev libseccomp-dev libreadline-dev libnl-nf-3-dev libev-dev gnutls-bin -y + fi +} +Install_ocserv(){ + check_root + [[ -e ${file} ]] && echo -e "${Error} ocserv 已安装,请检查 !" && exit 1 + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装 配置文件..." + Download_ocserv + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_ocserv + echo -e "${Info} 开始自签SSL证书..." + Generate_SSL + echo -e "${Info} 开始设置账号配置..." + Read_config + Set_Config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_ocserv +} +Start_ocserv(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} ocserv 正在运行,请检查 !" && exit 1 + /etc/init.d/ocserv start + sleep 2s + check_pid + [[ ! -z ${PID} ]] && View_Config +} +Stop_ocserv(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} ocserv 没有运行,请检查 !" && exit 1 + /etc/init.d/ocserv stop +} +Restart_ocserv(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/ocserv stop + /etc/init.d/ocserv start + sleep 2s + check_pid + [[ ! -z ${PID} ]] && View_Config +} +Set_ocserv(){ + [[ ! -e ${conf} ]] && echo -e "${Error} ocserv 配置文件不存在 !" && exit 1 + tcp_port=$(cat ${conf}|grep "tcp-port ="|awk -F ' = ' '{print $NF}') + udp_port=$(cat ${conf}|grep "udp-port ="|awk -F ' = ' '{print $NF}') + vim ${conf} + set_tcp_port=$(cat ${conf}|grep "tcp-port ="|awk -F ' = ' '{print $NF}') + set_udp_port=$(cat ${conf}|grep "udp-port ="|awk -F ' = ' '{print $NF}') + Del_iptables + Add_iptables + Save_iptables + echo "是否重启 ocserv ? (Y/n)" + read -e -p "(默认: Y):" yn + [[ -z ${yn} ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + Restart_ocserv + fi +} +Set_username(){ + echo "请输入 要添加的VPN账号 用户名" + read -e -p "(默认: admin):" username + [[ -z "${username}" ]] && username="admin" + echo && echo -e " 用户名 : ${Red_font_prefix}${username}${Font_color_suffix}" && echo +} +Set_passwd(){ + echo "请输入 要添加的VPN账号 密码" + read -e -p "(默认: doub.io):" userpass + [[ -z "${userpass}" ]] && userpass="doub.io" + echo && echo -e " 密码 : ${Red_font_prefix}${userpass}${Font_color_suffix}" && echo +} +Set_tcp_port(){ + while true + do + echo -e "请输入VPN服务端的TCP端口" + read -e -p "(默认: 443):" set_tcp_port + [[ -z "$set_tcp_port" ]] && set_tcp_port="443" + echo $((${set_tcp_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${set_tcp_port} -ge 1 ]] && [[ ${set_tcp_port} -le 65535 ]]; then + echo && echo -e " TCP端口 : ${Red_font_prefix}${set_tcp_port}${Font_color_suffix}" && echo + break + else + echo -e "${Error} 请输入正确的数字!" + fi + else + echo -e "${Error} 请输入正确的数字!" + fi + done +} +Set_udp_port(){ + while true + do + echo -e "请输入VPN服务端的UDP端口" + read -e -p "(默认: ${set_tcp_port}):" set_udp_port + [[ -z "$set_udp_port" ]] && set_udp_port="${set_tcp_port}" + echo $((${set_udp_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${set_udp_port} -ge 1 ]] && [[ ${set_udp_port} -le 65535 ]]; then + echo && echo -e " TCP端口 : ${Red_font_prefix}${set_udp_port}${Font_color_suffix}" && echo + break + else + echo -e "${Error} 请输入正确的数字!" + fi + else + echo -e "${Error} 请输入正确的数字!" + fi + done +} +Set_Config(){ + Set_username + Set_passwd + echo -e "${userpass}\n${userpass}"|ocpasswd -c ${passwd_file} ${username} + Set_tcp_port + Set_udp_port + sed -i 's/tcp-port = '"$(echo ${tcp_port})"'/tcp-port = '"$(echo ${set_tcp_port})"'/g' ${conf} + sed -i 's/udp-port = '"$(echo ${udp_port})"'/udp-port = '"$(echo ${set_udp_port})"'/g' ${conf} +} +Read_config(){ + [[ ! -e ${conf} ]] && echo -e "${Error} ocserv 配置文件不存在 !" && exit 1 + conf_text=$(cat ${conf}|grep -v '#') + tcp_port=$(echo -e "${conf_text}"|grep "tcp-port ="|awk -F ' = ' '{print $NF}') + udp_port=$(echo -e "${conf_text}"|grep "udp-port ="|awk -F ' = ' '{print $NF}') + max_same_clients=$(echo -e "${conf_text}"|grep "max-same-clients ="|awk -F ' = ' '{print $NF}') + max_clients=$(echo -e "${conf_text}"|grep "max-clients ="|awk -F ' = ' '{print $NF}') +} +List_User(){ + [[ ! -e ${passwd_file} ]] && echo -e "${Error} ocserv 账号配置文件不存在 !" && exit 1 + User_text=$(cat ${passwd_file}) + if [[ ! -z ${User_text} ]]; then + User_num=$(echo -e "${User_text}"|wc -l) + user_list_all="" + for((integer = 1; integer <= ${User_num}; integer++)) + do + user_name=$(echo -e "${User_text}" | awk -F ':*:' '{print $1}' | sed -n "${integer}p") + user_status=$(echo -e "${User_text}" | awk -F ':*:' '{print $NF}' | sed -n "${integer}p"|cut -c 1) + if [[ ${user_status} == '!' ]]; then + user_status="禁用" + else + user_status="启用" + fi + user_list_all=${user_list_all}"用户名: "${user_name}" 账号状态: "${user_status}"\n" + done + echo && echo -e "用户总数 ${Green_font_prefix}"${User_num}"${Font_color_suffix}" + echo -e ${user_list_all} + fi +} +Add_User(){ + Set_username + Set_passwd + user_status=$(cat "${passwd_file}"|grep "${username}"':*:') + [[ ! -z ${user_status} ]] && echo -e "${Error} 用户名已存在 ![ ${username} ]" && exit 1 + echo -e "${userpass}\n${userpass}"|ocpasswd -c ${passwd_file} ${username} + user_status=$(cat "${passwd_file}"|grep "${username}"':*:') + if [[ ! -z ${user_status} ]]; then + echo -e "${Info} 账号添加成功 ![ ${username} ]" + else + echo -e "${Error} 账号添加失败 ![ ${username} ]" && exit 1 + fi +} +Del_User(){ + List_User + [[ ${User_num} == 1 ]] && echo -e "${Error} 当前仅剩一个账号配置,无法删除 !" && exit 1 + echo -e "请输入要删除的VPN账号的用户名" + read -e -p "(默认取消):" Del_username + [[ -z "${Del_username}" ]] && echo "已取消..." && exit 1 + user_status=$(cat "${passwd_file}"|grep "${Del_username}"':*:') + [[ -z ${user_status} ]] && echo -e "${Error} 用户名不存在 ! [${Del_username}]" && exit 1 + ocpasswd -c ${passwd_file} -d ${Del_username} + user_status=$(cat "${passwd_file}"|grep "${Del_username}"':*:') + if [[ -z ${user_status} ]]; then + echo -e "${Info} 删除成功 ! [${Del_username}]" + else + echo -e "${Error} 删除失败 ! [${Del_username}]" && exit 1 + fi +} +Modify_User_disabled(){ + List_User + echo -e "请输入要启用/禁用的VPN账号的用户名" + read -e -p "(默认取消):" Modify_username + [[ -z "${Modify_username}" ]] && echo "已取消..." && exit 1 + user_status=$(cat "${passwd_file}"|grep "${Modify_username}"':*:') + [[ -z ${user_status} ]] && echo -e "${Error} 用户名不存在 ! [${Modify_username}]" && exit 1 + user_status=$(cat "${passwd_file}" | grep "${Modify_username}"':*:' | awk -F ':*:' '{print $NF}' |cut -c 1) + if [[ ${user_status} == '!' ]]; then + ocpasswd -c ${passwd_file} -u ${Modify_username} + user_status=$(cat "${passwd_file}" | grep "${Modify_username}"':*:' | awk -F ':*:' '{print $NF}' |cut -c 1) + if [[ ${user_status} != '!' ]]; then + echo -e "${Info} 启用成功 ! [${Modify_username}]" + else + echo -e "${Error} 启用失败 ! [${Modify_username}]" && exit 1 + fi + else + ocpasswd -c ${passwd_file} -l ${Modify_username} + user_status=$(cat "${passwd_file}" | grep "${Modify_username}"':*:' | awk -F ':*:' '{print $NF}' |cut -c 1) + if [[ ${user_status} == '!' ]]; then + echo -e "${Info} 禁用成功 ! [${Modify_username}]" + else + echo -e "${Error} 禁用失败 ! [${Modify_username}]" && exit 1 + fi + fi +} +Set_Pass(){ + check_installed_status + echo && echo -e " 你要做什么? + + ${Green_font_prefix} 0.${Font_color_suffix} 列出 账号配置 +———————— + ${Green_font_prefix} 1.${Font_color_suffix} 添加 账号配置 + ${Green_font_prefix} 2.${Font_color_suffix} 删除 账号配置 +———————— + ${Green_font_prefix} 3.${Font_color_suffix} 启用/禁用 账号配置 + + 注意:添加/修改/删除 账号配置后,VPN服务端会实时读取,无需重启服务端 !" && echo + read -e -p "(默认: 取消):" set_num + [[ -z "${set_num}" ]] && echo "已取消..." && exit 1 + if [[ ${set_num} == "0" ]]; then + List_User + elif [[ ${set_num} == "1" ]]; then + Add_User + elif [[ ${set_num} == "2" ]]; then + Del_User + elif [[ ${set_num} == "3" ]]; then + Modify_User_disabled + else + echo -e "${Error} 请输入正确的数字[1-3]" && exit 1 + fi +} +View_Config(){ + Get_ip + Read_config + clear && echo "===================================================" && echo + echo -e " AnyConnect 配置信息:" && echo + echo -e " I P\t\t : ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " TCP端口\t : ${Green_font_prefix}${tcp_port}${Font_color_suffix}" + echo -e " UDP端口\t : ${Green_font_prefix}${udp_port}${Font_color_suffix}" + echo -e " 单用户设备数限制 : ${Green_font_prefix}${max_same_clients}${Font_color_suffix}" + echo -e " 总用户设备数限制 : ${Green_font_prefix}${max_clients}${Font_color_suffix}" + echo -e "\n 客户端链接请填写 : ${Green_font_prefix}${ip}:${tcp_port}${Font_color_suffix}" + echo && echo "===================================================" +} +View_Log(){ + [[ ! -e ${log_file} ]] && echo -e "${Error} ocserv 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${log_file}${Font_color_suffix} 命令。" && echo + tail -f ${log_file} +} +Uninstall_ocserv(){ + check_installed_status "un" + echo "确定要卸载 ocserv ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} && rm -f ${PID_FILE} + Read_config + Del_iptables + Save_iptables + update-rc.d -f ocserv remove + rm -rf /etc/init.d/ocserv + rm -rf "${conf_file}" + rm -rf "${log_file}" + cd '/usr/local/bin' && rm -f occtl + rm -f ocpasswd + cd '/usr/local/bin' && rm -f ocserv-fw + cd '/usr/local/sbin' && rm -f ocserv + cd '/usr/local/share/man/man8' && rm -f ocserv.8 + rm -f ocpasswd.8 + rm -f occtl.8 + echo && echo "ocserv 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +over(){ + update-rc.d -f ocserv remove + rm -rf /etc/init.d/ocserv + rm -rf "${conf_file}" + rm -rf "${log_file}" + cd '/usr/local/bin' && rm -f occtl + rm -f ocpasswd + cd '/usr/local/bin' && rm -f ocserv-fw + cd '/usr/local/sbin' && rm -f ocserv + cd '/usr/local/share/man/man8' && rm -f ocserv.8 + rm -f ocpasswd.8 + rm -f occtl.8 + echo && echo "安装过程错误,ocserv 卸载完成 !" && echo +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${set_tcp_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${set_udp_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${tcp_port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${udp_port} -j ACCEPT +} +Save_iptables(){ + iptables-save > /etc/iptables.up.rules +} +Set_iptables(){ + echo -e "net.ipv4.ip_forward=1" >> /etc/sysctl.conf + sysctl -p + ifconfig_status=$(ifconfig) + if [[ -z ${ifconfig_status} ]]; then + echo -e "${Error} ifconfig 未安装 !" + read -e -p "请手动输入你的网卡名(一般情况下,网卡名为 eth0,Debian9 则为 ens3,CentOS Ubuntu 最新版本可能为 enpXsX(X代表数字或字母),OpenVZ 虚拟化则为 venet0):" Network_card + [[ -z "${Network_card}" ]] && echo "取消..." && exit 1 + else + Network_card=$(ifconfig|grep "eth0") + if [[ ! -z ${Network_card} ]]; then + Network_card="eth0" + else + Network_card=$(ifconfig|grep "ens3") + if [[ ! -z ${Network_card} ]]; then + Network_card="ens3" + else + Network_card=$(ifconfig|grep "venet0") + if [[ ! -z ${Network_card} ]]; then + Network_card="venet0" + else + ifconfig + read -e -p "检测到本服务器的网卡非 eth0 \ ens3(Debian9) \ venet0(OpenVZ) \ enpXsX(CentOS Ubuntu 最新版本,X代表数字或字母),请根据上面输出的网卡信息手动输入你的网卡名:" Network_card + [[ -z "${Network_card}" ]] && echo "取消..." && exit 1 + fi + fi + fi + fi + iptables -t nat -A POSTROUTING -o ${Network_card} -j MASQUERADE + + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ocserv.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/ocserv" ]]; then + rm -rf /etc/init.d/ocserv + Service_ocserv + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ocserv.sh" && chmod +x ocserv.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && echo -e "${Error} 本脚本不支持当前系统 ${release} !" && exit 1 +echo && echo -e " ocserv 一键安装管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/vpnzy-7 -- + + ${Green_font_prefix}0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix}1.${Font_color_suffix} 安装 ocserv + ${Green_font_prefix}2.${Font_color_suffix} 卸载 ocserv +———————————— + ${Green_font_prefix}3.${Font_color_suffix} 启动 ocserv + ${Green_font_prefix}4.${Font_color_suffix} 停止 ocserv + ${Green_font_prefix}5.${Font_color_suffix} 重启 ocserv +———————————— + ${Green_font_prefix}6.${Font_color_suffix} 设置 账号配置 + ${Green_font_prefix}7.${Font_color_suffix} 查看 配置信息 + ${Green_font_prefix}8.${Font_color_suffix} 修改 配置文件 + ${Green_font_prefix}9.${Font_color_suffix} 查看 日志信息 +————————————" && echo +if [[ -e ${file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-9]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_ocserv + ;; + 2) + Uninstall_ocserv + ;; + 3) + Start_ocserv + ;; + 4) + Stop_ocserv + ;; + 5) + Restart_ocserv + ;; + 6) + Set_Pass + ;; + 7) + View_Config + ;; + 8) + Set_ocserv + ;; + 9) + View_Log + ;; + *) + echo "请输入正确数字 [0-9]" + ;; +esac \ No newline at end of file diff --git a/other/Aria2/aria2.conf b/other/Aria2/aria2.conf new file mode 100644 index 0000000..0d9506d --- /dev/null +++ b/other/Aria2/aria2.conf @@ -0,0 +1,108 @@ +## '#'开头为注释内容, 选项都有相应的注释说明, 根据需要修改 ## +## 被注释的选项填写的是默认值, 建议在需要修改时再取消注释 ## + +## 文件保存相关 ## + +# 文件的保存路径(可使用绝对路径或相对路径), 默认: 当前启动位置 +dir=/usr/local/caddy/www/aria2/Download +# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M +#disk-cache=32M +# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc +# 预分配所需时间: none < falloc ? trunc < prealloc +# falloc和trunc则需要文件系统和内核支持 +# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项 +# file-allocation=none +# 断点续传 +continue=true + +## 下载连接相关 ## + +# 最大同时下载任务数, 运行时可修改, 默认:5 +max-concurrent-downloads=10 +# 同一服务器连接数, 添加时可指定, 默认:1 +max-connection-per-server=5 +# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M +# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载 +min-split-size=10M +# 单个任务最大线程数, 添加时可指定, 默认:5 +split=20 +# 整体下载速度限制, 运行时可修改, 默认:0 +#max-overall-download-limit=0 +# 单个任务下载速度限制, 默认:0 +#max-download-limit=0 +# 整体上传速度限制, 运行时可修改, 默认:0 +max-overall-upload-limit=1M +# 单个任务上传速度限制, 默认:0 +#max-upload-limit=1000 +# 禁用IPv6, 默认:false +disable-ipv6=false + +## 进度保存相关 ## + +# 从会话文件中读取下载任务 +input-file=/root/.aria2/aria2.session +# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件 +save-session=/root/.aria2/aria2.session +# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0 +save-session-interval=60 + +## RPC相关设置 ## + +# 启用RPC, 默认:false +enable-rpc=true +# 允许所有来源, 默认:false +rpc-allow-origin-all=true +# 允许非外部访问, 默认:false +rpc-listen-all=true +# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同 +#event-poll=select +# RPC监听端口, 端口被占用时可以修改, 默认:6800 +rpc-listen-port=6800 +# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项 +rpc-secret=DOUBIToyo +# 设置的RPC访问用户名, 此选项新版已废弃, 建议改用 --rpc-secret 选项 +#rpc-user=<USER> +# 设置的RPC访问密码, 此选项新版已废弃, 建议改用 --rpc-secret 选项 +#rpc-passwd=<PASSWD> +# 是否启用 RPC 服务的 SSL/TLS 加密, +# 启用加密后 RPC 服务需要使用 https 或者 wss 协议连接 +#rpc-secure=true +# 在 RPC 服务中启用 SSL/TLS 加密时的证书文件(.pem/.crt) +#rpc-certificate=/root/xxx.pem +# 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件(.key) +#rpc-private-key=/root/xxx.key + +## BT/PT下载相关 ## + +# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true +follow-torrent=true +# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999 +listen-port=51413 +# 单个种子最大连接数, 默认:55 +#bt-max-peers=55 +# 打开DHT功能, PT需要禁用, 默认:true +enable-dht=true +# 打开IPv6 DHT功能, PT需要禁用 +#enable-dht6=false +# DHT网络监听端口, 默认:6881-6999 +#dht-listen-port=6881-6999 +# 本地节点查找, PT需要禁用, 默认:false +#bt-enable-lpd=true +# 种子交换, PT需要禁用, 默认:true +enable-peer-exchange=true +# 每个种子限速, 对少种的PT很有用, 默认:50K +#bt-request-peer-speed-limit=50K +# 客户端伪装, PT需要 +peer-id-prefix=-TR2770- +user-agent=Transmission/2.77 +# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0 +seed-ratio=0.1 +# 强制保存会话, 即使任务已经完成, 默认:false +# 较新的版本开启后会在任务完成后依然保留.aria2文件 +force-save=true +# BT校验相关, 默认:true +#bt-hash-check-seed=true +# 继续之前的BT任务时, 无需再次校验, 默认:false +bt-seed-unverified=true +# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false +#bt-save-metadata=true diff --git a/other/Aria2/dht.dat b/other/Aria2/dht.dat new file mode 100644 index 0000000000000000000000000000000000000000..20b86bbac96c15933191d508a81b77330656749e GIT binary patch literal 26880 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 JzaM<w{{eaYQmOy| literal 0 HcmV?d00001 diff --git a/other/README.md b/other/README.md new file mode 100644 index 0000000..668b316 --- /dev/null +++ b/other/README.md @@ -0,0 +1,18 @@ +# 一些脚本的依赖都放到这里 + +jq-1.5.tar.gz +====== + +- 说明:JQ是一个Linux平台上的 JSON 格式解析器。 +- 依赖于此软件的脚本为:ssr.sh + +### 下载安装: +Debian/Ubuntu系统: +``` bash +apt-get install -y build-essential +wget --no-check-certificate -N "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/jq-1.5.tar.gz" +tar -xzf jq-1.5.tar.gz && cd jq-1.5 +./configure --disable-maintainer-mode && make && make install +ldconfig +cd .. && rm -rf jq-1.5.tar.gz && rm -rf jq-1.5 +``` diff --git a/other/adhook.ini b/other/adhook.ini new file mode 100644 index 0000000..56b047e --- /dev/null +++ b/other/adhook.ini @@ -0,0 +1,20 @@ +[info] +id=ar71xx +[update] +rule=video,lazy + +[cfg] +listen-address=0.0.0.0:8118 +buffer-limit=1024 +keep-alive-timeout=30 +socket-timeout=60 +max_client_connections=0 +stack_size=200 +auto_restart=0 +debug=0 + +[exrule] +https://easylist-downloads.adblockplus.org/easylistchina.txt +https://easylist.to/easylist/easylist.txt +https://raw.githubusercontent.com/xinggsf/Adblock-Plus-Rule/master/ABP-FX.txt +https://fanboy.co.nz/fanboy-espanol.txt \ No newline at end of file diff --git a/other/jq-1.5.tar.gz b/other/jq-1.5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d034ef9459e2a8ca010cf080f1a01a28ef3283ab GIT binary patch literal 739309 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%0DFo>Gzl9v{6wj02F_KwyYZ>QFL3#pY^hhw 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 xGSk5C~>!1E%5lXVe)mvt)X|@Yi-gF?v~=( zJLOhz*lJ_AsaY~u6W*@h3A!8DR}vpUiOt=St;QxT=LYTO;A3XzBief(A{@}>`(e*( z(}z*d>(Ga=z$#GnwLUic#&h`OHW^%CqXp{Pm#ZO1xnk^F--vzpGo8t74QHX5nQjUG zSGSY6zS}l&MxSHZv?X&TsN~p3XzNGv#t|GN_WN5?=t!g|s&_MUP0%c_jO!{Ky6~+L zZrC}U>o0TzzV!XG*%Zl+^AP?HO0;Zt85GWB$$XQEi@aZ7*&mscLYV<+gfTi1>xO4Q z3QrSU?ptWxxg}nqM_*rd^=6Sp5RozgEi0YXCihY;?jt#{a{&od=i-~l1O}<rC19E* z0*tJ?jcq)0sx#xx2cIeU1%?dCoDRQLL7AN1Bo<l*^Ru)acue>R-dnC6p2$aG^rd4W z=1p!JVt^R=6D^`|gz0&YB@<+rYPIA9$YSB^wQn$Udnu8#NXqeQmS*@=BCPn3KxA9Q z`~f3v)e>dG$JaSQt){mHTmF{UDLh5n#k+Z@6zM{1coxcR-2!hIi~<ZK;BT}(^Qo9< zu1hhp{|1nyYX{T5xPZafZ<>MN)Q`f?b~||_eNkvsBjLvU%ZOtg$WT}n6R7N1IZ%oT zFR4%{8kZx3)yxTzvP#dABV}JX&4fS!^4S6cFy>C=G{al*1FyJ*n)V4N+g)*Xsag?W ztXMH50A6NJ3#99WYatm^${Yd(hCMuAS^`vb@Mg#ET4Un?<}d=fC5i@6Ak;5uf=^db z8#%gmV^g<o;pX91oERxrRh4s7CAxA&W$}Xf0q?{11#5fDE*jXLI{_YtX3^#(Z}4k4 zY^`rnY9X-W>R7geLgzXzPMP)`H{mIBy=dvb_?G)d>W?0`KE<C~<)aihMrG)XuDt`r z^o*XWD+ifROO%XihR9XUQj%g*LPaoR)tVCUlJz>?qnK_ok}D{W)5(7U?>Og*v885W zSAYW#93O<^FddT<4O;MH4kjv#e3-ix$xDtG14pb^f+jd%n|Q->u%bPlk7HM`#&=RE zgjY`lwd749v{@60Jl>}D);0DwLRLzb4M&2p(e_zT>J!o^bT%l$o{*a!)mBx@?}qaJ z`(5NnI@{%xS~DProTBq{68^^HgAM4VfkPxVyxOuUuengJzP!LhEF|e#7)%K>s*HHp zxzS0)NHIt#3yi&s5S;1_Xtj2vd*WOh9FGbfjZUHwMLAHw9%1>Mr&;Jp1XSCQ!S+_s zctdO0XeRQ4b+pH%?8?{JX&5FFhe0~2TCLRZNUN*>k(OH%_1UM4Y>vuzm+G@!+8=Hr zK;E_~-k`iw>MkHN$KriAj;6nD-(ds7tl@H@_@52Ekx)(3C|e{X(_9lwa6}2?Ie2Y( zI`m9lVVAFrwgbJ}Y__!RC#={8Ka}DMr3**Ez{Tpd2c;_~{=n3<G`eBw#9y>%(U!@f z$Wf7b!-=%N<AtEVUwv)i*3!al6~`LR&GIy|uVPUO+aXfbzdV71qBk2<E7X>Cv*+~f z+CK5<P0xFGMDpTu705xvwRU)%oSlp$+RRWh4Di6By@8n~sNnNE)D1gm%9%SBlT+&p zN|9|#$%CBpzcbBM+=fSa$3z^9H381t<3YztK&$1}&xC^kcytK9M1@y&tw&Kj!bA=_ zLTcZMk8#K~fL_Hdpk02S%FMH`k4$}wj4=86(0YzXu<S_L^HO@muh-Q^X_+;&GLW1# zZy>JwaNqO){qa8zeUxq1e%s8wr<PP%{H(z#Kmu&fa2@1rkT%zqU2BE0P;o9yG>drR z92c?vW%@7G!Uq)X7lhoOCvHed8m<cD?Amc5uV(Fh*5u&spT-#~!Ie=PoEJPgGJuBn z;JycU<=TCZbP18xM}0Pnyxz5+YrfRGdK(D7X0Th1#IeBcpm+gU)`=KfNO}B75wJ1! zIDSzUzxY|iYxq&Darx<VN+0;_(_5hJ!}OY%Ul{~uVkX0)J@FzHLO#md9S06OCU7g| zr18f=tE!=8P%L6XW!LODr=hVihPa}D89XN5Q}|H#f&3sw#aNOc?Rw1d2LYh$k{$%_ zFMv$vyP5zZ!cFM54Km;L1&(Hm<@r_DK}ze>rPZf!kv>!Lkf&4pB0(BhLsWW<P+B?~ zg_(-Qg(_P#p;hUP$pQ`7xnAuWLcPEvFoDduw#<uYqp~Olc(}RcGDp)*(lo&hg^Pg4 z`K-2CYW76fYGprqhUZ8siofD&ZfBm*WXhEs9UQFaxM5M+?R7U#>br5frFsXdCgsNS zX)G*COr0#34^yL958cvdNzobFj6Vg6J{+mQLotO@cMdlujpm3{*Tkeait^wTYpZRo zsaEf;ujwLOo@ASs^tsG1#s9+M9A!I~XC$6mmmWqTh!#uNCOsb>g{tF5rHcs>k%aNV zyQ+b$Mbn8ZY7}tSm!OhU7sCuQtUdZuWo1EBg#%kfS?q^~cOS?NT5w9_!QUCn`Zcyr z!&N1x3WhS8k88CLa-WHS@qyQ@?OlBt`vg;Yh!Mh>EJ57B&h(pupx?rufIbEM88B^# zTu`yVJDeQ;*0qL4kTb2~1tO;rKd#9`)Sjq0o8lU~y>Gz%G;_6aZZIXurJ4YR&#<s^ zdNHBQ3XoIgIj$7;o-gt!(PjzCQikNDGqjJeSsl3eF-67<vr#yvDr7fAil;);CkK>C zAsDu-s?OFK7<Qkim0X;8QQ)!Dn@UZE<{QRZ%cQm-o5NaBXfE3vn2(rDBhRwBzSl12 zOSTVGzSQNi+*1ujmt{;#Y0G#a2VN-#-nnjjWeu@!S>Yz0my<_jTN$d9ZDq>h#e}A! z9UUpWwat%^s5>&T`j99>3P841ZmShVj-kkM)JmgL?tZXgx6CbKPa=t4UkC=R6fcG& zZ7f+AEaMNZ*|10yH@8f0uif;e%@ypR>Gaw=2+gW~ryXQ`=dQAY5J~-}Ei|24Td1s| z%XU!C2=7`uX!AO6Zkc7$AG0;f+P$o`_3e|QkmEWc6sciEDdytz=#@=~OX+HNuhn!! z6uQ!mVTVZ^-pz-|!k}4paI9BarJOlzgYk<f46fk)jG0sV7C3_=Y@SSb1#qb6?DcEg zOmXY&y>9LL92`Yj=#<Lc`ljuVVGo5lEU?<Q_QGVEB<bZem6S6(z*dLSJC(f<)+tKk z(X|OlYNU9SokpwM+P+&h(9WfU%-*KUD~yqf6%R3cyTa|3CY&|%w+s|}DIVu<7~wME z^Kpey>Y~<h#zZAf#NSNYrC}6^yqr<#Nl4X&;o|Ei0=#mXXM^)NRr6#s9hx5um{Bp_ z_0wc7Hohdw)Q0wn#B-4#dDok9X8F~)OSu%!Z<P|8@U~T~lj8ASY2Kx%jYh>1$ewrG z`avQVzEpt-QgOu8l4`Ny*HdFG-YUf=Lmx4148_K23t)!IIXfso@g(FA6fF*gjNH$) zt|h8ad|;ImNlfto*@dKddX+<IoGJf37RU-kq-3{&E`E6krmG2w5X3SmQB!CTnAia- z*i}dh$!EGjf6CC3rj-Xk)*U1~3AEHCkkA*#9IBY#MgyXN%!m$$=hs>qtaD_kRx=6& zqIbHQ^clK=4x_@bZ+|n^n_|c$3eib|iJpjUMw2ARMDLdHpzb4PG~8!IIXaKlNsL=2 z4hb4uS!PsX4OK0&q~cRpbJ|f#1ZZX&otYM#LZUfX^ZUVq6p-F%7g*~$jhD+QCkKL7 zC4v^^puFi|0LmVevgrta7E`MjO}ALEKnhii^dOoH$C%5`QX;`qV&$Qw&CLL>hg0J% z`p!g%F$9~21l5QD4g7J%hHA5^oSrHg2tH?f>Ee9UYi`nH*@G1p%IcZ|fCxv_&^@s} zaDB4axk__0`I%EWE}(N(5IRn=w#526v_Vov8}#o49ahZjlplV2-wAetJLURiHR>za zkaU#=NvlcPWqQ~#53Q%#*rc_=7HGZfC9T>36eFnPG+8aKftz#%9{&dUAQjB=Az##P zI0@frdwDeQ;@IM{AIVcob0c!{%Q$MoJ!g>>rP+yzDeh=_6d9;vDN*s*3`MzUSrED5 z?&p$o#l*}*Nk2K{hcbe2gqiaK=L|adfYLzG-j_53l#U=_4>v}Qapu@DYbm1}v}U<} zS+E%L8mGox)6ILjb@e^ny2_s3*sk3I+~h^Ql?b|L@tn1BtdxuAxX1ayHFo<Gm8BIL zh-WKGngcD+#|;t6tjx1?W(XZCw^`1zNV-(q<&?Cn7%QhP@4o<!fn02HIVq7+)HrUa z!Kw2&iRa>xS{!wPwiG4~!n7Ahg<Jem+AE%y?2+xD8?-kVHncZbFrHm|19l70XJ?bS zPQGa2&H-xV?dp1Dv{W$%uuM*9Bd!9eiP}qS@+t@{$R{}q^8PmCl>~Un#G>*#i^;HW z(6yp13jVY<X<gZ^a(l30Mz2c%>soqe|1q;0P2b8*Lgyzm)9qebYU)v&HGjjb69UOe z*^1!7TZc2YA>X9&2?s9Y9D;<I?MP}xSMf)PZ*S&i_YzxJedfHjIdj(2j`dX29NzZj zq)bW6ZX1J3$G{ruvQhY>lhypqIUCQ85@P7yPy|AXC=P2mCQHCDLyF^gm2Hf!zTTEy zuh3*G#l_67fm1N{m0`-Ma`sWORj#|qk|OAq54H=h+d-@NR4d=BtLu|hjq0$L4>pcA zf#|U4IT<*ZEn7xYoz_U44Q<2ThPSW$Gau%wt2*)AIC1V{M-Rp5)=qG-4=t&q`Ox(z za9dJ^_C3y->==eT%*l>&RnPS~hp*hDSV%w2ceEb2YCoqf5@D6<)$PkAyd_IC^qKSg zLH?1WH?r#oM-@e@y)0YJ@?mF(xlTAHEDIG0rgOu{USpr?ok6F*<QyYzz}IEl6*o~S zuFyU7$$(z)OR3Sl>MQX06W0LRY*CIIuF*gK`(0olInCujaJ;n^kV4P_)O!zq7Wm*| za8cVF9=oOKC&C}(@vs15j2=&8{0KDI#c!LWGWfQCclgu<uH!rLR;y;UtC<yPG?7bp zBkgc%mLo~Na^(0PQRITG!Pt|D9AP9ak2*K!%mkZQ%S6NgXn~UITIVWO-m+-h!hqQ5 zEEgTMfg+_Pg|5c(33YjmL#`$ew{fl1A$u5jBlO3f90%S>{Q6C~Uv?+h4O;DT@<8?1 zDwh%C4rvi>+ucOl3T3;w8*-1`+!b|1BsG59*<=CUVi8o~HjK`269O}v>MvI|bmRO; zDp4OvJFDC#hq|Q<wpD5QsFvT96i-8z-f^$F-aY`JKhZ8ISN^6}KZD=iQL9}n;K$rf z8D6PZTLZEGprjOB*WAbK6)6OX(z#s6lo0LI4M5_7I4Hkf<Z6+dNIsccho24oEBOg( zeM`<^vB184KK{rFqkvhTcDfWWmrs^ED_5NqXKFS~$`pn%gRxv~QjEegHyevInqVFQ zo)lq80}gB8DDKS8i?2Or3fAAe!NScGNe%dD$0&8#1yWTjw9NT5)0nL$zyCC*pK2N} zIi&V9`hl*esudp5v&A$SN1JEy5gRd>i1=#0+}P(z>cUEJmp@bbzI7jj%Vtm@{5Vdb z-)h3W-)hm%-8;cuAS7BPP6HVJ@Y1PZI*oX3lHD+H*SQmC8-~;0*$%v&9r!6H82tT* zkBW@~C{od8@LzH;qx?FGO|_0)^f5@5dcWkd|F{@D>m$Vogd1cmwn0Y{i<yJoqnd}8 z&=p$Gt^+$cbhR;v(9?s4K1yk0Z3bC@o(^Sb$JbDa*<_js5qKXcmZE$+@)8WiiIM|* zaS9TJW+BDYFl9a}w=#EKzFzA~QEFXoFKmfij67AYXGtk_ENvI+Q!=ekiNch4l$63c zgw8~%xQZN6ewB);RCGr1=hhMhORxdQaC92Ii>8?N26MAy<Si-&RmQ1D^1(;hdA5vZ zy~<j=U`{LJ`CBA_Jc*}cAgnQXVXmZ8b{NkuEuOEiHO=yM1{cBQ)v}ZIYDE>TYA4Ao zx*mL3V+&?zaS~l+WTkbtI1ND_TKungBRxw_Ikyh4ABRyV#TxGeOT>oDh@IxrI8g?6 ziWjdU@~h-Vz$asQN`9;$l6)UWfs-WHdb?JTwq=GnP)t;M3XbOpIFayJ+g-~2%WAZy zvLIbYaxAR?66y~&%UrZDANQ7*dnij$j3tWVMCWS<S833xyYZ#n$|Y@-BCNx4ayq{% z*4p>puHpy<;8w=zBR#(`xv<=hhhMMA!_V%z=ULUiF;01QD#gZC;d_aJC+a5hgfqs5 zr-N7_a-5IVX3wJ8(21gphvk=_LZF0?wzjM|wRqZ=oG$?Od?P$EzL6Nia1U)GoMX}W z5FX_+Ctb<dvhkr2epBY2P0n+z4bF3guGlX%JsYKqWE!eirw0dY^R$tudOFYIaisMQ zCMSdFEUnxzF&CxK_>Sgsg4-sf+|=1L%uYC{G{xr5rJvCuoLHup%SO)7tLV&z9KXi= z`bHLc3RKTQwNc9%eo~k)O8<I5{<|eX7rX6Jioxvy1Mrk|(Cu839Z+}^*sEJ~hf_|r zD_9s~Ow=QeX^Qput3)r#yzy$b&=$gycx?%nM&=r`k~O&XmS<gsC2(R8aL3$lKG9M< zm!OI&EN!CsE6GQeXa-d%K(@8C8d}X~2{aNT_X=}4RegDE&77GOZ89ABeqCNxfil=& z<;;Am1Ss0TuC{y$qu}=s@WX*W*brDvy2n9%s?Md?>jUsX?U_#iiHaqm3l`v~C*(BX zq}hwIQMf>R<V!dEU&wYrWe77_<Jc3yG!_+w+|cLJ3ciAymV9x4e(?kB^Kmj-X{~6e z!x!db)_(u$#~<*}{PN=un(CQgD5Qo0(T??;Ge8&3a>B0HaA9$jCm`%7XOo@{(rD(* zod1G{^C)-OJ_6b=vwRH#U?}AF(hLX1Sc;ZmJawZcV4H+7a&5kh(m0&PS(Mq9VtnA% z8aP?bruhc;B`*Qa)fP;Y9v20ooP~>pQZAXCR89j&_a6NDrhjC7N+M2%XUGm1^Pi{7 zJtSNIe2jnH`hNx-z%N6XT>galt@e)A2Cz!wGWdZe7(rj`N|6UYr2O7ll)i&?{`tjI zH|(n(7dh#BM_-?v!R7_{Q6aGg!zg=q)GJF{>!{VV`MmAc9ups*BDs_DrhD}AZ%zv& z@*5{B++>pH3wMP!cE?uaIUk~&?GBRZi)cyFn%AJuPOb)gY#Ps2@e*U)5ELuUjVU>& z=i~Y`p1V<WDIlo#)AN^4f8m_7jUu;EnGq9tBsT@DJp=+L;>2qcFI$A8$VvvNZ<CVI z;An?o7VUKNTgDlsxJxm9;_@VUA=}BA?RQ^1dE|9>x_5HHT%oq0I6)&i(*rGGRz%_9 z+}U?1qqtK$2_<__;6`K|wM^bbb7dg5CZU;92%;$)`ATZ9%oU8PGCZxffIPnCl5w)q zR+^TOLcCajqpjIEQq-gs=6oF#lVV9V>tycEGaz`VJ^y66Tx7kit<%%f#&MDyPooCR z<`zp_zIl5e$UgpD^DCQjw^{Bdtcaf2Aw+Fv;Jwcc`aS=YrDxvjx8L{|M{6w7rNCkR zuiMQygI}-Te%+ZkFd80(mSjo^1Oqt2C=G%wF$>c-0VT>&T2Hv-a+W^G(#UiMlGXX# zJ4K~Bn)Vhi_ciD&x*1AjsIPQLc+^pxdH1|?e*=~67Dl{}<$=KXYD3qae-DoL{K5V_ znV-*+6$>1D#0lKnqF2!8SB3E1<7B=M;HpWN)dPQ;Ouduv?7*+>K~;X2uWbCVi~B{e zxhh^*+%n%u(mH>s?P0+!Q&PcNmXG}=;9t*=Mkfgkt(c1e8u9tf?*Yr*%)I?+1jJ&A z5BUMNbo2Sm1Ne87>+naac@wG*Y!S7l?jB(PR7zwwWzy~ud(UJli&R-oB>(9CeY~Lm zbpLXtg~dVM3^6Rw@TPlS*<eQ{H8d_eA%Qf^IVZ6LQ`IEx5t}eA8MOr+#BXRSv6c&z zDV8`^;6DsEWsKyl?9$LN=c~e8p)udt1c{rzN&DA7)p^wcLy%h-v4}e7bim1UVK(5P zAdzZo4s<ChaUZ5#^@=SCbI9|+c`n5G=A5%+7DVSJPs`9GNYSQw)L2RGq(2dGKH(hf zOcF=JBL0aM(aG?m!jfwL7PZ#b^JRr9t#Zbu)o6+<t3M3q@ZTkta)GD+@>1&$Ye{6| zNgZvN>KLGE(~drZ{kG5MP7gVn)g!bS5Mxu6?Ai`BM-R!Y;Ap=v#)3+dA!d;%bs*@F zR}ueKq~fhM-GD(ykB;o1m4%D=NX4?I*p+tcVxCGl%~QNt*0PvjbP6<th12UZc$6>~ z^C@CNaJ@~j#h=cXC+Ma`X+iQamLyQ4WM{*uv6Ko$wrhe!!VHt$p;D9bz=gxaxuqrD ziliP<^7NjPcin^;LSGY!*DYQv>u$tE&QhQf*0|wflF*tLbe|XWAuVVi;M%t@%Haum zN)S&V6N8EERJkFQ;Gl-F%<N|E1gE@Xv;eYj;e=Q=qu$?;qm<bR*Cbe>DULDXgb_le zgi0nSxdYVJ$i=)QOcq=Dsxjw--R;fH?u%L}84#s2L`%Y~AaxjmCu<T-ts|zS2UjOz zKGbt$8=3V0UTNk7I?E=<5&5~t1OwG-mDEb+(R!sUS}%y1f7VLQ3j<ZP%g8BeL*uOV z%lJXyJ-8ou_weUBn$D5F?yb~GM-T93e?a&9J^rm?`KSZto=o8NDd2(DSYvXAGzyo3 z)B@)lB8&B#Gq5DDssQc`G#At_xGzp}r#iD!S=(aITBFoMJLmLBsL8}vBLxLHI|kQw za%=!qynXXJODnd@`6Y#Wb}LD@;9zdLi(bEF6=N!fmy-7Ep@fNY(t}EK#2=Q^3CNp` z!<5{$3Hg(e!o<mxTo+tHv2XDnS#w6vn1>58!6MWH>}1BCglg#uA_T>y{Cr$HHH<ld zWO6q<$-dU`qN9)(RJF8|b8;|DmkbRR>8S&~=dDgL^<lC+Voeo=B}K(aKJNhZps#al z6#~aoU*tcS>qSJ4O3;Xz*Gclp30M`bT*M2<E!Xaa#SAE^fYoPwDS7GHeT*g^GoL%S z0Eg1p6nS}hl133zm^N!I^ru`aloFhSZRO+8XPm%`8n9%z$I*NRG(~Qk;?@deRBj@* zx!i-80^Iv4N~c>)Yizw(4bQ!J90OtPk}U+`A)f2QS$KXpj1Fm^l1OzD!V>$6K-X${ zm5$ww_m2$&sz(dBMa*QBN;`mY2V^F!rLcu5oLHKZyXjk8$$BHt-`euch8#xI<n*JA zX}WD*10@skuOEeKqr*hiGA||bZ6=^Ut`m#?{^}~-;mDjPCEP!E{MA)@F6RYGK*8UI zko>k8SmRAfl|NRmKwiSJ{g^;wm!w<SN8E#%4BuH;vQB#TjX5{9dPGcF@XQ>A-qw~k zJaV%o=GYfSej*za9uXT4e@zwj-r|kcBgBvrmBX2O&lMvSYyiONc6hWd$aU3CP+#&h z3gW<U|AbMY{TB0l>qnkgnxoc{h$hnLCdEt_PhQJ6&%J=f(~ttC16LNKmp(LflAL-+ z7}gEN%$jqOXb-}6*+dY@6{v!_?J}eFP$~qB2&Pc*TJ}>!#<lCvJu)TT_9c!}cgvij zT6YH@+jd!#-F8lWZ)Nm;haza03?NHaY2;>1=kk98x|p*DkfS07yvUO2YKd|njJtuV zEtvmVk}VamB<E2&$c$LwiYAgV*bl72G&&BKn(6Vw93(!r`TDJ%`lr%^)#^J3FrsSk zf@L;4nNS`Z_EtbfUFB~Nm!ZD%fapN+7KS~s6E^3sL!eNI!)2PBME2a6u<^<&En8x# zc<D*vPX-SN&4gglQVtq2A7>P?Nn?UIWC{bfaiq*`!M2pbra0!i=J8dx9307sng_>z zi829kaOJFB6nN-V3|(r*6IMvCM1rSar!;qZL0EA$1=>byfDJSzlol<cmHJDf*H^T= zZ>W|Wx<qz-7#|-;l;f4CVrr05p5t-WWcf56reUhIeASr>mt;bCtwuz%V|0CGWD=vW z0XK^xT2E8*Os{CayVq~cX@3&WF##b8C^^R(nrk5zJu=9_GMb?f0*mA{N)c(2yh<7x z!j?cp^9G%NkHdH_;sV^zOc9P*w<P_UX+$(vaTH_2n3Y+Dvmv0D$*T29z8YWrRIS`p z?luuqY0Gs<GsSoY!~0-zUzeX<OjoD@JXXRLMi~Gq?JWCHkXRVm8nw+swaHz<GO>5j z8Qc#)l7qM5#{xp>O09->-)*@10`7)6=Df}e+XM1-9HSXB?1yYMv>CiAyNiahe}=qy zDABJZ$tvI+sgD{>hl8O|Hn+-FxWv{p#5z+Y<C<{IjeL0;kIE!Tjvi5?Gi9Fui<JVZ zG?M6oOcV|w@^%%c5ueCY3-~yXdtplfK7tD~Thfxz<vjiWv-c+eZe8`gIBvE=)KZof zn$iL{H#Q?Vl4dlEos5^ncI?E#8(y+79;_?r&djwXU0GN1%)}l_%idCGOZ(XO<pF_G zc4#R}p+NiCA<(j>lm~5C%D%OM|M@OwyNhPzg!J|Ik0G{nb<cjz_k7pSw~_GMM~k*N zDhpnRoXV6ysqi<tY#wihVTbZ-B8Vq#Jvb%i^n!+V8A05gQAZ}sB}jQfb~oMpWN?9j z<!lLMR!XI)-_nVgRW9E1u8u0mShOQyQE@{;1O&@u6EKPDz=4RJu;?ulgk1BCudY?G z5G^LAarsJ7NVQ^s!5M(oT(e1N6lsK*3snl#V*LVyiVQ`qme+lcJp7po>75`IlX_kR zU0g4JuOhaAwSoCALZ@zu;365lx?a3|HO+yL*P5Wo0#Z2N3~b-slr2@FeT}LUV#lU) z8SWd7%-0Lu#KI@|!8wO^k@Yman(KUZ4|~K2AXEmT(lq4SpfeW$Sb-s-*C*cwit@%u zOPQ4j3>riaC_^m-H#7stgh4Blv4701#D4XQz9P*UBfS~U!_^EbADna7>x(<M%bE(j z6I{!^%WpO!shcA9ggFJ%0S!4Fai=;|8$9aL@><vxUEgccvI~Jk1#O5^eu}Jo1D5Qp zi@gRH_p{thaKGyYa1x>r@j!Vf;<@N*+f9wKP}QkAcA(j>#J9eK=FO&W*C)tT6t*kw z%50)e7Y2o6qP*bHGSsSU<-5W~aT~h>I)l~7CPdjo_|e&4KeT|K+?AEAO{iE>Qw4=H zr2{H?O$Z~&fI{$aJxrCC7zJy_2Cl@a)1MgpO73<|e{w=H=L4@xb()IKdR&^K=ETW} z&P%3nHlvW(=|xLd>w#DI9NohKTy-GJqd6J&EX-j)x#b5;U0F8_w1+;ObIQ122vvL* z=cUM%PV+l6W%`~KO%wAY08)$%EJ5XEK#c(LXIkI1>hjm6tc+$$9l;_|>MT?WXb~gm z_~6T?cNh3Ef*P|M%mZs|q!Wze-c{G5!(fjXHjgo8(E+;;YL3VR+w~&Dl!%O<t$V~_ z0DoX9DQvMcs)yj27fNS+b0Efav4sO}wa7Nzv~Xh#y`K3Y7POFFJF4EnLx@bq*<Hx5 zvZo5?y{Q&M!JH1G<p2%3+I66o5dR2nd;QWttw&`{qQ#7ljb(zuj911|)N&(NN-k%Q z+&Cj^6Jw+oAwjfDHJyhfkQo|RYzdd`1*!2sD!JP<j<d2QgB{1n0U#P68CF%PD&3vP z3YiuTL@`CXxt9`;phWk4kdpe1Q_j*Bmq8OT4<SwmR{+#5RU3fY0H~ib97d@_#^kpJ zu^<GjJ~z9?Qg_O-l-GhY21im*B#>6|oeTqUj7~B*N+T(w?I8K}Q3s@~`oz1&5g0K} zgEWVTEWl#g98NQkvZR<Xm!@JQUI}JLjRyUl)l|W$)Xojob<u2MoDk`Ra0!Xfs!5I8 z@3c}$T8>I;25LSa^aA@w-tN59$s@%ihH~rc_$J&!_Dz_&oPyiMMsZE&m~Dp+Q?6D# zy#xeqt@Cw6`z6(6%S~0)#%Ph`^3x#kiI8i0@!1AttO?-=A)v`M8X9#kF*q2?jM%O? zF5S_YvDxf=?SLj!oDuYCd~8t4H$*T3Y+QV^SQ(q09gu81b<&s2312E~aqJ%65gmkA zRTssVG%LqpRAj9sdY|LKN$({CSWpbLL&4eA+X&}Pv2l<N!nlwD@w{H|w+yvKiy<u> zAkEhH7mUp!Xa{yso+a8CLbyTs47EJf8NyKH;0thaQf;Ng?jjov^bJ-f=!vHDV_WDZ zgKvdwr3>y{wvuzS<;<)$vp_tutVK~JJ1MvvHJaNQnV=W;JdoN!PFAjxW2g>^nPk=A z?RE{n(a4#=+;JezRha9wT-*f_t)mXtFtNyvXnqVy8#JDnzA<2bCiK*uGbT=aNs)o_ z<5_Q~y<ACud6=l`)z&x5zjBO_c(aj}$FvKQWlj+rZN9CXabjjd{VO|!tBeThM#Fs0 zQpF?nZaJl3O4?S+@G`{sf_9PAnDhN0T2R(`b*swV(<3Jc!7s}&61CPPREElw4G2L( z0Po<C7#RKt>~Y(5lt(P77(!GEFN=Gsi|PaAN-4U7e3ssV$O3SF52y*9Yn5@5f6> z@_!+11nA<SqolB4<%F5~ny(qu*#fJo;;W=_$Ll~QOJn3cX_PDy`$om+T7!<w`#q)0 zpPvUBv>SARl%;t@@RfKCgTR9&oox;S&1>&xR-L3QCM4NVnpHe+(uEWpON$P8cN9&J zX}JmzAc5VL%s|fuLuQK$?+|2c#CRIM51Q7_vbH-B{4q~&&7Wg47M8+0S?}CDT7&&A z1}++=Fn%4jq0(wKNcbbU20o2Yb*%Jsf`;!ER<T*Q)osK0@k#Vs6iT*9%QW-528MM4 zuHDT3tn&rxO{aul6lIu&Aqm&0rGlJp*C%s_vHx9+42HxWwA(Qu5`I&g&<21Mi&nzB zRD95BlANH`>i5X1XvYwxON~4Y<ne^x#K#+9Vg|^fu;Ha!oC6+gCB7?wSol54qAY5} zs>o+K@?%z&N>Mr2)9q4{Y7}X?wEU)va?2aFpi>j1kU>(SPsn1}Z#K%#u{K{#;Gm^{ z&DSgg4@JFt(J6HI=QGb$N^V;0L{+}Ps(IUo*jh>;Jxmyl1UH(%N$G|YKwDnqar#C+ zi0s(Lgw!Uh=tXY&bS+}sDP}QLK7crzqLcNYE4T{U5{yoOX7QLS8J8DQ2PmvT>_Azj zJOCiu@LfmKrI1Vvqb~*{Q|rJ;D5PZDLo+W;vPw%$244ckRNf$wO3*DGQH*L%_aU?b z(J^T07*nVn^)Uy|0tQpFW2FbJCXI*)3&BU7r(T83kS~c9D{PRWbAxHo4m+&Gpqk17 zWn|k(k$ZI}XfSzo`<;eh1l@%92^2U7CD<5GQ2a(9HnMwQJ0VCB!oaZAamZ<eoFTf6 zc0Dw=aulFSbwL}L`pmJP%aR|A#UFsFk8P6-{1jugW5kJ7M1l@oQi*#C(bicLoz+o` zVgu68on}80M0dc(WhT*y7JzKPKa1qcz${nYSFDm)8w%?YQ=XyOJw(gK_s9qWoj7OR z8hG?TCKdcNKDII<yUV*TOH*9-kUHB>&cz<ZuQ+k@f^Hg4H%<&pmgnm1QaZAjJ0W^y z{Ti3dt@PqX1hPZp6XT&^+9u>oOtu`iA*J_0_7K)i_NT~=!p@_%#4M&Ayi3sgzJz~o z#J@-J?+x^Mbd}&c<-h@UZS5@`bJYtw+t6RYU?^>;HWM}o3cx~%Qld~9jk=<nz;T!m z3Sdo;T0p4`TeAd%$L13IvQD~^O^&aul7z*X#Oy0s_$|9AADcn1204iA3wx1thf)!N zs0sl6JCP&^f-oo&>hwWjV2ekFU$g09;Pp|ixy}c^+G}=wudxii!fn=vSxKKjglWgf z6NX@@)+NXQxgLsZqSFl`4nJl)zN`t=eZa}v!DT?x2U&VZ{XRBZ#`zQn+P≻G6=1 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 literal 0 HcmV?d00001 diff --git a/other/ocserv.conf b/other/ocserv.conf new file mode 100644 index 0000000..7ea172f --- /dev/null +++ b/other/ocserv.conf @@ -0,0 +1,256 @@ +auth = "plain[passwd=/etc/ocserv/ocpasswd]" +# listen-host = [IP|HOSTNAME] +tcp-port = 443 +udp-port = 443 +run-as-user = nobody +run-as-group = daemon +socket-file = /var/run/ocserv-socket +server-cert = /etc/ocserv/ssl/server-cert.pem +server-key = /etc/ocserv/ssl/server-key.pem +ca-cert = /etc/ocserv/ssl/ca-cert.pem +isolate-workers = true +banner = "Welcome DOUB.IO" +max-clients = 0 +max-same-clients = 0 +rate-limit-ms = 0 +server-stats-reset-time = 604800 +keepalive = 32400 +dpd = 90 +mobile-dpd = 1800 +switch-to-tcp-timeout = 25 +try-mtu-discovery = false +tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0" +auth-timeout = 240 +idle-timeout = 86400 +mobile-idle-timeout = 86400 +min-reauth-time = 300 +max-ban-score = 80 +ban-reset-time = 1200 +cookie-timeout = 300 +deny-roaming = false +rekey-time = 172800 +rekey-method = ssl +use-occtl = true +pid-file = /var/run/ocserv.pid +net-priority = 6 +device = vpns +predictable-ips = true +default-domain = example.com + +ipv4-network = 192.168.1.0 +ipv4-netmask = 255.255.255.0 +# An alternative way of specifying the network: +#ipv4-network = 192.168.1.0/24 +# The IPv6 subnet that leases will be given from. +#ipv6-network = fda9:4efe:7e3b:03ea::/48 +# Specify the size of the network to provide to clients. It is +# generally recommended to provide clients with a /64 network in +# IPv6, but any subnet may be specified. To provide clients only +# with a single IP use the prefix 128. +#ipv6-subnet-prefix = 128 +#ipv6-subnet-prefix = 64 + +# tunnel-all-dns = true +dns = 8.8.8.8 +dns = 8.8.4.4 +ping-leases = false +no-route = 1.0.0.0/255.192.0.0 +no-route = 1.64.0.0/255.224.0.0 +no-route = 1.112.0.0/255.248.0.0 +no-route = 1.176.0.0/255.240.0.0 +no-route = 1.192.0.0/255.240.0.0 +no-route = 14.0.0.0/255.224.0.0 +no-route = 14.96.0.0/255.224.0.0 +no-route = 14.128.0.0/255.224.0.0 +no-route = 14.192.0.0/255.224.0.0 +no-route = 27.0.0.0/255.192.0.0 +no-route = 27.96.0.0/255.224.0.0 +no-route = 27.128.0.0/255.224.0.0 +no-route = 27.176.0.0/255.240.0.0 +no-route = 27.192.0.0/255.224.0.0 +no-route = 27.224.0.0/255.252.0.0 +no-route = 36.0.0.0/255.192.0.0 +no-route = 36.96.0.0/255.224.0.0 +no-route = 36.128.0.0/255.192.0.0 +no-route = 36.192.0.0/255.224.0.0 +no-route = 36.240.0.0/255.240.0.0 +no-route = 39.0.0.0/255.255.0.0 +no-route = 39.64.0.0/255.224.0.0 +no-route = 39.96.0.0/255.240.0.0 +no-route = 39.128.0.0/255.192.0.0 +no-route = 40.72.0.0/255.254.0.0 +no-route = 40.124.0.0/255.252.0.0 +no-route = 42.0.0.0/255.248.0.0 +no-route = 42.48.0.0/255.240.0.0 +no-route = 42.80.0.0/255.240.0.0 +no-route = 42.96.0.0/255.224.0.0 +no-route = 42.128.0.0/255.128.0.0 +no-route = 43.224.0.0/255.224.0.0 +no-route = 45.65.16.0/255.255.240.0 +no-route = 45.112.0.0/255.240.0.0 +no-route = 45.248.0.0/255.248.0.0 +no-route = 47.92.0.0/255.252.0.0 +no-route = 47.96.0.0/255.224.0.0 +no-route = 49.0.0.0/255.128.0.0 +no-route = 49.128.0.0/255.224.0.0 +no-route = 49.192.0.0/255.192.0.0 +no-route = 52.80.0.0/255.252.0.0 +no-route = 54.222.0.0/255.254.0.0 +no-route = 58.0.0.0/255.128.0.0 +no-route = 58.128.0.0/255.224.0.0 +no-route = 58.192.0.0/255.224.0.0 +no-route = 58.240.0.0/255.240.0.0 +no-route = 59.32.0.0/255.224.0.0 +no-route = 59.64.0.0/255.224.0.0 +no-route = 59.96.0.0/255.240.0.0 +no-route = 59.144.0.0/255.240.0.0 +no-route = 59.160.0.0/255.224.0.0 +no-route = 59.192.0.0/255.192.0.0 +no-route = 60.0.0.0/255.224.0.0 +no-route = 60.48.0.0/255.240.0.0 +no-route = 60.160.0.0/255.224.0.0 +no-route = 60.192.0.0/255.192.0.0 +no-route = 61.0.0.0/255.192.0.0 +no-route = 61.80.0.0/255.248.0.0 +no-route = 61.128.0.0/255.192.0.0 +no-route = 61.224.0.0/255.224.0.0 +no-route = 91.234.36.0/255.255.255.0 +no-route = 101.0.0.0/255.128.0.0 +no-route = 101.128.0.0/255.224.0.0 +no-route = 101.192.0.0/255.240.0.0 +no-route = 101.224.0.0/255.224.0.0 +no-route = 103.0.0.0/255.0.0.0 +no-route = 106.0.0.0/255.128.0.0 +no-route = 106.224.0.0/255.240.0.0 +no-route = 110.0.0.0/255.128.0.0 +no-route = 110.144.0.0/255.240.0.0 +no-route = 110.160.0.0/255.224.0.0 +no-route = 110.192.0.0/255.192.0.0 +no-route = 111.0.0.0/255.192.0.0 +no-route = 111.64.0.0/255.224.0.0 +no-route = 111.112.0.0/255.240.0.0 +no-route = 111.128.0.0/255.192.0.0 +no-route = 111.192.0.0/255.224.0.0 +no-route = 111.224.0.0/255.240.0.0 +no-route = 112.0.0.0/255.128.0.0 +no-route = 112.128.0.0/255.240.0.0 +no-route = 112.192.0.0/255.252.0.0 +no-route = 112.224.0.0/255.224.0.0 +no-route = 113.0.0.0/255.128.0.0 +no-route = 113.128.0.0/255.240.0.0 +no-route = 113.192.0.0/255.192.0.0 +no-route = 114.16.0.0/255.240.0.0 +no-route = 114.48.0.0/255.240.0.0 +no-route = 114.64.0.0/255.192.0.0 +no-route = 114.128.0.0/255.240.0.0 +no-route = 114.192.0.0/255.192.0.0 +no-route = 115.0.0.0/255.0.0.0 +no-route = 116.0.0.0/255.0.0.0 +no-route = 117.0.0.0/255.128.0.0 +no-route = 117.128.0.0/255.192.0.0 +no-route = 118.16.0.0/255.240.0.0 +no-route = 118.64.0.0/255.192.0.0 +no-route = 118.128.0.0/255.128.0.0 +no-route = 119.0.0.0/255.128.0.0 +no-route = 119.128.0.0/255.192.0.0 +no-route = 119.224.0.0/255.224.0.0 +no-route = 120.0.0.0/255.192.0.0 +no-route = 120.64.0.0/255.224.0.0 +no-route = 120.128.0.0/255.240.0.0 +no-route = 120.192.0.0/255.192.0.0 +no-route = 121.0.0.0/255.128.0.0 +no-route = 121.192.0.0/255.192.0.0 +no-route = 122.0.0.0/254.0.0.0 +no-route = 124.0.0.0/255.0.0.0 +no-route = 125.0.0.0/255.128.0.0 +no-route = 125.160.0.0/255.224.0.0 +no-route = 125.192.0.0/255.192.0.0 +no-route = 137.59.59.0/255.255.255.0 +no-route = 137.59.88.0/255.255.252.0 +no-route = 139.0.0.0/255.224.0.0 +no-route = 139.128.0.0/255.128.0.0 +no-route = 140.64.0.0/255.240.0.0 +no-route = 140.128.0.0/255.240.0.0 +no-route = 140.192.0.0/255.192.0.0 +no-route = 144.0.0.0/255.248.0.0 +no-route = 144.12.0.0/255.255.0.0 +no-route = 144.48.0.0/255.248.0.0 +no-route = 144.123.0.0/255.255.0.0 +no-route = 144.255.0.0/255.255.0.0 +no-route = 146.196.0.0/255.255.128.0 +no-route = 150.0.0.0/255.255.0.0 +no-route = 150.96.0.0/255.224.0.0 +no-route = 150.128.0.0/255.240.0.0 +no-route = 150.192.0.0/255.192.0.0 +no-route = 152.104.128.0/255.255.128.0 +no-route = 153.0.0.0/255.192.0.0 +no-route = 153.96.0.0/255.224.0.0 +no-route = 157.0.0.0/255.255.0.0 +no-route = 157.18.0.0/255.255.0.0 +no-route = 157.61.0.0/255.255.0.0 +no-route = 157.112.0.0/255.240.0.0 +no-route = 157.144.0.0/255.240.0.0 +no-route = 157.255.0.0/255.255.0.0 +no-route = 159.226.0.0/255.255.0.0 +no-route = 160.19.0.0/255.255.0.0 +no-route = 160.20.48.0/255.255.252.0 +no-route = 160.202.0.0/255.255.0.0 +no-route = 160.238.64.0/255.255.252.0 +no-route = 161.207.0.0/255.255.0.0 +no-route = 162.105.0.0/255.255.0.0 +no-route = 163.0.0.0/255.192.0.0 +no-route = 163.96.0.0/255.224.0.0 +no-route = 163.128.0.0/255.192.0.0 +no-route = 163.192.0.0/255.224.0.0 +no-route = 164.52.0.0/255.255.128.0 +no-route = 166.111.0.0/255.255.0.0 +no-route = 167.139.0.0/255.255.0.0 +no-route = 167.189.0.0/255.255.0.0 +no-route = 167.220.244.0/255.255.252.0 +no-route = 168.160.0.0/255.255.0.0 +no-route = 170.179.0.0/255.255.0.0 +no-route = 171.0.0.0/255.128.0.0 +no-route = 171.192.0.0/255.224.0.0 +no-route = 175.0.0.0/255.128.0.0 +no-route = 175.128.0.0/255.192.0.0 +no-route = 180.64.0.0/255.192.0.0 +no-route = 180.128.0.0/255.128.0.0 +no-route = 182.0.0.0/255.0.0.0 +no-route = 183.0.0.0/255.192.0.0 +no-route = 183.64.0.0/255.224.0.0 +no-route = 183.128.0.0/255.128.0.0 +no-route = 192.124.154.0/255.255.255.0 +no-route = 192.140.128.0/255.255.128.0 +no-route = 195.78.82.0/255.255.254.0 +no-route = 202.0.0.0/255.128.0.0 +no-route = 202.128.0.0/255.192.0.0 +no-route = 202.192.0.0/255.224.0.0 +no-route = 203.0.0.0/255.0.0.0 +no-route = 210.0.0.0/255.192.0.0 +no-route = 210.64.0.0/255.224.0.0 +no-route = 210.160.0.0/255.224.0.0 +no-route = 210.192.0.0/255.224.0.0 +no-route = 211.64.0.0/255.248.0.0 +no-route = 211.80.0.0/255.240.0.0 +no-route = 211.96.0.0/255.248.0.0 +no-route = 211.136.0.0/255.248.0.0 +no-route = 211.144.0.0/255.240.0.0 +no-route = 211.160.0.0/255.248.0.0 +no-route = 216.250.108.0/255.255.252.0 +no-route = 218.0.0.0/255.128.0.0 +no-route = 218.160.0.0/255.224.0.0 +no-route = 218.192.0.0/255.192.0.0 +no-route = 219.64.0.0/255.224.0.0 +no-route = 219.128.0.0/255.224.0.0 +no-route = 219.192.0.0/255.192.0.0 +no-route = 220.96.0.0/255.224.0.0 +no-route = 220.128.0.0/255.128.0.0 +no-route = 221.0.0.0/255.224.0.0 +no-route = 221.96.0.0/255.224.0.0 +no-route = 221.128.0.0/255.128.0.0 +no-route = 222.0.0.0/255.0.0.0 +no-route = 223.0.0.0/255.224.0.0 +no-route = 223.64.0.0/255.192.0.0 +no-route = 223.128.0.0/255.128.0.0 +cisco-client-compat = true +dtls-legacy = true diff --git a/other/pac.txt b/other/pac.txt new file mode 100644 index 0000000..85dab44 --- /dev/null +++ b/other/pac.txt @@ -0,0 +1,7942 @@ +/* + * Last Updated:2018-10-13 02:10:01 + */ +var direct = "__DIRECT__"; +if (direct == "__DIR" + "ECT__") direct = "DIRECT;"; + +var wall_proxy = function(){ return "__PROXY__"; }; +var wall_v6_proxy = function(){ return "__PROXY__"; }; + +var nowall_proxy = function(){ return direct; }; +var ip_proxy = function(){ return nowall_proxy(); }; +var ipv6_proxy = function(){ return nowall_proxy(); }; + +/* + * Copyright (C) 2014 breakwa11 + * https://github.com/breakwa11/gfw_whitelist + */ + +/* + * Copyright (C) 2017-2018 Toyo + * https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/pac.txt + */ + +var rules = [ + "|http://85.17.73.31/", + "||agnesb.fr", + "||akiba-web.com", + "||altrec.com", + "||apartmentratings.com", + "||apartments.com", + "||arena.taipei", + "||asianspiss.com", + "||assimp.org", + "||athenaeizou.com", + "||azubu.tv", + "||bankmobilevibe.com", + "||banorte.com", + "||bash-hackers.org", + "||beeg.com", + "||global.bing.com", + "||bloombergview.com", + "||booktopia.com.au", + "||boysmaster.com", + "||bynet.co.il", + "||carfax.com", + ".casinobellini.com", + "||casinobellini.com", + "||centauro.com.br", + "||chobit.cc", + "||clearsurance.com", + "||images.comico.tw", + "||static.comico.tw", + "||costco.com", + "||crossfire.co.kr", + "||d2pass.com", + "||darpa.mil", + "||dawangidc.com", + "||deezer.com", + "||desipro.de", + "||dingchin.com.tw", + "||discordapp.com", + "||discordapp.net", + "||dish.com", + "|http://img.dlsite.jp/", + "||dm530.net", + "share.dmhy.org", + "@@|https://share.dmhy.org", + "||dmm.co.jp", + "|http://www.dmm.com/netgame", + "||dnvod.tv", + "||dvdpac.com", + "||eesti.ee", + "||esurance.com", + ".expekt.com", + "||expekt.com", + ".extmatrix.com", + "||extmatrix.com", + "||fakku.net", + "||fastpic.ru", + "||filesor.com", + "||financetwitter.com", + "||flipboard.com", + "||flitto.com", + "||fnac.be", + "||fnac.com", + "||funkyimg.com", + "||fxnetworks.com", + "||g-area.org", + "||gettyimages.com", + "||getuploader.com", + "|https://raw.githubusercontent.com/programthink/zhao", + "||glass8.eu", + "||glype.com", + "||go141.com", + "||guo.media", + "||hautelook.com", + "||hautelookcdn.com", + "||wego.here.com", + "||hmvdigital.ca", + "||hmvdigital.com", + "||homedepot.com", + "||hoovers.com", + "||hulu.com", + "||huluim.com", + "|http://secure.hustler.com", + "|http://hustlercash.com", + "|http://www.hustlercash.com", + "||hybrid-analysis.com", + "||cdn*.i-scmp.com", + "||ilovelongtoes.com", + "|http://imgmega.com/*.gif.html", + "|http://imgmega.com/*.jpg.html", + "|http://imgmega.com/*.jpeg.html", + "|http://imgmega.com/*.png.html", + "|http://imgur.com/upload", + "|https://imgur.com/upload", + "||imlive.com", + "||javhub.net", + "||javhuge.com", + ".javlibrary.com", + "||javlibrary.com", + "||jcpenney.com", + "||jims.net", + "||jukujo-club.com", + "||juliepost.com", + "||kawaiikawaii.jp", + "||kendatire.com", + "||khatrimaza.org", + "||kkbox.com", + "||leisurepro.com", + "||lifemiles.com", + "||longtoes.com", + "||lovetvshow.com", + "|http://www.m-sport.co.uk", + "||macgamestore.com", + "||madonna-av.com", + "||mangafox.com", + "||mangafox.me", + "||manta.com", + "||matome-plus.com", + "||matome-plus.net", + "||mattwilcox.net", + "||metarthunter.com", + "||mfxmedia.com", + "||kb.monitorware.com", + "||monster.com", + "||moodyz.com", + "||moonbingo.com", + "||mos.ru", + "||msha.gov", + "||muzu.tv", + "||mvg.jp", + ".mybet.com", + "||mybet.com", + "||nationwide.com", + "|http://www.nbc.com/live", + "||neo-miracle.com", + "||netflix.com", + "||nflximg.com", + "||nflximg.net", + "||nflxext.com", + "||nflxso.net", + "||nflxvideo.net", + "||nic.gov", + "|http://mo.nightlife141.com", + "||nordstrom.com", + "||nordstromimage.com", + "||nordstromrack.com", + "||nottinghampost.com", + "||ntdtv.cz", + "||s1.nudezz.com", + "||nusatrip.com", + "||nuuvem.com", + "||omni7.jp", + "||onapp.com", + "||ontrac.com", + "@@|http://blog.ontrac.com", + "||pandora.com", + ".pandora.tv", + "||parkansky.com", + "||phmsociety.org", + "|http://*.pimg.tw/", + "||pure18.com", + "||pytorch.org", + "||qq.co.za", + "||r18.com", + "|http://radiko.jp", + "||ramcity.com.au", + "||rd.com", + "||rdio.com", + "|https://riseup.net", + "||sadistic-v.com", + "|http://cdn*.search.xxx/", + "||shiksha.com", + "||slacker.com", + "||sm-miracle.com", + "||soylentnews.org", + "||spotify.com", + "||spreadshirt.es", + "||springboardplatform.com", + "||sprite.org", + "@@|http://store.sprite.org", + "||superokayama.com", + "||superpages.com", + "||swagbucks.com", + "||switch1.jp", + "||tapanwap.com", + "||gsp.target.com", + "||login.target.com", + "||rcam.target.com", + "||thebodyshop-usa.com", + "||tma.co.jp", + "||tracfone.com", + "||tryheart.jp", + "||turntable.fm", + "||twerkingbutt.com", + "||ulop.net", + "||vegasred.com", + "||vevo.com", + "||vip-enterprise.com", + "|http://viu.tv/ch/", + "|http://viu.tv/encore/", + "||vmpsoft.com", + "|http://ecsm.vs.com/", + "||wanz-factory.com", + "||ssl.webpack.de", + "||wheretowatch.com", + "||wingamestore.com", + "||wizcrafts.net", + "||vod.wwe.com", + "||xfinity.com", + "||youwin.com", + "||ytn.co.kr", + "||zattoo.com", + "||zim.vn", + "||zozotown.com", + "||1.1.1.1", + "14.102.250.18", + "14.102.250.19", + "50.7.31.230:8898", + "174.142.105.153", + "69.65.19.160", + "||xn--4gq171p.com", + "||xn--czq75pvv1aj5c.org", + "||xn--i2ru8q2qg.com", + "||xn--oiq.cc", + "||xn--p8j9a0d9c9a.xn--q9jyb4c", + "|https://*.s3.amazonaws.com", + "||s3-ap-southeast-2.amazonaws.com", + "||agro.hk", + "||apkmirror.com", + "||bird.so", + "||businessinsider.com", + "||boomssr.com", + "||castbox.fm", + "||cmcn.org", + "||cmx.im", + "||depositphotos.com", + "||fangeqiang.com", + "||flyzy2005.com", + "||free-ss.site", + "||blog.fuckgfw233.org", + "||globalvoices.org", + "||glorystar.me", + "||hbo.com", + "||ipfs.io", + "||japantimes.co.jp", + "||jiji.com", + "||jinx.com", + "||line-scdn.net", + "||i.lithium.com", + "||cloud.mail.ru", + "||cdn-images.mailchimp.com", + "||mohu.club", + "||mohu.ml", + "||mastodon.host", + "||dictionary.goo.ne.jp", + "||go.nesnode.com", + "||nikkei.com", + "||nofile.io", + "||now.com", + "||sukebei.nyaa.si", + "||onejav.com", + "||paste.ee", + "||my.pcloud.com", + "||picacomic.com", + "||pixiv.net", + "||protonvpn.com", + "||quora.com", + "||cdn.seatguru.com", + "||secure.raxcdn.com", + "||redd.it", + "||reddit.com", + "||redditmedia.com", + "||redditstatic.com", + "||rsdlmonitor.com", + "||shadowsocks.be", + "||shadowsocks9.com", + "||tn1.shemalez.com", + "||tn2.shemalez.com", + "||tn3.shemalez.com", + "||static.shemalez.com", + "||sosreader.com", + "||sulian.me", + "||supchina.com", + "||teddysun.com", + "||textnow.me", + "||tineye.com", + "||tubepornclassic.com", + "||twitch.tv", + "||uku.im", + "||unseen.is", + "||cn.uptodown.com", + "||uraban.me", + "||vrsmash.com", + "||scache.vzw.com", + "||scache1.vzw.com", + "||scache2.vzw.com", + "||ss7.vzw.com", + "||wenzhao.ca", + "||whatsonweibo.com", + "||wire.com", + "||xm.com", + "||xuehua.us", + "||allcoin.com", + "||adcex.com", + "||bcex.ca", + "||bibox.com", + "||big.one", + "||binance.com", + "||bit-z.com", + "||bitcoinworld.com", + "||bitfinex.com", + "||bitinka.com.ar", + "||bitmex.com", + "||btcbank.bank", + "||btctrade.im", + "||c2cx.com", + "||chaoex.com", + "||coin2co.in", + ".coinegg.com", + "||coinegg.com", + "||coinex.com", + "||coingi.com", + "||coinrail.co.kr", + "||cointobe.com", + "||coinut.com", + "||discoins.com", + "||dragonex.io", + "||ebtcbank.com", + "||etherdelta.com", + "||exmo.com", + "||exrates.me", + "||exx.com", + "||fatbtc.com", + "||gate.io", + "||gatecoin.com", + "||hitbtc.com", + "||huobi.com", + "||huobi.pro", + "||huobipro.com", + "||bx.in.th", + "||jex.com", + "||kex.com", + "||kspcoin.com", + "||kucoin.com", + "||lbank.info", + "||livecoin.net", + "||oex.com", + "||okex.com", + "||rightbtc.com", + "||topbtc.com", + "||xbtce.com", + "||yobit.net", + "||zb.com", + "||read01.com", + "||kknews.cc", + "china-mmm.jp.net", + ".lsxszzg.com", + ".china-mmm.net", + "||china-mmm.net", + "china-mmm.sa.com", + ".allowed.org", + ".now.im", + "||amazon.co.jp", + ".amazon.com/Dalai-Lama", + "amazon.com/Prisoner-State-Secret-Journal-Premier", + "s3-ap-northeast-1.amazonaws.com", + "||aolchannels.aol.com", + "video.aol.ca/video-detail", + "video.aol.co.uk/video-detail", + "video.aol.com", + "||video.aol.com", + "||search.aol.com", + "www.aolnews.com", + ".avmo.pw", + ".avmoo.com", + "|http://avmoo.com", + ".avmoo.net", + "|http://avmoo.net", + "||avmoo.pw", + ".javmoo.xyz", + "|http://javmoo.xyz", + ".javtag.com", + "|http://javtag.com", + ".javzoo.com", + "|http://javzoo.com", + ".tellme.pw", + ".bbc.com", + "||bbc.com", + ".bbc.co.uk", + "||bbc.co.uk", + "||bbci.co.uk", + ".bbcchinese.com", + "||bbcchinese.com", + "|http://bbc.in", + ".1dumb.com", + ".25u.com", + ".2waky.com", + ".3-a.net", + ".4dq.com", + ".4mydomain.com", + ".4pu.com", + ".acmetoy.com", + ".almostmy.com", + ".americanunfinished.com", + ".authorizeddns.net", + ".authorizeddns.org", + ".authorizeddns.us", + ".bigmoney.biz", + ".changeip.name", + ".changeip.net", + ".changeip.org", + ".cleansite.biz", + ".cleansite.info", + ".cleansite.us", + ".compress.to", + ".ddns.info", + ".ddns.me.uk", + ".ddns.mobi", + ".ddns.ms", + ".ddns.name", + ".ddns.us", + ".dhcp.biz", + ".dns-dns.com", + ".dns-stuff.com", + ".dns04.com", + ".dns05.com", + ".dns1.us", + ".dns2.us", + ".dnset.com", + ".dnsrd.com", + ".dsmtp.com", + ".dumb1.com", + ".dynamic-dns.net", + ".dynamicdns.biz", + ".dynamicdns.co.uk", + ".dynamicdns.me.uk", + ".dynamicdns.org.uk", + ".dyndns.pro", + ".dynssl.com", + ".edns.biz", + ".epac.to", + ".esmtp.biz", + ".ezua.com", + ".faqserv.com", + ".fartit.com", + ".freeddns.com", + ".freetcp.com", + ".freewww.biz", + ".freewww.info", + ".ftp1.biz", + ".ftpserver.biz", + ".gettrials.com", + ".got-game.org", + ".gr8domain.biz", + ".gr8name.biz", + ".https443.net", + ".https443.org", + ".ikwb.com", + ".instanthq.com", + ".iownyour.biz", + ".iownyour.org", + ".isasecret.com", + ".itemdb.com", + ".itsaol.com", + ".jetos.com", + ".jkub.com", + ".jungleheart.com", + ".justdied.com", + ".lflink.com", + ".lflinkup.com", + ".lflinkup.net", + ".lflinkup.org", + ".longmusic.com", + ".mefound.com", + ".moneyhome.biz", + ".mrbasic.com", + ".mrbonus.com", + ".mrface.com", + ".mrslove.com", + ".my03.com", + ".mydad.info", + ".myddns.com", + ".myftp.info", + ".myftp.name", + ".mylftv.com", + ".mymom.info", + ".mynetav.net", + ".mynetav.org", + ".mynumber.org", + ".mypicture.info", + ".mypop3.net", + ".mypop3.org", + ".mysecondarydns.com", + ".mywww.biz", + ".myz.info", + ".ninth.biz", + ".ns01.biz", + ".ns01.info", + ".ns01.us", + ".ns02.biz", + ".ns02.info", + ".ns02.us", + ".ns1.name", + ".ns2.name", + ".ns3.name", + ".ocry.com", + ".onedumb.com", + ".onmypc.biz", + ".onmypc.info", + ".onmypc.net", + ".onmypc.org", + ".onmypc.us", + ".organiccrap.com", + ".otzo.com", + ".ourhobby.com", + ".pcanywhere.net", + ".port25.biz", + ".proxydns.com", + ".qhigh.com", + ".qpoe.com", + ".rebatesrule.net", + ".sellclassics.com", + ".sendsmtp.com", + ".serveuser.com", + ".serveusers.com", + ".sexidude.com", + ".sexxxy.biz", + ".sixth.biz", + ".squirly.info", + ".ssl443.org", + ".toh.info", + ".toythieves.com", + ".trickip.net", + ".trickip.org", + ".vizvaz.com", + ".wha.la", + ".wikaba.com", + ".www1.biz", + ".wwwhost.biz", + "@@|http://xx.wwwhost.biz", + ".x24hr.com", + ".xxuz.com", + ".xxxy.biz", + ".xxxy.info", + ".ygto.com", + ".youdontcare.com", + ".yourtrap.com", + ".zyns.com", + ".zzux.com", + "d1b183sg0nvnuh.cloudfront.net", + "|https://d1b183sg0nvnuh.cloudfront.net", + "d1c37gjwa26taa.cloudfront.net", + "|https://d1c37gjwa26taa.cloudfront.net", + "d3c33hcgiwev3.cloudfront.net", + "|https://d3c33hcgiwev3.cloudfront.net", + "||d3rhr7kgmtrq1v.cloudfront.net", + ".3d-game.com", + ".4irc.com", + ".b0ne.com", + ".chatnook.com", + ".darktech.org", + ".deaftone.com", + ".dtdns.net", + ".effers.com", + ".etowns.net", + ".etowns.org", + ".flnet.org", + ".gotgeeks.com", + ".scieron.com", + ".slyip.com", + ".slyip.net", + ".suroot.com", + ".blogdns.org", + ".dyndns.org", + ".dyndns-ip.com", + ".dyndns-pics.com", + ".from-sd.com", + ".from-pr.com", + ".is-a-hunter.com", + ".dynu.com", + ".dynu.net", + ".freeddns.org", + "cdninstagram.com", + "||cdninstagram.com", + "||facebook.br", + ".facebook.com", + "||facebook.com", + "@@||v6.facebook.com", + "||facebook.design", + "||connect.facebook.net", + "||facebook.hu", + "||facebook.in", + "||facebook.nl", + "||facebook.se", + "||fb.com", + "||fb.me", + "||fbcdn.net", + "||fbsbx.com", + "||fbaddins.com", + "||fbworkmail.com", + ".instagram.com", + "||instagram.com", + "||m.me", + "||messenger.com", + "||oculus.com", + "||oculuscdn.com", + "||rocksdb.org", + "@@||ip6.static.sl-reverse.com", + "||thefacebook.com", + "||whatsapp.com", + "||whatsapp.net", + "|https://www.ftchinese.com", + ".ftchinese.com/channel/video", + ".ftchinese.com/story/00102753", + ".ftchinese.com/story/001026616", + ".ftchinese.com/story/001026749", + ".ftchinese.com/story/001026807", + ".ftchinese.com/story/001026808", + ".ftchinese.com/story/001026834", + ".ftchinese.com/story/001026880", + ".ftchinese.com/story/001027429", + ".ftchinese.com/story/001030341", + ".ftchinese.com/story/001030502", + ".ftchinese.com/story/001030803", + ".ftchinese.com/story/001031317", + ".ftchinese.com/story/001032617", + ".ftchinese.com/story/001032636", + ".ftchinese.com/story/001032692", + ".ftchinese.com/story/001032762", + ".ftchinese.com/story/001033138", + ".ftchinese.com/story/001034917", + ".ftchinese.com/story/001034926", + ".ftchinese.com/story/001034927", + ".ftchinese.com/story/001034928", + ".ftchinese.com/story/001034952", + ".ftchinese.com/story/001035890", + ".ftchinese.com/story/001035972", + ".ftchinese.com/story/001035993", + ".ftchinese.com/story/001036417", + ".ftchinese.com/story/001037090", + ".ftchinese.com/story/001037091", + ".ftchinese.com/story/001038178", + ".ftchinese.com/story/001038199", + ".ftchinese.com/story/001038220", + ".ftchinese.com/story/001038819", + ".ftchinese.com/story/001038862", + ".ftchinese.com/story/001039067", + ".ftchinese.com/story/001039178", + ".ftchinese.com/story/001039211", + ".ftchinese.com/story/001039271", + ".ftchinese.com/story/001039295", + ".ftchinese.com/story/001039369", + ".ftchinese.com/story/001039482", + ".ftchinese.com/story/001039534", + ".ftchinese.com/story/001039555", + ".ftchinese.com/story/001039576", + ".ftchinese.com/story/001039712", + ".ftchinese.com/story/001039779", + ".ftchinese.com/story/001039809", + ".ftchinese.com/story/001040134", + ".ftchinese.com/story/001040835", + ".ftchinese.com/story/001040890", + ".ftchinese.com/story/001040918", + ".ftchinese.com/story/001040992", + ".ftchinese.com/story/001041209", + ".ftchinese.com/story/001042100", + ".ftchinese.com/story/001042252", + ".ftchinese.com/story/001042272", + ".ftchinese.com/story/001042280", + ".ftchinese.com/story/001043029", + ".ftchinese.com/story/001043066", + ".ftchinese.com/story/001043096", + ".ftchinese.com/story/001043124", + ".ftchinese.com/story/001043152", + ".ftchinese.com/story/001043189", + ".ftchinese.com/story/001043428", + ".ftchinese.com/story/001043439", + ".ftchinese.com/story/001043534", + ".ftchinese.com/story/001043675", + ".ftchinese.com/story/001043680", + ".ftchinese.com/story/001043702", + ".ftchinese.com/story/001043849", + ".ftchinese.com/story/001044099", + ".ftchinese.com/story/001044776", + ".ftchinese.com/story/001044871", + ".ftchinese.com/story/001044897", + ".ftchinese.com/story/001045114", + ".ftchinese.com/story/001045139", + ".ftchinese.com/story/001045186", + ".ftchinese.com/story/001045755", + ".ftchinese.com/story/001046087", + ".ftchinese.com/story/001046105", + ".ftchinese.com/story/001046118", + ".ftchinese.com/story/001046132", + ".ftchinese.com/story/001046517", + ".ftchinese.com/story/001046822", + ".ftchinese.com/story/001046866", + ".ftchinese.com/story/001046942", + ".ftchinese.com/story/001047180", + ".ftchinese.com/story/001047206", + ".ftchinese.com/story/001047304", + ".ftchinese.com/story/001047317", + ".ftchinese.com/story/001047345", + ".ftchinese.com/story/001047358", + ".ftchinese.com/story/001047375", + ".ftchinese.com/story/001047381", + ".ftchinese.com/story/001047413", + ".ftchinese.com/story/001047456", + ".ftchinese.com/story/001047491", + ".ftchinese.com/story/001047545", + ".ftchinese.com/story/001047558", + ".ftchinese.com/story/001047568", + ".ftchinese.com/story/001047627", + ".ftchinese.com/story/001048293", + ".ftchinese.com/story/001048343", + ".ftchinese.com/story/001048710", + ".ftchinese.com/story/001049289", + ".ftchinese.com/story/001049360", + ".ftchinese.com/story/001049896", + ".ftchinese.com/story/001050152", + ".ftchinese.com/story/001051027", + ".ftchinese.com/story/001051161", + ".ftchinese.com/story/001051372", + ".ftchinese.com/story/001051479", + ".ftchinese.com/story/001052138", + ".ftchinese.com/story/001052161", + ".ftchinese.com/story/001052525", + ".ftchinese.com/story/001052549", + ".ftchinese.com/story/001052701", + ".ftchinese.com/story/001052965", + ".ftchinese.com/story/001053149", + ".ftchinese.com/story/001053150", + ".ftchinese.com/story/001053200", + ".ftchinese.com/story/001053425", + ".ftchinese.com/story/001053496", + ".ftchinese.com/story/001053526", + ".ftchinese.com/story/001053906", + ".ftchinese.com/story/001054049", + ".ftchinese.com/story/001054103", + ".ftchinese.com/story/001054109", + ".ftchinese.com/story/001054119", + ".ftchinese.com/story/001054123", + ".ftchinese.com/story/001054139", + ".ftchinese.com/story/001054166", + ".ftchinese.com/story/001054168", + ".ftchinese.com/story/001054190", + ".ftchinese.com/story/001054437", + ".ftchinese.com/story/001054526", + ".ftchinese.com/story/001054607", + ".ftchinese.com/story/001054644", + ".ftchinese.com/story/001054786", + ".ftchinese.com/story/001054843", + ".ftchinese.com/story/001054925", + ".ftchinese.com/story/001054940", + ".ftchinese.com/story/001055051", + ".ftchinese.com/story/001055063", + ".ftchinese.com/story/001055069", + ".ftchinese.com/story/001055136", + ".ftchinese.com/story/001055170", + ".ftchinese.com/story/001055202", + ".ftchinese.com/story/001055242", + ".ftchinese.com/story/001055263", + ".ftchinese.com/story/001055274", + ".ftchinese.com/story/001055299", + ".ftchinese.com/story/001055480", + ".ftchinese.com/story/001055551", + ".ftchinese.com/story/001055559", + ".ftchinese.com/story/001055566", + ".ftchinese.com/story/001055840", + ".ftchinese.com/story/001056099", + ".ftchinese.com/story/001056108", + ".ftchinese.com/story/001056131", + ".ftchinese.com/story/001056375", + ".ftchinese.com/story/001056491", + ".ftchinese.com/story/001056529", + ".ftchinese.com/story/001056534", + ".ftchinese.com/story/001056538", + ".ftchinese.com/story/001056541", + ".ftchinese.com/story/001056554", + ".ftchinese.com/story/001056557", + ".ftchinese.com/story/001056560", + ".ftchinese.com/story/001056567", + ".ftchinese.com/story/001056574", + ".ftchinese.com/story/001056588", + ".ftchinese.com/story/001056594", + ".ftchinese.com/story/001056596", + ".ftchinese.com/story/001056684", + ".ftchinese.com/story/001056832", + ".ftchinese.com/story/001056833", + ".ftchinese.com/story/001056851", + ".ftchinese.com/story/001056874", + ".ftchinese.com/story/001056896", + ".ftchinese.com/story/001056927", + ".ftchinese.com/story/001057011", + ".ftchinese.com/story/001057018", + ".ftchinese.com/story/001057044", + ".ftchinese.com/story/001057162", + ".ftchinese.com/story/001057500", + ".ftchinese.com/story/001057504", + ".ftchinese.com/story/001057509", + ".ftchinese.com/story/001057518", + ".ftchinese.com/story/001057532", + ".ftchinese.com/story/001057533", + ".ftchinese.com/story/001057556", + ".ftchinese.com/story/001057580", + ".ftchinese.com/story/001057638", + ".ftchinese.com/story/001057644", + ".ftchinese.com/story/001057817", + ".ftchinese.com/story/001057875", + ".ftchinese.com/story/001058009", + ".ftchinese.com/story/001058056", + ".ftchinese.com/story/001058224", + ".ftchinese.com/story/001058257", + ".ftchinese.com/story/001058295", + ".ftchinese.com/story/001058328", + ".ftchinese.com/story/001058339", + ".ftchinese.com/story/001058344", + ".ftchinese.com/story/001058352", + ".ftchinese.com/story/001058413", + ".ftchinese.com/story/001058421", + ".ftchinese.com/story/001058440", + ".ftchinese.com/story/001058458", + ".ftchinese.com/story/001058468", + ".ftchinese.com/story/001058561", + ".ftchinese.com/story/001058566", + ".ftchinese.com/story/001058567", + ".ftchinese.com/story/001058585", + ".ftchinese.com/story/001058628", + ".ftchinese.com/story/001058656", + ".ftchinese.com/story/001058665", + ".ftchinese.com/story/001058678", + ".ftchinese.com/story/001058691", + ".ftchinese.com/story/001058721", + ".ftchinese.com/story/001058728", + ".ftchinese.com/story/001059464", + ".ftchinese.com/story/001059484", + ".ftchinese.com/story/001059537", + ".ftchinese.com/story/001059538", + ".ftchinese.com/story/001059551", + ".ftchinese.com/story/001059818", + ".ftchinese.com/story/001059914", + ".ftchinese.com/story/001059920", + ".ftchinese.com/story/001059957", + ".ftchinese.com/story/001060088", + ".ftchinese.com/story/001060156", + ".ftchinese.com/story/001060157", + ".ftchinese.com/story/001060160", + ".ftchinese.com/story/001060181", + ".ftchinese.com/story/001060185", + ".ftchinese.com/story/001060493", + ".ftchinese.com/story/001060495", + ".ftchinese.com/story/001060590", + ".ftchinese.com/story/001060846", + ".ftchinese.com/story/001060847", + ".ftchinese.com/story/001060875", + ".ftchinese.com/story/001060921", + ".ftchinese.com/story/001060946", + ".ftchinese.com/story/001061120", + ".ftchinese.com/story/001061474", + ".ftchinese.com/story/001061524", + ".ftchinese.com/story/001061642", + ".ftchinese.com/story/001062017", + ".ftchinese.com/story/001062020", + ".ftchinese.com/story/001062028", + ".ftchinese.com/story/001062092", + ".ftchinese.com/story/001062096", + ".ftchinese.com/story/001062147", + ".ftchinese.com/story/001062176", + ".ftchinese.com/story/001062188", + ".ftchinese.com/story/001062254", + ".ftchinese.com/story/001062374", + ".ftchinese.com/story/001062482", + ".ftchinese.com/story/001062496", + ".ftchinese.com/story/001062501", + ".ftchinese.com/story/001062508", + ".ftchinese.com/story/001062519", + ".ftchinese.com/story/001062554", + ".ftchinese.com/story/001062741", + ".ftchinese.com/story/001062794", + ".ftchinese.com/story/001063160", + ".ftchinese.com/story/001063359", + ".ftchinese.com/story/001063512", + ".ftchinese.com/story/001063668", + ".ftchinese.com/story/001063692", + ".ftchinese.com/story/001063763", + ".ftchinese.com/story/001063764", + ".ftchinese.com/story/001063826", + ".ftchinese.com/story/001064127", + ".ftchinese.com/story/001064312", + ".ftchinese.com/story/001064705", + ".ftchinese.com/story/001064807", + ".ftchinese.com/story/001065120", + ".ftchinese.com/story/001065168", + ".ftchinese.com/story/001065249", + ".ftchinese.com/story/001065287", + ".ftchinese.com/story/001065337", + ".ftchinese.com/story/001065541", + ".ftchinese.com/story/001065715", + ".ftchinese.com/story/001065735", + ".ftchinese.com/story/001065756", + ".ftchinese.com/story/001065802", + ".ftchinese.com/story/001066112", + ".ftchinese.com/story/001066136", + ".ftchinese.com/story/001066140", + ".ftchinese.com/story/001066465", + ".ftchinese.com/story/001066881", + ".ftchinese.com/story/001066950", + ".ftchinese.com/story/001066959", + ".ftchinese.com/story/001067435", + "www.ftchinese.com/story/001067479", + ".ftchinese.com/story/001067528", + ".ftchinese.com/story/001067545", + ".ftchinese.com/story/001067572", + ".ftchinese.com/story/001067648", + ".ftchinese.com/story/001067650", + ".ftchinese.com/story/001067680", + ".ftchinese.com/story/001067692", + ".ftchinese.com/story/001067871", + ".ftchinese.com/story/001067923", + ".ftchinese.com/story/001068062", + ".ftchinese.com/story/001068248", + ".ftchinese.com/story/001068278", + ".ftchinese.com/story/001068379", + ".ftchinese.com/story/001068483", + ".ftchinese.com/story/001068506", + ".ftchinese.com/story/001068547", + ".ftchinese.com/story/001068616", + ".ftchinese.com/story/001068622", + ".ftchinese.com/story/001068707", + ".ftchinese.com/story/001069146", + ".ftchinese.com/story/001069373", + ".ftchinese.com/story/001069516", + ".ftchinese.com/story/001069517", + ".ftchinese.com/story/001069687", + ".ftchinese.com/story/001069741", + ".ftchinese.com/story/001069861", + ".ftchinese.com/story/001069952", + ".ftchinese.com/story/001070053", + ".ftchinese.com/story/001070177", + ".ftchinese.com/story/001070307", + ".ftchinese.com/story/001070809", + ".ftchinese.com/story/001070990", + ".ftchinese.com/story/001071042", + ".ftchinese.com/story/001071044", + ".ftchinese.com/story/001071106", + ".ftchinese.com/story/001071166", + ".ftchinese.com/story/001071181", + "ftchinese.com/story/001071200", + ".ftchinese.com/story/001071208", + ".ftchinese.com/story/001071238", + ".ftchinese.com/story/001071683", + ".ftchinese.com/story/001072271", + ".ftchinese.com/story/001072348", + ".ftchinese.com/story/001072677", + ".ftchinese.com/story/001072794", + ".ftchinese.com/story/001072853", + ".ftchinese.com/story/001072895", + ".ftchinese.com/story/001072993", + ".ftchinese.com/story/001073043", + ".ftchinese.com/story/001073103", + ".ftchinese.com/story/001073157", + ".ftchinese.com/story/001073216", + ".ftchinese.com/story/001073246", + ".ftchinese.com/story/001073305", + ".ftchinese.com/story/001073307", + ".ftchinese.com/story/001073408", + ".ftchinese.com/story/001073537", + ".ftchinese.com/story/001073672", + ".ftchinese.com/story/001073849", + ".ftchinese.com/story/001073906", + ".ftchinese.com/story/001074089", + ".ftchinese.com/story/001074110", + ".ftchinese.com/story/001074128", + ".ftchinese.com/story/001074157", + ".ftchinese.com/story/001074246", + ".ftchinese.com/story/001074307", + ".ftchinese.com/story/001074347", + ".ftchinese.com/story/001074423", + ".ftchinese.com/story/001074454", + ".ftchinese.com/story/001074467", + ".ftchinese.com/story/001074493", + ".ftchinese.com/story/001074550", + ".ftchinese.com/story/001074562", + ".ftchinese.com/story/001074653", + ".ftchinese.com/story/001074693", + ".ftchinese.com/story/001074699", + ".ftchinese.com/story/001074712", + ".ftchinese.com/story/001074713", + ".ftchinese.com/story/001074768", + ".ftchinese.com/story/001074782", + ".ftchinese.com/story/001074794", + ".ftchinese.com/story/001074822", + ".ftchinese.com/story/001074874", + ".ftchinese.com/story/001074891", + ".ftchinese.com/story/001074918", + ".ftchinese.com/story/001075081", + ".ftchinese.com/story/001075134", + ".ftchinese.com/story/001075216", + ".ftchinese.com/story/001075230", + ".ftchinese.com/story/001075262", + ".ftchinese.com/story/001075269", + ".ftchinese.com/story/001075491", + ".ftchinese.com/story/001075500", + ".ftchinese.com/story/001075650", + ".ftchinese.com/story/001075678", + ".ftchinese.com/story/001075703", + ".ftchinese.com/story/001076066", + ".ftchinese.com/story/001076142", + ".ftchinese.com/story/001076459", + ".ftchinese.com/story/001076470", + ".ftchinese.com/story/001076538", + ".ftchinese.com/story/001076573", + ".ftchinese.com/story/001076901", + ".ftchinese.com/story/001077067", + ".ftchinese.com/story/001077235", + ".ftchinese.com/story/001077344", + ".ftchinese.com/story/001077390", + ".ftchinese.com/story/001077392", + ".ftchinese.com/story/001077465", + ".ftchinese.com/story/001077468", + ".ftchinese.com/story/001077492", + ".ftchinese.com/story/001077745", + ".ftchinese.com/story/001077768", + ".ftchinese.com/story/001077804", + ".ftchinese.com/tag/%E5%8D%81%E5%85%AB%E5%B1%8A%E4%B8%89%E4%B8%AD%E5%85%A8%E4%BC%9A", + ".ftchinese.com/tag/%E6%B8%A9%E5%AE%B6%E5%AE%9D", + ".ftchinese.com/tag/%E8%96%84%E7%86%99%E6%9D%A5", + ".ftchinese.com/video/1437", + ".ftchinese.com/video/1882", + ".ftchinese.com/video/2446", + ".ftchinese.com/video/2601", + ".ftchinese.com/comments", + "||1e100.net", + "||466453.com", + "||abc.xyz", + "||admob.com", + "||adsense.com", + "||agoogleaday.com", + "||ai.google", + "||ampproject.org", + "||android.com", + "||androidify.com", + "||api.ai", + ".appspot.com", + "||appspot.com", + "||autodraw.com", + "||blog.google", + "||blogblog.com", + "blogspot.com", + "/^https?:\\/\\/[^\\/]+blogspot\\.(.*)/", + ".blogspot.hk", + ".blogspot.jp", + ".blogspot.tw", + "||certificate-transparency.org", + "||chrome.com", + "||chromecast.com", + "||chromeexperiments.com", + "||chromercise.com", + "||chromestatus.com", + "||chromium.org", + "||com.google", + "||creativelab5.com", + "||crrev.com", + "||data-vocabulary.org", + "||debug.com", + "||deepmind.com", + "||deja.com", + "||design.google", + "||digisfera.com", + "||domains.google", + "||duck.com", + "||environment.google", + "||feedburner.com", + "||firebaseio.com", + "||g.co", + "||gcr.io", + "||get.app", + "||get.how", + "||getmdl.io", + "||getoutline.org", + "||ggpht.com", + "||gmail.com", + "||gmodules.com", + "||godoc.org", + "||golang.org", + "||goo.gl", + ".google.ae", + ".google.as", + ".google.am", + ".google.at", + ".google.az", + ".google.ba", + ".google.be", + ".google.bg", + ".google.ca", + ".google.cd", + ".google.ci", + ".google.co.id", + ".google.co.jp", + ".google.co.kr", + ".google.co.ma", + ".google.co.uk", + ".google.com", + ".google.de", + ".google.dj", + ".google.dk", + ".google.es", + ".google.fi", + ".google.fm", + ".google.fr", + ".google.gg", + ".google.gl", + ".google.gr", + ".google.ie", + ".google.is", + ".google.it", + ".google.jo", + ".google.kz", + ".google.lv", + ".google.mn", + ".google.ms", + ".google.nl", + ".google.nu", + ".google.no", + ".google.ro", + ".google.ru", + ".google.rw", + ".google.sc", + ".google.sh", + ".google.sk", + ".google.sm", + ".google.sn", + ".google.tk", + ".google.tm", + ".google.to", + ".google.tt", + ".google.vu", + ".google.ws", + "/^https?:\\/\\/([^\\/]+\\.)*google\\.(ac|ad|ae|af|al|am|as|at|az|ba|be|bf|bg|bi|bj|bs|bt|by|ca|cat|cd|cf|cg|ch|ci|cl|cm|co.ao|co.bw|co.ck|co.cr|co.id|co.il|co.in|co.jp|co.ke|co.kr|co.ls|co.ma|com|com.af|com.ag|com.ai|com.ar|com.au|com.bd|com.bh|com.bn|com.bo|com.br|com.bz|com.co|com.cu|com.cy|com.do|com.ec|com.eg|com.et|com.fj|com.gh|com.gi|com.gt|com.hk|com.jm|com.kh|com.kw|com.lb|com.ly|com.mm|com.mt|com.mx|com.my|com.na|com.nf|com.ng|com.ni|com.np|com.om|com.pa|com.pe|com.pg|com.ph|com.pk|com.pr|com.py|com.qa|com.sa|com.sb|com.sg|com.sl|com.sv|com.tj|com.tr|com.tw|com.ua|com.uy|com.vc|com.vn|co.mz|co.nz|co.th|co.tz|co.ug|co.uk|co.uz|co.ve|co.vi|co.za|co.zm|co.zw|cv|cz|de|dj|dk|dm|dz|ee|es|eu|fi|fm|fr|ga|ge|gg|gl|gm|gp|gr|gy|hk|hn|hr|ht|hu|ie|im|iq|is|it|it.ao|je|jo|kg|ki|kz|la|li|lk|lt|lu|lv|md|me|mg|mk|ml|mn|ms|mu|mv|mw|mx|ne|nl|no|nr|nu|org|pl|pn|ps|pt|ro|rs|ru|rw|sc|se|sh|si|sk|sm|sn|so|sr|st|td|tg|tk|tl|tm|tn|to|tt|us|vg|vn|vu|ws)\\/.*/", + "||googleapis.cn", + "||googleapis.com", + "||googleapps.com", + "||googleartproject.com", + "||googleblog.com", + "||googlebot.com", + "||googlechinawebmaster.com", + "||googlecode.com", + "||googlecommerce.com", + "||googledomains.com", + "||googlearth.com", + "||googleearth.com", + "||googledrive.com", + "||googlegroups.com", + "||googlehosted.com", + "||googleideas.com", + "||googleinsidesearch.com", + "||googlelabs.com", + "||googlemail.com", + "||googlemashups.com", + "||googlepagecreator.com", + "||googleplay.com", + "||googleplus.com", + "||googlescholar.com", + "||googlesource.com", + "||googleusercontent.com", + ".googlevideo.com", + "||googlevideo.com", + "||googleweblight.com", + "||googlezip.net", + "||groups.google.cn", + "||gstatic.com", + "||gvt0.com", + "||gvt1.com", + "@@||redirector.gvt1.com", + "||gvt3.com", + "||gwtproject.org", + "||html5rocks.com", + "||iam.soy", + "||igoogle.com", + "||itasoftware.com", + "||lers.google", + "||like.com", + "||madewithcode.com", + "||material.io", + "||nic.google", + "||on2.com", + "||panoramio.com", + "||picasaweb.com", + "||polymer-project.org", + "||questvisual.com", + "||admin.recaptcha.net", + "||api.recaptcha.net", + "||api-secure.recaptcha.net", + "||api-verify.recaptcha.net", + "||redhotlabs.com", + "||registry.google", + "||savethedate.foo", + "||schema.org", + "||shattered.io", + "|http://sipml5.org/", + "||stories.google", + "||synergyse.com", + "||teachparentstech.org", + "||tensorflow.org", + "||thinkwithgoogle.com", + "||tiltbrush.com", + "||urchin.com", + "||waveprotocol.org", + "||waymo.com", + "||webmproject.org", + "||webrtc.org", + "||whatbrowser.org", + "||widevine.com", + "||withgoogle.com", + "||withyoutube.com", + "||x.company", + "||xn--ngstr-lra8j.com", + "||youtu.be", + ".youtube.com", + "||youtube.com", + "||youtube-nocookie.com", + "||youtubeeducation.com", + "||youtubegaming.com", + "||yt.be", + "||ytimg.com", + "||zynamics.com", + "||naughtyamerica.com", + "static01.nyt.com", + "||nyt.com", + "nytchina.com", + "nytcn.me", + "||nytcn.me", + "||nytco.com", + "|http://nyti.ms/", + ".nytimes.com", + "||nytimes.com", + "||nytimg.com", + "userapi.nytlog.com", + "cn.nytstyle.com", + "||nytstyle.com", + ".steamcommunity.com", + "||steamcommunity.com", + "|http://store.steampowered.com/app/333600", + "||t.me", + "||updates.tdesktop.com", + "||telegram.dog", + "||telegram.me", + "||telegram.org", + ".telegramdownload.com", + "||telesco.pe", + "||periscope.tv", + ".pscp.tv", + "||pscp.tv", + ".t.co", + "||t.co", + ".tweetdeck.com", + "||tweetdeck.com", + "||twimg.com", + ".twitpic.com", + "||twitpic.com", + ".twitter.com", + "||twitter.com", + "||twitter.jp", + "||vine.co", + "||gov.taipei", + ".gov.tw", + "|https://aiss.anws.gov.tw", + "||archives.gov.tw", + "||tacc.cwb.gov.tw", + "||data.gov.tw", + "||epa.gov.tw", + "||fa.gov.tw", + "||fda.gov.tw", + "||hpa.gov.tw", + "||immigration.gov.tw", + "||itaiwan.gov.tw", + "||mjib.gov.tw", + "||moeaic.gov.tw", + "||mofa.gov.tw", + "||mol.gov.tw", + "||mvdis.gov.tw", + "||nat.gov.tw", + "||nhi.gov.tw", + "||npa.gov.tw", + "||nsc.gov.tw", + "||ntbk.gov.tw", + "||ntbna.gov.tw", + "||ntbt.gov.tw", + "||ntsna.gov.tw", + "||pcc.gov.tw", + "||stat.gov.tw", + "||taipei.gov.tw", + "||taiwanjobs.gov.tw", + "||thb.gov.tw", + "||tipo.gov.tw", + "||wda.gov.tw", + "||teco-hk.org", + "||teco-mo.org", + "@@||aftygh.gov.tw", + "@@||aide.gov.tw", + "@@||tpde.aide.gov.tw", + "@@||arte.gov.tw", + "@@||chukuang.gov.tw", + "@@||cwb.gov.tw", + "@@||cycab.gov.tw", + "@@||dbnsa.gov.tw", + "@@||df.gov.tw", + "@@||eastcoast-nsa.gov.tw", + "@@||erv-nsa.gov.tw", + "@@||grb.gov.tw", + "@@||gysd.nyc.gov.tw", + "@@||hchcc.gov.tw", + "@@||hsinchu-cc.gov.tw", + "@@||iner.gov.tw", + "@@||klsio.gov.tw", + "@@||kmseh.gov.tw", + "@@||lungtanhr.gov.tw", + "@@||maolin-nsa.gov.tw", + "@@||matsu-news.gov.tw", + "@@||matsu-nsa.gov.tw", + "@@||matsucc.gov.tw", + "@@||moe.gov.tw", + "@@||mvdis.gov.tw", + "@@||nankan.gov.tw", + "@@||ncree.gov.tw", + "@@||necoast-nsa.gov.tw", + "@@||siraya-nsa.gov.tw", + "@@||cromotc.nat.gov.tw", + "@@||tax.nat.gov.tw", + "@@||necoast-nsa.gov.tw", + "@@||ner.gov.tw", + "@@||nmmba.gov.tw", + "@@||nmp.gov.tw", + "@@||nmvttc.gov.tw", + "@@||northguan-nsa.gov.tw", + "@@||npm.gov.tw", + "@@||nstm.gov.tw", + "@@||ntdmh.gov.tw", + "@@||ntl.gov.tw", + "@@||ntsec.gov.tw", + "@@||ntuh.gov.tw", + "@@||nvri.gov.tw", + "@@||penghu-nsa.gov.tw", + "@@||post.gov.tw", + "@@||siraya-nsa.gov.tw", + "@@||stdtime.gov.tw", + "@@||sunmoonlake.gov.tw", + "@@||taitung-house.gov.tw", + "@@||taoyuan.gov.tw", + "@@||tphcc.gov.tw", + "@@||trimt-nsa.gov.tw", + "@@||vghtpe.gov.tw", + "@@||vghks.gov.tw", + "@@||vghtc.gov.tw", + "@@||wanfang.gov.tw", + "@@||yatsen.gov.tw", + "@@||yda.gov.tw", + "||kinmen.org.tw", + ".v2ex.com", + "@@|http://v2ex.com", + "@@|http://cdn.v2ex.com", + "@@|http://cn.v2ex.com", + "@@|http://hk.v2ex.com", + "@@|http://i.v2ex.com", + "@@|http://lax.v2ex.com", + "@@|http://neue.v2ex.com", + "@@|http://pagespeed.v2ex.com", + "@@|http://static.v2ex.com", + "@@|http://workspace.v2ex.com", + "@@|http://www.v2ex.com", + "||data.flurry.com", + "page.bid.yahoo.com", + "tw.bid.yahoo.com", + "|https://tw.bid.yahoo.com", + "blogs.yahoo.co.jp", + "||search.yahoo.co.jp", + "buy.yahoo.com.tw/gdsale", + "hk.yahoo.com", + "hk.knowledge.yahoo.com", + "tw.money.yahoo.com", + "hk.myblog.yahoo.com", + "news.yahoo.com/china-blocks-bbc", + "||hk.news.yahoo.com", + "hk.rd.yahoo.com", + "hk.search.yahoo.com/search", + "hk.video.news.yahoo.com/video", + "meme.yahoo.com", + "tw.answers.yahoo.com", + "|https://tw.answers.yahoo.com", + "||tw.knowledge.yahoo.com", + "||tw.mall.yahoo.com", + "tw.yahoo.com", + "||tw.mobi.yahoo.com", + "tw.myblog.yahoo.com", + "||tw.news.yahoo.com", + "pulse.yahoo.com", + "upcoming.yahoo.com", + "video.yahoo.com", + "||yahoo.com.hk", + "||duckduckgo-owned-server.yahoo.net", + ".030buy.com", + ".0rz.tw", + "|http://0rz.tw", + "1-apple.com.tw", + "||1-apple.com.tw", + ".10.tt", + ".100ke.org", + ".1000giri.net", + "||1000giri.net", + ".10conditionsoflove.com", + "||10musume.com", + "123rf.com", + ".12bet.com", + "||12bet.com", + ".12vpn.com", + ".12vpn.net", + "||12vpn.com", + "||12vpn.net", + ".138.com", + "141hongkong.com/forum", + "||141jj.com", + ".141tube.com", + ".1688.com.au", + ".173ng.com", + "||173ng.com", + ".177pic.info", + ".17t17p.com", + "||18board.com", + "||18board.info", + "18onlygirls.com", + ".18p2p.com", + ".18virginsex.com", + ".1949er.org", + "zhao.1984.city", + "||zhao.1984.city", + "1984bbs.com", + "||1984bbs.com", + ".1984bbs.org", + "||1984bbs.org", + ".1991way.com", + "||1991way.com", + ".1998cdp.org", + ".1bao.org", + "|http://1bao.org", + ".1eew.com", + ".1mobile.com", + "|http://*.1mobile.tw", + "||1pondo.tv", + ".2-hand.info", + ".2000fun.com/bbs", + ".2008xianzhang.info", + "||2008xianzhang.info", + "||2017.hk", + "21andy.com/blog", + ".21pron.com", + "21sextury.com", + ".228.net.tw", + "||233abc.com", + "||24hrs.ca", + "24smile.org", + "2lipstube.com", + ".2shared.com", + "30boxes.com", + ".315lz.com", + "||32red.com", + "||36rain.com", + ".3a5a.com", + "3arabtv.com", + ".3boys2girls.com", + ".3proxy.ru", + ".3ren.ca", + ".3tui.net", + "||4bluestones.biz", + ".4chan.com", + ".4everproxy.com", + "||4everproxy.com", + "||4rbtv.com", + "||4shared.com", + "taiwannation.50webs.com", + "||51.ca", + "||51jav.org", + ".51luoben.com", + "||51luoben.com", + ".5278.cc", + "5aimiku.com", + "5i01.com", + ".5isotoi5.org", + ".5maodang.com", + "||63i.com", + ".64museum.org", + "64tianwang.com", + "64wiki.com", + ".66.ca", + "666kb.com", + "6park.com", + "||6park.com", + "||6parker.com", + "||7capture.com", + ".7cow.com", + ".8-d.com", + "|http://8-d.com", + "85cc.net", + ".85cc.us", + "|http://85cc.us", + "|http://85st.com", + ".881903.com/page/zh-tw/", + "||881903.com", + ".888.com", + ".888poker.com", + "89.64.charter.constitutionalism.solutions", + "89-64.org", + "||89-64.org", + ".8news.com.tw", + ".8z1.net", + "||8z1.net", + ".9001700.com", + "|http://908taiwan.org/", + "||91porn.com", + "||91vps.club", + ".92ccav.com", + ".991.com", + "|http://991.com", + ".99btgc01.com", + "||99btgc01.com", + ".99cn.info", + "|http://99cn.info", + "||9bis.com", + "||9bis.net", + ".tibet.a.se", + "|http://tibet.a.se", + "||a-normal-day.com", + "a5.com.ru", + "|http://aamacau.com", + ".abc.com", + ".abc.net.au", + "||abc.net.au", + ".abchinese.com", + "abclite.net", + "|https://www.abclite.net", + ".ablwang.com", + ".aboluowang.com", + "||aboluowang.com", + ".aboutgfw.com", + ".abs.edu", + ".accim.org", + ".aceros-de-hispania.com", + ".acevpn.com", + "||acevpn.com", + ".acg18.me", + "|http://acg18.me", + "||acgkj.com", + ".acmedia365.com", + ".acnw.com.au", + "actfortibet.org", + "actimes.com.au", + "activpn.com", + "||activpn.com", + "||aculo.us", + "||addictedtocoffee.de", + ".adelaidebbs.com/bbs", + ".adpl.org.hk", + "|http://adpl.org.hk", + ".adult-sex-games.com", + "||adult-sex-games.com", + "adultfriendfinder.com", + "adultkeep.net/peepshow/members/main.htm", + "||advanscene.com", + "||advertfan.com", + ".ae.org", + "||aenhancers.com", + "||af.mil", + ".afantibbs.com", + "|http://afantibbs.com", + ".ai-kan.net", + "||ai-kan.net", + "ai-wen.net", + ".aiph.net", + "||aiph.net", + ".airasia.com", + "||airconsole.com", + "|http://download.aircrack-ng.org", + ".airvpn.org", + "||airvpn.org", + ".aisex.com", + "||ait.org.tw", + "aiweiwei.com", + ".aiweiweiblog.com", + "||aiweiweiblog.com", + "||www.ajsands.com", + "a248.e.akamai.net", + "||a248.e.akamai.net", + "rfalive1.akacast.akamaistream.net", + "voa-11.akacast.akamaistream.net", + "||abematv.akamaized.net", + "||linear-abematv.akamaized.net", + "||vod-abematv.akamaized.net", + "|https://fbcdn*.akamaihd.net/", + "rthklive2-lh.akamaihd.net", + ".akademiye.org/ug", + "|http://akademiye.org/ug", + "||akiba-online.com", + "||akow.org", + ".al-islam.com", + "||al-qimmah.net", + "||alabout.com", + ".alanhou.com", + "|http://alanhou.com", + ".alarab.qa", + "||alasbarricadas.org", + "alexlur.org", + "||alforattv.net", + ".alhayat.com", + ".alicejapan.co.jp", + "aliengu.com", + "||alkasir.com", + "||allconnected.co", + ".alldrawnsex.com", + "||alldrawnsex.com", + ".allervpn.com", + "||allfinegirls.com", + ".allgirlmassage.com", + "allgirlsallowed.org", + ".allgravure.com", + "alliance.org.hk", + ".allinfa.com", + "|http://allinfa.com", + ".alljackpotscasino.com", + "||allmovie.com", + "||almasdarnews.com", + ".alphaporno.com", + "||alternate-tools.com", + "alternativeto.net/software", + "alvinalexander.com", + "alwaysdata.com", + "||alwaysdata.com", + "||alwaysdata.net", + ".alwaysvpn.com", + "||alwaysvpn.com", + "||am730.com.hk", + "ameblo.jp", + "||ameblo.jp", + "www1.american.edu/ted/ice/tibet", + "||americangreencard.com", + "|http://www.americorps.gov", + "||amiblockedornot.com", + ".amigobbs.net", + ".amitabhafoundation.us", + "|http://amitabhafoundation.us", + ".amnesty.org", + "||amnesty.org", + "||amnesty.org.hk", + ".amnesty.tw", + ".amnestyusa.org", + "||amnestyusa.org", + ".amnyemachen.org", + ".amoiist.com", + ".amtb-taipei.org", + "androidplus.co/apk", + ".andygod.com", + "|http://andygod.com", + "annatam.com/chinese", + "||anchorfree.com", + "||ancsconf.org", + "||andfaraway.net", + "||android-x86.org", + "angelfire.com/hi/hayashi", + "||angularjs.org", + "animecrazy.net", + ".animeshippuuden.com", + "aniscartujo.com", + "||aniscartujo.com", + "||anobii.com", + "anonymise.us", + ".anonymitynetwork.com", + ".anonymizer.com", + "anontext.com", + ".anpopo.com", + ".answering-islam.org", + "|http://www.antd.org", + "||anthonycalzadilla.com", + ".anti1984.com", + "antichristendom.com", + ".antiwave.net", + "|http://antiwave.net", + ".anyporn.com", + ".anysex.com", + "|http://anysex.com", + "||aobo.com.au", + ".aofriend.com", + "|http://aofriend.com", + ".aofriend.com.au", + ".aojiao.org", + "||aomiwang.com", + "video.ap.org", + ".apetube.com", + "||apiary.io", + ".apigee.com", + "||apigee.com", + "apk-dl.com", + "apkdler.com/apk/view", + ".apkmonk.com/app", + "||apkplz.com", + "apkpure.com", + "||apkpure.com", + ".aplusvpn.com", + ".appdownloader.net/Android", + ".appledaily.com", + "||appledaily.com", + "appledaily.com.hk", + "||appledaily.com.hk", + "appledaily.com.tw", + "||appledaily.com.tw", + ".appshopper.com", + "|http://appshopper.com", + "||appsocks.net", + "||appsto.re", + ".aptoide.com", + "||aptoide.com", + "||archives.gov", + ".archive.fo", + "||archive.fo", + ".archive.is", + "||archive.is", + ".archive.li", + "||archive.li", + "||archive.org", + "archive.today", + "|https://archive.today", + ".arctosia.com", + "|http://arctosia.com", + "||areca-backup.org", + ".arethusa.su", + "||arethusa.su", + "||arlingtoncemetery.mil", + "||army.mil", + ".art4tibet1998.org", + "artofpeacefoundation.org", + "artsy.net", + "||asacp.org", + ".asahichinese.com", + "||asahichinese.com", + "asdfg.jp/dabr", + "asg.to", + ".asia-gaming.com", + ".asiaharvest.org", + "||asiaharvest.org", + "asianews.it", + "|http://japanfirst.asianfreeforum.com/", + "||asiansexdiary.com", + "||asianwomensfilm.de", + ".asiatgp.com", + ".asiatoday.us", + "||askstudent.com", + ".askynz.net", + "||askynz.net", + "||assembla.com", + "||astrill.com", + "||atc.org.au", + ".atchinese.com", + "|http://atchinese.com", + "atgfw.org", + ".atlaspost.com", + "||atlaspost.com", + "||atdmt.com", + ".atlanta168.com/forum", + ".atnext.com", + "||atnext.com", + "ice.audionow.com", + ".av.com", + "||av.movie", + ".av-e-body.com", + "avaaz.org", + "||avaaz.org", + ".avbody.tv", + ".avcity.tv", + ".avcool.com", + ".avdb.in", + "||avdb.in", + ".avdb.tv", + "||avdb.tv", + ".avfantasy.com", + ".avgle.com", + "||avgle.com", + "||avidemux.org", + "||avoision.com", + ".avyahoo.com", + "||axureformac.com", + ".azerbaycan.tv", + "azerimix.com", + "boxun*.azurewebsites.net", + "||boxun*.azurewebsites.net", + "forum.baby-kingdom.com", + "babynet.com.hk", + "backchina.com", + "||backchina.com", + ".backpackers.com.tw/forum", + "backtotiananmen.com", + ".badiucao.com", + "||badiucao.com", + ".badjojo.com", + "badoo.com", + "|http://*2.bahamut.com.tw", + "||baidu.jp", + ".baijie.org", + "|http://baijie.org", + "||bailandaily.com", + "||baixing.me", + "||bakgeekhome.tk", + ".banana-vpn.com", + "||banana-vpn.com", + ".bandwagonhost.com", + "||bandwagonhost.com", + ".bangbrosnetwork.com", + ".bangchen.net", + "|http://bangchen.net", + "||bangyoulater.com", + "bannedbook.org", + "||bannedbook.org", + ".bannednews.org", + ".baramangaonline.com", + "|http://baramangaonline.com", + ".barenakedislam.com", + "||barnabu.co.uk", + "bartvpn.com", + ".bastillepost.com", + "bayvoice.net", + "||bayvoice.net", + "dajusha.baywords.com", + "||bbchat.tv", + "||bb-chat.tv", + ".bbg.gov", + ".bbkz.com/forum", + ".bbnradio.org", + "bbs-tw.com", + ".bbsdigest.com/thread", + "||bbsfeed.com", + "bbsland.com", + ".bbsmo.com", + ".bbsone.com", + "bbtoystore.com", + ".bcast.co.nz", + ".bcc.com.tw/board", + ".bcchinese.net", + ".bcmorning.com", + "bdsmvideos.net", + ".beaconevents.com", + ".bebo.com", + "||bebo.com", + ".beevpn.com", + "||beevpn.com", + ".behindkink.com", + "||beijing1989.com", + "beijingspring.com", + "||beijingspring.com", + ".beijingzx.org", + "|http://beijingzx.org", + ".belamionline.com", + ".bell.wiki", + "|http://bell.wiki", + "bemywife.cc", + "beric.me", + ".berlintwitterwall.com", + "||berlintwitterwall.com", + ".berm.co.nz", + ".bestforchina.org", + "||bestforchina.org", + ".bestgore.com", + ".bestpornstardb.com", + "||bestvpn.com", + ".bestvpnanalysis.com", + ".bestvpnserver.com", + ".bestvpnservice.com", + ".bestvpnusa.com", + "||bet365.com", + ".betfair.com", + "||betternet.co", + ".bettervpn.com", + "||bettervpn.com", + ".bettween.com", + "||bettween.com", + "||betvictor.com", + ".bewww.net", + ".beyondfirewall.com", + "||bfnn.org", + "||bfsh.hk", + ".bgvpn.com", + "||bgvpn.com", + ".bianlei.com", + "@@||bianlei.com", + "biantailajiao.com", + "biantailajiao.in", + ".biblesforamerica.org", + "|http://biblesforamerica.org", + ".bic2011.org", + "bigfools.com", + "||bigjapanesesex.com", + ".bignews.org", + "||bignews.org", + ".bigsound.org", + ".biliworld.com", + "|http://biliworld.com", + "|http://billypan.com/wiki", + ".binux.me", + "ai.binwang.me/couplet", + "bipic.net", + ".bit.do", + "|http://bit.do", + ".bit.ly", + "|http://bit.ly", + "||bitcointalk.org", + ".bitshare.com", + "||bitshare.com", + "bitsnoop.com", + ".bitvise.com", + "||bitvise.com", + "bizhat.com", + "||bl-doujinsouko.com", + ".bjnewlife.org", + ".bjs.org", + "bjzc.org", + "||bjzc.org", + ".blacklogic.com", + ".blackvpn.com", + "||blackvpn.com", + "blewpass.com", + "tor.blingblingsquad.net", + ".blinkx.com", + "||blinkx.com", + "blinw.com", + ".blip.tv", + "||blip.tv/", + ".blockcn.com", + "||blockcn.com", + "||blockless.com", + "||blog.de", + ".blog.jp", + "|http://blog.jp", + "@@||jpush.cn", + ".blogcatalog.com", + "||blogcatalog.com", + "||blogcity.me", + ".blogger.com", + "||blogger.com", + "blogimg.jp", + "||blog.kangye.org", + ".bloglines.com", + "||bloglines.com", + "||bloglovin.com", + "rconversation.blogs.com", + "blogtd.net", + ".blogtd.org", + "|http://blogtd.org", + "||bloodshed.net", + ".bloomberg.cn", + "||bloomberg.cn", + ".bloomberg.com", + "||bloomberg.com", + "bloomberg.de", + "||bloomberg.de", + "||bloomfortune.com", + "blueangellive.com", + ".bmfinn.com", + ".bnews.co", + "||bnews.co", + "||bnrmetal.com", + "boardreader.com/thread", + "||boardreader.com", + ".bod.asia", + "|http://bod.asia", + ".bodog88.com", + ".bolehvpn.net", + "||bolehvpn.net", + "bonbonme.com", + ".bonbonsex.com", + ".bonfoundation.org", + ".bongacams.com", + "||boobstagram.com", + "||book.com.tw", + "bookepub.com", + "||books.com.tw", + "||botanwang.com", + ".bot.nu", + ".bowenpress.com", + "||bowenpress.com", + "||app.box.com", + "dl.box.net", + "||dl.box.net", + ".boxpn.com", + "||boxpn.com", + "boxun.com", + "||boxun.com", + ".boxun.tv", + "||boxun.tv", + "boxunblog.com", + "||boxunblog.com", + ".boxunclub.com", + "boyangu.com", + ".boyfriendtv.com", + ".boysfood.com", + "||br.st", + ".brainyquote.com/quotes/authors/d/dalai_lama", + "||brandonhutchinson.com", + "||braumeister.org", + ".bravotube.net", + "||bravotube.net", + ".brazzers.com", + "||brazzers.com", + ".break.com", + "||break.com", + "breakgfw.com", + "||breakgfw.com", + "breaking911.com", + ".breakingtweets.com", + "||breakingtweets.com", + "||breakwall.net", + "briian.com/6511/freegate", + ".briefdream.com/%E7%B4%A0%E6%A3%BA", + "brizzly.com", + "||brizzly.com", + "||brkmd.com", + "broadbook.com", + ".broadpressinc.com", + "||broadpressinc.com", + "bbs.brockbbs.com", + "brucewang.net", + ".brutaltgp.com", + "||brutaltgp.com", + ".bt2mag.com", + "||bt95.com", + ".btaia.com", + ".btbtav.com", + "|http://btdigg.org", + ".btku.me", + "||btku.me", + "||btku.org", + ".btspread.com", + ".btsynckeys.com", + ".budaedu.org", + "||budaedu.org", + ".buddhanet.com.tw/zfrop/tibet", + ".buddhistchannel.tv", + ".buffered.com", + "|http://buffered.com", + ".bullog.org", + "||bullog.org", + ".bullogger.com", + "||bullogger.com", + "bunbunhk.com", + ".busayari.com", + "|http://busayari.com", + ".businessinsider.com/bing-could-be-censoring-search-results-2014", + ".businessinsider.com/china-banks-preparing-for-debt-implosion-2014", + ".businessinsider.com/hong-kong-activists-defy-police-tear-gas-as-protests-continue-overnight-2014", + ".businessinsider.com/internet-outages-reported-in-north-korea-2014", + ".businessinsider.com/iphone-6-is-approved-for-sale-in-china-2014", + ".businessinsider.com/nfl-announcers-surface-tablets-2014", + ".businessinsider.com/panama-papers", + ".businessinsider.com/umbrella-man-hong-kong-2014", + "|http://www.businessinsider.com.au/*", + ".businessweek.com", + ".busu.org/news", + "|http://busu.org/news", + "busytrade.com", + ".buugaa.com", + ".buzzhand.com", + ".buzzhand.net", + ".buzzorange.com", + "||buzzorange.com", + "||bvpn.com", + "bwsj.hk", + "||bx.tl", + ".c-spanvideo.org", + "||c-spanvideo.org", + "||c-est-simple.com", + ".c100tibet.org", + "||cablegatesearch.net", + ".cachinese.com", + ".cacnw.com", + "|http://cacnw.com", + ".cactusvpn.com", + "||cactusvpn.com", + ".cafepress.com", + ".cahr.org.tw", + ".calameo.com/books", + "cn.calameo.com", + "|http://cn.calameo.com", + ".calgarychinese.ca", + ".calgarychinese.com", + ".calgarychinese.net", + "|http://blog.calibre-ebook.com", + "|http://google.calstate.edu", + "falun.caltech.edu", + ".its.caltech.edu/~falun/", + ".cam4.com", + ".cam4.jp", + ".cam4.sg", + ".camfrog.com", + "||camfrog.com", + "||cams.com", + ".cams.org.sg", + "canadameet.com", + ".canalporno.com", + "|http://bbs.cantonese.asia/", + ".canyu.org", + "||canyu.org", + ".cao.im", + ".caobian.info", + "||caobian.info", + "caochangqing.com", + "||caochangqing.com", + ".cap.org.hk", + "||cap.org.hk", + ".carabinasypistolas.com", + "cardinalkungfoundation.org", + "carmotorshow.com", + "ss.carryzhou.com", + ".cartoonmovement.com", + "||cartoonmovement.com", + ".casadeltibetbcn.org", + ".casatibet.org.mx", + "|http://casatibet.org.mx", + "cari.com.my", + "||caribbeancom.com", + ".casinoking.com", + ".casinoriva.com", + "||catch22.net", + ".catchgod.com", + "|http://catchgod.com", + "||catfightpayperview.xxx", + ".catholic.org.hk", + "||catholic.org.hk", + "catholic.org.tw", + "||catholic.org.tw", + ".cathvoice.org.tw", + "||cattt.com", + ".cbc.ca", + "||cbc.ca", + ".cbsnews.com/video", + ".cbtc.org.hk", + "||cccat.cc", + "||cccat.co", + ".ccdtr.org", + "||ccdtr.org", + ".cchere.com", + "||cchere.com", + ".ccim.org", + ".cclife.ca", + "cclife.org", + "cclifefl.org", + ".ccthere.com", + "||ccthere.com", + ".cctmweb.net", + ".cctongbao.com/article/2078732", + "ccue.ca", + "ccue.com", + ".ccvoice.ca", + ".ccw.org.tw", + ".cgdepot.org", + "|http://cgdepot.org", + "||cdbook.org", + ".cdcparty.com", + ".cdef.org", + "||cdef.org", + "||cdig.info", + "cdjp.org", + "||cdjp.org", + ".cdn-apple.com", + "||cdn-apple.com", + ".cdnews.com.tw", + "cdp1989.org", + "cdp1998.org", + "||cdp1998.org", + "cdp2006.org", + "||cdp2006.org", + ".cdpa.url.tw", + "cdpeu.org", + "cdpusa.org", + "cdpweb.org", + "||cdpweb.org", + "cdpwu.org", + "||cdpwu.org", + "||cdw.com", + ".cecc.gov", + "||cecc.gov", + "||cellulo.info", + "||cenews.eu", + "||centerforhumanreprod.com", + "||centralnation.com", + ".centurys.net", + "|http://centurys.net", + ".cfhks.org.hk", + ".cfos.de", + ".cftfc.com", + ".cgst.edu", + ".change.org", + "||change.org", + ".changp.com", + "||changp.com", + ".changsa.net", + "|http://changsa.net", + ".channel8news.sg/news8", + ".chapm25.com", + ".chaturbate.com", + ".chuang-yen.org", + "chengmingmag.com", + ".chenguangcheng.com", + "||chenguangcheng.com", + ".chenpokong.com", + ".chenpokong.net", + "|http://chenpokong.net", + "||cherrysave.com", + ".chhongbi.org", + "chicagoncmtv.com", + "|http://chicagoncmtv.com", + ".china-week.com", + "china101.com", + "||china101.com", + "||china18.org", + "||china21.com", + "china21.org", + "||china21.org", + ".china5000.us", + "chinaaffairs.org", + "||chinaaffairs.org", + "||chinaaid.me", + "chinaaid.us", + "chinaaid.org", + "chinaaid.net", + "chinacomments.org", + "||chinacomments.org", + ".chinachange.org", + "||chinachange.org", + "chinachannel.hk", + "||chinachannel.hk", + ".chinacitynews.be", + ".chinadialogue.net", + ".chinadigitaltimes.net", + "||chinadigitaltimes.net", + ".chinaelections.org", + "||chinaelections.org", + ".chinaeweekly.com", + "||chinaeweekly.com", + "||chinafreepress.org", + ".chinagate.com", + "chinageeks.org", + "chinagfw.org", + "||chinagfw.org", + ".chinagonet.com", + ".chinagreenparty.org", + "||chinagreenparty.org", + ".chinahorizon.org", + "||chinahorizon.org", + ".chinahush.com", + ".chinainperspective.com", + "||chinainterimgov.org", + "chinalaborwatch.org", + "chinalawtranslate.com", + ".chinapost.com.tw/taiwan/national/national-news", + "chinaxchina.com/howto", + "chinalawandpolicy.com", + ".chinamule.com", + "||chinamule.com", + "chinamz.org", + ".chinapress.com.my", + "||chinapress.com.my", + ".china-review.com.ua", + "|http://china-review.com.ua", + ".chinarightsia.org", + "chinasmile.net/forums", + "chinasocialdemocraticparty.com", + "||chinasocialdemocraticparty.com", + "chinasoul.org", + "||chinasoul.org", + ".chinasucks.net", + ".chinatimes.com/realtimenews/260409/", + "||chinatopsex.com", + ".chinatown.com.au", + "chinatweeps.com", + "chinaway.org", + ".chinaworker.info", + "||chinaworker.info", + "chinayouth.org.hk", + "chinayuanmin.org", + "||chinayuanmin.org", + ".chinese-hermit.net", + "chinese-leaders.org", + "chinese-memorial.org", + ".chinesedaily.com", + "||chinesedailynews.com", + ".chinesedemocracy.com", + "||chinesedemocracy.com", + "||chinesegay.org", + ".chinesen.de", + "||chinesen.de", + ".chinesenews.net.au/", + ".chinesepen.org", + ".chinesetalks.net/ch", + "||chineseupress.com", + ".chingcheong.com", + "||chingcheong.com", + ".chinman.net", + "|http://chinman.net", + "chithu.org", + "|http://chn.chosun.com", + "cnnews.chosun.com/client/news/viw.asp?cate=C01&mcate", + ".chrdnet.com", + "|http://chrdnet.com", + ".christianfreedom.org", + "|http://christianfreedom.org", + "christianstudy.com", + "||christianstudy.com", + "christusrex.org/www1/sdc", + ".chubold.com", + "chubun.com", + "chuizi.net", + "christiantimes.org.hk", + ".chrlawyers.hk", + "|http://chrlawyers.hk", + ".churchinhongkong.org/b5/index.php", + "|http://churchinhongkong.org/b5/index.php", + ".chushigangdrug.ch", + ".cienen.com", + ".cineastentreff.de", + ".cipfg.org", + "||circlethebayfortibet.org", + "||cirosantilli.com", + ".citizencn.com", + "||citizencn.com", + "|http://citizenlab.org", + "|http://www.citizenlab.org", + "||citizenscommission.hk", + ".citizenlab.org", + "citizensradio.org", + ".city365.ca", + "|http://city365.ca", + "city9x.com", + "||citypopulation.de", + ".citytalk.tw/event", + ".civicparty.hk", + "||civicparty.hk", + ".civildisobediencemovement.org", + "civilhrfront.org", + "||civilhrfront.org", + ".civiliangunner.com", + ".civilmedia.tw", + "||civilmedia.tw", + "psiphon.civisec.org", + "||vpn.cjb.net", + ".ck101.com", + "||ck101.com", + ".clarionproject.org/news/islamic-state-isis-isil-propaganda", + "||classicalguitarblog.net", + ".clb.org.hk", + "clearharmony.net", + "clearwisdom.net", + "clinica-tibet.ru", + ".clipfish.de", + "cloakpoint.com", + "||club1069.com", + "cmi.org.tw", + "|http://www.cmoinc.org", + "cmp.hku.hk", + "hkupop.hku.hk", + "||cmule.com", + "||cmule.org", + "||cms.gov", + "|http://vpn.cmu.edu", + "|http://vpn.sv.cmu.edu", + ".cn6.eu", + ".cna.com.tw", + "||cna.com.tw", + ".cnabc.com", + ".cnd.org", + "||cnd.org", + "download.cnet.com", + ".cnex.org.cn", + ".cnineu.com", + "wiki.cnitter.com", + ".cnn.com/video", + ".cnpolitics.org", + "||cnpolitics.org", + ".cn-proxy.com", + "|http://cn-proxy.com", + ".cnproxy.com", + "blog.cnyes.com", + "news.cnyes.com", + "||coat.co.jp", + ".cochina.co", + "||cochina.co", + "||cochina.org", + ".code1984.com/64", + "|http://goagent.codeplex.com", + "||codeshare.io", + "||codeskulptor.org", + "|http://tosh.comedycentral.com", + "comefromchina.com", + "||comefromchina.com", + ".comic-mega.me", + "commandarms.com", + "||commentshk.com", + ".communistcrimes.org", + "||communistcrimes.org", + "||communitychoicecu.com", + "||compileheart.com", + "||conoha.jp", + ".contactmagazine.net", + ".convio.net", + ".coobay.com", + "|http://www.cool18.com/bbs*/", + ".coolaler.com", + "||coolaler.com", + "coolder.com", + "||coolder.com", + "||coolloud.org.tw", + ".coolncute.com", + "||coolstuffinc.com", + "corumcollege.com", + ".cos-moe.com", + "|http://cos-moe.com", + ".cosplayjav.pl", + "|http://cosplayjav.pl", + ".cotweet.com", + "||cotweet.com", + ".coursehero.com", + "||coursehero.com", + "cpj.org", + "||cpj.org", + ".cq99.us", + "|http://cq99.us", + "crackle.com", + "||crackle.com", + ".crazys.cc", + ".crazyshit.com", + "||crchina.org", + "crd-net.org", + "creaders.net", + "||creaders.net", + ".creadersnet.com", + "||cristyli.com", + ".crocotube.com", + "|http://crocotube.com", + ".crossthewall.net", + "||crossthewall.net", + ".crossvpn.net", + "||crossvpn.net", + "||crucial.com", + "csdparty.com", + "||csdparty.com", + "||csuchen.de", + ".csw.org.uk", + ".ct.org.tw", + "||ct.org.tw", + ".ctao.org", + ".ctfriend.net", + ".ctitv.com.tw", + "cts.com.tw", + "|http://library.usc.cuhk.edu.hk/", + "|http://mjlsh.usc.cuhk.edu.hk/", + ".cuhkacs.org/~benng", + ".cuihua.org", + "||cuihua.org", + ".cuiweiping.net", + "||cuiweiping.net", + "||culture.tw", + ".cumlouder.com", + "||cumlouder.com", + "||curvefish.com", + ".cusu.hk", + "||cusu.hk", + ".cutscenes.net", + ".cw.com.tw", + "||cw.com.tw", + "|http://forum.cyberctm.com", + "cyberghostvpn.com", + "||cyberghostvpn.com", + "||cynscribe.com", + "cytode.us", + "||ifan.cz.cc", + "||mike.cz.cc", + "||nic.cz.cc", + ".d-fukyu.com", + "|http://d-fukyu.com", + "cl.d0z.net", + ".d100.net", + "||d100.net", + ".d2bay.com", + "|http://d2bay.com", + ".dabr.co.uk", + "||dabr.co.uk", + "dabr.eu", + "dabr.mobi", + "||dabr.mobi", + "||dabr.me", + "dadazim.com", + "||dadazim.com", + ".dadi360.com", + ".dafabet.com", + "dafagood.com", + "dafahao.com", + ".dafoh.org", + ".daftporn.com", + ".dagelijksestandaard.nl", + ".daidostup.ru", + "|http://daidostup.ru", + ".dailidaili.com", + "||dailidaili.com", + ".dailymotion.com", + "||dailymotion.com", + "daiphapinfo.net", + ".dajiyuan.com", + "||dajiyuan.de", + "dajiyuan.eu", + "dalailama.com", + ".dalailama.mn", + "|http://dalailama.mn", + ".dalailama.ru", + "||dalailama.ru", + "dalailama80.org", + ".dalailama-archives.org", + ".dalailamacenter.org", + "|http://dalailamacenter.org", + "dalailamafellows.org", + ".dalailamafilm.com", + ".dalailamafoundation.org", + ".dalailamahindi.com", + ".dalailamainaustralia.org", + ".dalailamajapanese.com", + ".dalailamaprotesters.info", + ".dalailamaquotes.org", + ".dalailamatrust.org", + ".dalailamavisit.org.nz", + ".dalailamaworld.com", + "||dalailamaworld.com", + "dalianmeng.org", + "||dalianmeng.org", + ".daliulian.org", + "||daliulian.org", + ".danke4china.net", + "||danke4china.net", + ".danwei.org", + "daolan.net", + ".daozhongxing.org", + "darktoy.net", + "||dastrassi.org", + "blog.daum.net/_blog", + ".david-kilgour.com", + "|http://david-kilgour.com", + "daxa.cn", + "||daxa.cn", + "cn.dayabook.com", + ".daylife.com/topic/dalai_lama", + "||db.tt", + ".dbc.hk/main", + "||dcard.tw", + "dcmilitary.com", + ".ddc.com.tw", + ".ddhw.info", + "||de-sci.org", + ".de-sci.org", + "packages.debian.org/zh-cn/lenny/gpass", + "||decodet.co", + ".definebabe.com", + "||delcamp.net", + "delicious.com/GFWbookmark", + ".democrats.org", + "||democrats.org", + "||desc.se", + "||dessci.com", + ".destroy-china.jp", + "||deutsche-welle.de", + "||devio.us", + "||devpn.com", + "||dfas.mil", + "dfn.org", + "dharmakara.net", + ".dharamsalanet.com", + ".diaoyuislands.org", + "||diaoyuislands.org", + ".difangwenge.org", + "|http://digiland.tw/", + "||digitalnomadsproject.org", + ".diigo.com", + "||diigo.com", + "||dilber.se", + "||furl.net", + ".dipity.com", + "||directcreative.com", + "|https://search.disconnect.me", + ".discuss.com.hk", + "||discuss.com.hk", + ".discuss4u.com", + "disp.cc", + ".disqus.com", + "||disqus.com", + ".dit-inc.us", + "||dit-inc.us", + ".dizhidizhi.com", + "||dizhuzhishang.com", + "djangosnippets.org", + ".djorz.com", + "||djorz.com", + "||dl-laby.jp", + "||dlsite.com", + "||dlyoutube.com", + "||dmcdn.net", + ".dnscrypt.org", + "||dnscrypt.org", + "||dns2go.com", + "||dnssec.net", + "doctorvoice.org", + ".dogfartnetwork.com/tour", + "gloryhole.com", + ".dojin.com", + ".dok-forum.net", + "||dolc.de", + "||dolf.org.hk", + "||dollf.com", + ".domain.club.tw", + ".domaintoday.com.au", + "chinese.donga.com", + "dongtaiwang.com", + "||dongtaiwang.com", + ".dongtaiwang.net", + "||dongtaiwang.net", + ".dongyangjing.com", + "|http://danbooru.donmai.us", + ".dontfilter.us", + "||dontmovetochina.com", + ".dorjeshugden.com", + ".dotplane.com", + "||dotplane.com", + "||dotsub.com", + ".dotvpn.com", + "||dotvpn.com", + ".doub.io", + "||doub.io", + "||dougscripts.com", + "||douhokanko.net", + "||doujincafe.com", + "dowei.org", + "dphk.org", + "dpp.org.tw", + "||dpp.org.tw", + "||dpr.info", + "||dragonsprings.org", + ".dreamamateurs.com", + ".drepung.org", + "||drgan.net", + ".drmingxia.org", + "|http://drmingxia.org", + "||dropbooks.tv", + "||dropbox.com", + "||api.dropboxapi.com", + "||notify.dropboxapi.com", + "||dropboxusercontent.com", + "drsunacademy.com", + ".drtuber.com", + ".dscn.info", + "|http://dscn.info", + ".dstk.dk", + "|http://dstk.dk", + "||dtiblog.com", + "||dtic.mil", + ".dtwang.org", + ".duanzhihu.com", + ".duckdns.org", + "|http://duckdns.org", + ".duckduckgo.com", + "||duckduckgo.com", + ".duckload.com/download", + "||duckmylife.com", + ".duga.jp", + "|http://duga.jp", + ".duihua.org", + "||duihua.org", + "||duihuahrjournal.org", + ".dunyabulteni.net", + ".duoweitimes.com", + "||duoweitimes.com", + "duping.net", + "||duplicati.com", + "dupola.com", + "dupola.net", + ".dushi.ca", + "||dvorak.org", + ".dw.com", + "||dw.com", + "||dw.de", + ".dw-world.com", + "||dw-world.com", + ".dw-world.de", + "|http://dw-world.de", + "www.dwheeler.com", + "dwnews.com", + "||dwnews.com", + "dwnews.net", + "||dwnews.net", + "xys.dxiong.com", + "||dynawebinc.com", + ".dzze.com", + "||e-classical.com.tw", + "||e-gold.com", + ".e-gold.com", + ".e-hentai.org", + "||e-hentai.org", + ".e-hentaidb.com", + "|http://e-hentaidb.com", + "e-info.org.tw", + ".e-traderland.net/board", + ".e-zone.com.hk/discuz", + "|http://e-zone.com.hk/discuz", + ".e123.hk", + "||e123.hk", + ".earlytibet.com", + "|http://earlytibet.com", + ".earthcam.com", + ".earthvpn.com", + "||earthvpn.com", + "eastern-ark.com", + ".easternlightning.org", + ".eastturkestan.com", + "|http://www.eastturkistan.net/", + ".eastturkistan-gov.org", + ".eastturkistancc.org", + ".eastturkistangovernmentinexile.us", + "||eastturkistangovernmentinexile.us", + ".easyca.ca", + ".easypic.com", + ".ebony-beauty.com", + "ebookbrowse.com", + "ebookee.com", + "||ecfa.org.tw", + "ushuarencity.echainhost.com", + "||ecimg.tw", + "ecministry.net", + ".economist.com", + "bbs.ecstart.com", + "edgecastcdn.net", + "||edgecastcdn.net", + "/twimg\\.edgesuite\\.net\\/\\/?appledaily/", + "edicypages.com", + ".edmontonchina.cn", + ".edmontonservice.com", + "edoors.com", + ".edubridge.com", + "||edubridge.com", + ".edupro.org", + "||eevpn.com", + "efcc.org.hk", + ".efukt.com", + "|http://efukt.com", + "||eic-av.com", + "||eireinikotaerukai.com", + ".eisbb.com", + ".eksisozluk.com", + "||eksisozluk.com", + "electionsmeter.com", + "||elgoog.im", + ".elpais.com", + "||elpais.com", + ".eltondisney.com", + ".emaga.com/info/3407", + "emilylau.org.hk", + ".emanna.com/chineseTraditional", + "bitc.bme.emory.edu/~lzhou/blogs", + ".empfil.com", + ".emule-ed2k.com", + "|http://emule-ed2k.com", + ".emulefans.com", + "|http://emulefans.com", + ".emuparadise.me", + ".enanyang.my", + "||enewstree.com", + ".enfal.de", + "chinese.engadget.com", + "||engagedaily.org", + "englishforeveryone.org", + "||englishfromengland.co.uk", + "englishpen.org", + ".enlighten.org.tw", + "||entermap.com", + ".entnt.com", + "|http://entnt.com", + ".episcopalchurch.org", + ".epochhk.com", + "|http://epochhk.com", + "epochtimes-bg.com", + "||epochtimes-bg.com", + "epochtimes-romania.com", + "||epochtimes-romania.com", + "epochtimes.co.il", + "||epochtimes.co.il", + "epochtimes.co.kr", + "||epochtimes.co.kr", + "epochtimes.com", + "||epochtimes.com", + ".epochtimes.cz", + "epochtimes.de", + "epochtimes.fr", + ".epochtimes.ie", + ".epochtimes.it", + "epochtimes.jp", + "epochtimes.ru", + "epochtimes.se", + "epochtimestr.com", + ".epochweek.com", + "||epochweek.com", + "||epochweekly.com", + ".eporner.com", + ".equinenow.com", + "erabaru.net", + ".eracom.com.tw", + ".eraysoft.com.tr", + ".erepublik.com", + ".erights.net", + "||erights.net", + ".erktv.com", + "|http://erktv.com", + "||ernestmandel.org", + "||erodaizensyu.com", + "||erodoujinlog.com", + "||erodoujinworld.com", + "||eromanga-kingdom.com", + "||eromangadouzin.com", + ".eromon.net", + "|http://eromon.net", + ".eroprofile.com", + ".eroticsaloon.net", + ".eslite.com", + "||eslite.com", + "wiki.esu.im/%E8%9B%A4%E8%9B%A4%E8%AF%AD%E5%BD%95", + ".etaa.org.au", + ".etadult.com", + "etaiwannews.com", + "||etizer.org", + "||etokki.com", + ".ettoday.net/news/20151216/614081", + "etvonline.hk", + ".eu.org", + "||eu.org", + ".eucasino.com", + ".eulam.com", + ".eurekavpt.com", + "||eurekavpt.com", + "eeas.europa.eu/delegations/china/press_corner/all_news/news/2015/20150716_zh", + "eeas.europa.eu/statements-eeas/2015/151022", + ".evschool.net", + "|http://evschool.net", + "||exblog.jp", + "||blog.exblog.co.jp", + "@@||www.exblog.jp", + ".exchristian.hk", + "||exchristian.hk", + "|http://blog.excite.co.jp", + "||exmormon.org", + "||expatshield.com", + ".expecthim.com", + "||expecthim.com", + "experts-univers.com", + "||exploader.net", + ".expressvpn.com", + "||expressvpn.com", + ".extremetube.com", + "eyevio.jp", + "||eyevio.jp", + ".eyny.com", + "||eyny.com", + ".ezpc.tk/category/soft", + ".ezpeer.com", + "||facebookquotes4u.com", + ".faceless.me", + "||faceless.me", + "|http://facesoftibetanselfimmolators.info", + "||facesofnyfw.com", + ".faith100.org", + "|http://faith100.org", + ".faithfuleye.com", + "||faiththedog.info", + ".fakku.net", + ".falsefire.com", + "||falsefire.com", + "falun-co.org", + "falunart.org", + "||falunasia.info", + "|http://falunau.org", + ".falunaz.net", + "falundafa.org", + "falundafa-dc.org", + "||falundafa-florida.org", + "||falundafa-nc.org", + "||falundafa-pa.net", + "||falundafa-sacramento.org", + "falun-ny.net", + "||falundafaindia.org", + "falundafamuseum.org", + ".falungong.club", + ".falungong.de", + "falungong.org.uk", + "||falunhr.org", + "faluninfo.de", + "faluninfo.net", + ".falunpilipinas.net", + "||falunworld.net", + "familyfed.org", + ".fangeming.com", + "||fanglizhi.info", + "||fangong.org", + "fangongheike.com", + ".fanqiang.tk", + "fanqianghou.com", + "||fanqianghou.com", + ".fanqiangzhe.com", + "||fanqiangzhe.com", + "fapdu.com", + "faproxy.com", + ".fawanghuihui.org", + "fanqiangyakexi.net", + "fail.hk", + "||famunion.com", + ".fan-qiang.com", + ".fangbinxing.com", + "||fangbinxing.com", + "fangeming.com", + ".fangmincn.org", + "||fangmincn.org", + ".fanhaodang.com", + "||fanswong.com", + ".fanyue.info", + ".farwestchina.com", + "en.favotter.net", + "nytimes.map.fastly.net", + "||nytimes.map.fastly.net", + "||fast.wistia.com", + "||fastssh.com", + "||faststone.org", + "favstar.fm", + "||favstar.fm", + "faydao.com/weblog", + "||fbsbx.com", + ".fc2.com", + ".fc2china.com", + ".fc2cn.com", + "||fc2cn.com", + "fc2blog.net", + "|http://uygur.fc2web.com/", + "video.fdbox.com", + ".fdc64.de", + ".fdc64.org", + ".fdc89.jp", + "||fourface.nodesnoop.com", + "||feelssh.com", + "feer.com", + ".feifeiss.com", + "|http://feitianacademy.org", + ".feitian-california.org", + "||feministteacher.com", + ".fengzhenghu.com", + "||fengzhenghu.com", + ".fengzhenghu.net", + "||fengzhenghu.net", + ".fevernet.com", + "|http://ff.im", + "fffff.at", + "fflick.com", + ".ffvpn.com", + "fgmtv.net", + ".fgmtv.org", + ".fhreports.net", + "|http://fhreports.net", + ".figprayer.com", + "||figprayer.com", + ".fileflyer.com", + "||fileflyer.com", + "|http://feeds.fileforum.com", + ".files2me.com", + ".fileserve.com/file", + "fillthesquare.org", + "filmingfortibet.org", + ".filthdump.com", + ".finchvpn.com", + "||finchvpn.com", + "findmespot.com", + "||findyoutube.com", + "||findyoutube.net", + ".fingerdaily.com", + "finler.net", + ".firearmsworld.net", + "|http://firearmsworld.net", + ".fireofliberty.org", + "||fireofliberty.org", + ".firetweet.io", + "||firetweet.io", + ".flagsonline.it", + "fleshbot.com", + ".fleursdeslettres.com", + "|http://fleursdeslettres.com", + "||flgg.us", + "||flgjustice.org", + "||flickr.com", + "||staticflickr.com", + "flickrhivemind.net", + ".flickriver.com", + ".fling.com", + "||flipkart.com", + "||flog.tw", + ".flyvpn.com", + "||flyvpn.com", + "|http://cn.fmnnow.com", + "fofldfradio.org", + "blog.foolsmountain.com", + ".forum4hk.com", + "fangong.forums-free.com", + "pioneer-worker.forums-free.com", + "|https://ss*.4sqi.net", + "video.foxbusiness.com", + "|http://foxgay.com", + "||fringenetwork.com", + "||flecheinthepeche.fr", + ".fochk.org", + "|http://fochk.org", + "||focustaiwan.tw", + ".focusvpn.com", + "||fofg.org", + ".fofg-europe.net", + ".fooooo.com", + "||fooooo.com", + "footwiball.com", + ".fotile.me", + "||fourthinternational.org", + "||foxdie.us", + "||foxsub.com", + "foxtang.com", + ".fpmt.org", + "|http://fpmt.org", + ".fpmt.tw", + ".fpmt-osel.org", + "||fpmtmexico.org", + "fqok.org", + "||fqrouter.com", + "||franklc.com", + ".freakshare.com", + "|http://freakshare.com", + "||free4u.com.ar", + "free-gate.org", + ".free-hada-now.org", + "free-proxy.cz", + ".free.fr/adsl", + "kineox.free.fr", + "tibetlibre.free.fr", + "||freealim.com", + "whitebear.freebearblog.org", + "||freebrowser.org", + ".freechal.com", + ".freedomchina.info", + "||freedomchina.info", + ".freedomhouse.org", + "||freedomhouse.org", + ".freedomsherald.org", + "||freedomsherald.org", + ".freefq.com", + ".freefuckvids.com", + ".freegao.com", + "||freegao.com", + "freeilhamtohti.org", + ".freekwonpyong.org", + "||saveliuxiaobo.com", + ".freelotto.com", + "||freelotto.com", + "freeman2.com", + ".freeopenvpn.com", + "freemoren.com", + "freemorenews.com", + "freemuse.org/archives/789", + "freenet-china.org", + "freenewscn.com", + "cn.freeones.com", + ".freeoz.org/bbs", + "||freeoz.org", + "||freessh.us", + "free4u.com.ar", + ".free-ssh.com", + "||free-ssh.com", + ".freechina.news/", + "||freechinaforum.org", + "||freechinaweibo.com", + ".freedomcollection.org/interviews/rebiya_kadeer", + ".freeforums.org", + "||freenetproject.org", + ".freeoz.org", + ".freetibet.net", + "||freetibet.org", + ".freetibetanheroes.org", + "|http://freetibetanheroes.org", + ".freeviewmovies.com", + ".freevpn.me", + "|http://freevpn.me", + "||freewallpaper4.me", + ".freewebs.com", + ".freewechat.com", + "||freewechat.com", + "freeweibo.com", + "||freeweibo.com", + ".freexinwen.com", + ".freeyoutubeproxy.net", + "||freeyoutubeproxy.net", + "friendfeed.com", + "friendfeed-media.com/e99a4ebe2fb4c1985c2a58775eb4422961aa5a2e", + "friends-of-tibet.org", + ".friendsoftibet.org", + "freechina.net", + "|http://www.zensur.freerk.com/", + "freevpn.nl", + "freeyellow.com", + "hk.frienddy.com/hk", + "|http://adult.friendfinder.com/", + ".fring.com", + "||fring.com", + ".fromchinatousa.net", + "||frommel.net", + ".frontlinedefenders.org", + ".frootvpn.com", + "||frootvpn.com", + "||fscked.org", + ".fsurf.com", + ".ftv.com.tw", + "fucd.com", + ".fuckcnnic.net", + "||fuckcnnic.net", + "fuckgfw.org", + "||fullerconsideration.com", + "fulue.com", + ".funf.tw", + "funp.com", + ".fuq.com", + ".furhhdl.org", + "||furinkan.com", + ".futurechinaforum.org", + "||futuremessage.org", + ".fux.com", + ".fuyin.net", + ".fuyindiantai.org", + ".fuyu.org.tw", + "||fw.cm", + ".fxcm-chinese.com", + "||fxcm-chinese.com", + "fzh999.com", + "fzh999.net", + "fzlm.com", + ".g6hentai.com", + "|http://g6hentai.com", + "||g-queen.com", + "||gabocorp.com", + ".gaeproxy.com", + ".gaforum.org", + ".galaxymacau.com", + "||galenwu.com", + ".galstars.net", + "||game735.com", + "gamebase.com.tw", + "gamejolt.com", + "|http://wiki.gamerp.jp", + "||gamer.com.tw", + ".gamer.com.tw", + ".gamez.com.tw", + "||gamez.com.tw", + ".gamousa.com", + ".gaoming.net", + "||gaoming.net", + "ganges.com", + ".gaopi.net", + "|http://gaopi.net", + ".gaozhisheng.org", + ".gaozhisheng.net", + "gardennetworks.com", + "||gardennetworks.org", + "72.52.81.22", + "||gartlive.com", + "||gate-project.com", + "||gather.com", + ".gatherproxy.com", + "gati.org.tw", + ".gaybubble.com", + ".gaycn.net", + ".gayhub.com", + "||gaymap.cc", + ".gaymenring.com", + ".gaytube.com", + "||images-gaytube.com", + ".gaywatch.com", + "|http://gaywatch.com", + ".gazotube.com", + "||gazotube.com", + "||gcc.org.hk", + "||gclooney.com", + "||gcmasia.com", + ".gcpnews.com", + "|http://gcpnews.com", + ".gdbt.net/forum", + "gdzf.org", + "||geek-art.net", + "geekerhome.com/2010/03/xixiang-project-cross-gfw", + "||geekheart.info", + ".gekikame.com", + "|http://gekikame.com", + ".gelbooru.com", + "|http://gelbooru.com", + ".geocities.co.jp", + ".geocities.com/SiliconValley/Circuit/5683/download.html", + "hk.geocities.com", + "geocities.jp", + ".gerefoundation.org", + "||getastrill.com", + ".getchu.com", + ".getcloak.com", + "||getcloak.com", + "||getfoxyproxy.org", + ".getfreedur.com", + "||getgom.com", + ".geti2p.net", + "||geti2p.net", + ".getlantern.org", + "||getlantern.org", + ".getjetso.com/forum", + "getiton.com", + ".getsocialscope.com", + "||getsync.com", + "gfbv.de", + ".gfgold.com.hk", + ".gfsale.com", + "||gfsale.com", + "gfw.org.ua", + ".gfw.press", + "||gfw.press", + ".ggssl.com", + "||ggssl.com", + ".ghostpath.com", + "||ghostpath.com", + "||ghut.org", + ".giantessnight.com", + "|http://giantessnight.com", + ".gifree.com", + "||giga-web.jp", + "tw.gigacircle.com", + "|http://cn.giganews.com/", + "gigporno.ru", + "||girlbanker.com", + ".git.io", + "||git.io", + "|http://softwaredownload.gitbooks.io", + "github.com/getlantern", + "|https://gist.github.com", + "http://cthlo.github.io/hktv", + "hahaxixi.github.io", + "|https://hahaxixi.github.io", + "||haoel.github.io", + "||sikaozhe1997.github.io", + "||sodatea.github.io", + "||terminus2049.github.io", + "wsgzao.github.io", + "|https://wsgzao.github.io", + ".gizlen.net", + "||gizlen.net", + ".gjczz.com", + "||gjczz.com", + "globaljihad.net", + "globalmediaoutreach.com", + "globalmuseumoncommunism.org", + "||globalrescue.net", + ".globaltm.org", + ".globalvoicesonline.org", + "||globalvoicesonline.org", + "||globalvpn.net", + ".glock.com", + "gluckman.com/DalaiLama", + "gmbd.cn", + "||gmhz.org", + "|http://www.gmiddle.com", + "|http://www.gmiddle.net", + ".gmll.org", + "||gnci.org.hk", + "go-pki.com", + "||goagent.biz", + "||goagentplus.com", + "gobet.cc", + "godfootsteps.org", + "||godfootsteps.org", + "godns.work", + "godsdirectcontact.co.uk", + ".godsdirectcontact.org", + "godsdirectcontact.org.tw", + ".godsimmediatecontact.com", + ".gogotunnel.com", + "||gohappy.com.tw", + ".gokbayrak.com", + ".goldbet.com", + "||goldbetsports.com", + "||goldeneyevault.com", + ".goldenfrog.com", + "||goldenfrog.com", + ".goldjizz.com", + "|http://goldjizz.com", + ".goldstep.net", + "||goldwave.com", + "gongmeng.info", + "gongm.in", + "gongminliliang.com", + ".gongwt.com", + "|http://gongwt.com", + "blog.goo.ne.jp/duck-tail_2009", + ".gooday.xyz", + "|http://gooday.xyz", + ".goodreads.com", + "||goodreads.com", + ".goodreaders.com", + "||goodreaders.com", + ".goodtv.com.tw", + ".goodtv.tv", + "||goofind.com", + ".googlesile.com", + ".gopetition.com", + "||gopetition.com", + ".goproxing.net", + ".gotrusted.com", + "||gotrusted.com", + "||gotw.ca", + "||grammaly.com", + "grandtrial.org", + ".graphis.ne.jp", + "||graphis.ne.jp", + "||graphql.org", + "greatfirewall.biz", + "||greatfirewallofchina.net", + ".greatfirewallofchina.org", + "||greatfirewallofchina.org", + "||greenfieldbookstore.com.hk", + ".greenparty.org.tw", + "||greenpeace.org", + ".greenreadings.com/forum", + "great-firewall.com", + "great-roc.org", + "greatroc.org", + "greatzhonghua.org", + ".greenpeace.com.tw", + ".greenvpn.net", + "||greenvpn.net", + ".greenvpn.org", + "||grotty-monday.com", + "gs-discuss.com", + "||gtricks.com", + "guancha.org", + "guaneryu.com", + ".guardster.com", + ".gun-world.net", + "gunsandammo.com", + "||gutteruncensored.com", + "||gvm.com.tw", + ".gzm.tv", + "||gzone-anime.info", + "||clementine-player.org", + "echofon.com", + "||greasespot.net", + "||www.klip.me", + "@@||site.locql.com", + "||stephaniered.com", + "@@||download.syniumsoftware.com", + "|http://ub0.cc", + "wozy.in", + "gospelherald.com", + "||gospelherald.com", + "|http://hk.gradconnection.com/", + "||grangorz.org", + "greatfire.org", + "||greatfire.org", + "greatfirewallofchina.org", + "||greatroc.tw", + ".gts-vpn.com", + "|http://gts-vpn.com", + ".gu-chu-sum.org", + "|http://gu-chu-sum.org", + ".guaguass.com", + "|http://guaguass.com", + ".guaguass.org", + "|http://guaguass.org", + ".guangming.com.my", + "guishan.org", + "||guishan.org", + ".gumroad.com", + "||gumroad.com", + "||gunsamerica.com", + "guruonline.hk", + "|http://gvlib.com", + ".gyalwarinpoche.com", + ".gyatsostudio.com", + ".h528.com", + ".h5dm.com", + ".h5galgame.me", + "||h-china.org", + ".h-moe.com", + "|http://h-moe.com", + "h1n1china.org", + ".hacg.club", + "||hacg.club", + ".hacg.in", + "|http://hacg.in", + ".hacg.li", + "|http://hacg.li", + ".hacg.me", + "|http://hacg.me", + ".hacg.red", + "|http://hacg.red", + ".hacken.cc/bbs", + ".hacker.org", + "||hackthatphone.net", + "hahlo.com", + "||hakkatv.org.tw", + ".handcraftedsoftware.org", + "|http://bbs.hanminzu.org/", + ".hanunyi.com", + ".hao.news/news", + "|http://ae.hao123.com", + "|http://ar.hao123.com", + "|http://br.hao123.com", + "|http://en.hao123.com", + "|http://id.hao123.com", + "|http://jp.hao123.com", + "|http://ma.hao123.com", + "|http://mx.hao123.com", + "|http://sa.hao123.com", + "|http://th.hao123.com", + "|http://tw.hao123.com", + "|http://vn.hao123.com", + "|http://hk.hao123img.com", + "|http://ld.hao123img.com", + "||happy-vpn.com", + ".haproxy.org", + "||hardsextube.com", + ".harunyahya.com", + "|http://harunyahya.com", + "bbs.hasi.wang", + "have8.com", + "@@||haygo.com", + ".hclips.com", + "||hdlt.me", + "||hdtvb.net", + ".hdzog.com", + "|http://hdzog.com", + "||heartyit.com", + ".heavy-r.com", + ".hec.su", + "|http://hec.su", + ".hecaitou.net", + "||hecaitou.net", + ".hechaji.com", + "||hechaji.com", + "||heeact.edu.tw", + ".hegre-art.com", + "|http://hegre-art.com", + "||cdn.helixstudios.net", + "||helplinfen.com", + "||helloandroid.com", + "||helloqueer.com", + ".helloss.pw", + "hellotxt.com", + "||hellotxt.com", + ".hentai.to", + ".hellouk.org/forum/lofiversion", + ".helpeachpeople.com", + "||helpeachpeople.com", + "||helpster.de", + ".helpzhuling.org", + "hentaitube.tv", + ".hentaivideoworld.com", + "||id.heroku.com", + "heqinglian.net", + "||heungkongdiscuss.com", + ".hexieshe.com", + "||hexieshe.com", + "||hexieshe.xyz", + "||hexxeh.net", + "app.heywire.com", + ".heyzo.com", + ".hgseav.com", + ".hhdcb3office.org", + ".hhthesakyatrizin.org", + "hi-on.org.tw", + "hidden-advent.org", + "||hidden-advent.org", + "hidecloud.com/blog/2008/07/29/fuck-beijing-olympics.html", + "||hide.me", + ".hidein.net", + ".hideipvpn.com", + "||hideipvpn.com", + ".hideman.net", + "||hideman.net", + "hideme.nl", + "||hidemy.name", + ".hidemyass.com", + "||hidemyass.com", + "hidemycomp.com", + "||hidemycomp.com", + ".hihiforum.com", + ".hihistory.net", + "||hihistory.net", + ".higfw.com", + "highpeakspureearth.com", + "||highrockmedia.com", + "||hiitch.com", + "||hikinggfw.org", + ".hilive.tv", + ".himalayan-foundation.org", + "himalayanglacier.com", + ".himemix.com", + "||himemix.com", + ".himemix.net", + "times.hinet.net", + ".hitomi.la", + "|http://hitomi.la", + ".hiwifi.com", + "@@||hiwifi.com", + "hizbuttahrir.org", + "hizb-ut-tahrir.info", + "hizb-ut-tahrir.org", + ".hjclub.info", + ".hk-pub.com/forum", + "|http://hk-pub.com", + ".hk01.com", + "||hk01.com", + ".hk32168.com", + "||hk32168.com", + "||hkacg.com", + "||hkacg.net", + ".hkatvnews.com", + "hkbc.net", + ".hkbf.org", + ".hkbookcity.com", + "||hkbookcity.com", + ".hkchurch.org", + "hkci.org.hk", + ".hkcmi.edu", + "||hkcnews.com", + "||hkcoc.com", + "hkday.net", + ".hkdailynews.com.hk/china.php", + "hkdf.org", + ".hkej.com", + ".hkepc.com/forum/viewthread.php?tid=1153322", + "china.hket.com", + "||hkfaa.com", + "hkfreezone.com", + "hkfront.org", + "m.hkgalden.com", + "|https://m.hkgalden.com", + "hkgolden.com", + ".hkgreenradio.org/home", + ".hkheadline.com*blog", + ".hkheadline.com/instantnews", + "hkhkhk.com", + "hkhrc.org.hk", + "hkhrm.org.hk", + "||hkip.org.uk", + "1989report.hkja.org.hk", + "hkjc.com", + ".hkjp.org", + ".hklft.com", + ".hklts.org.hk", + "||hklts.org.hk", + "news.hkpeanut.com", + "hkptu.org", + ".hkreporter.com", + "||hkreporter.com", + "|http://hkupop.hku.hk/", + ".hkusu.net", + "||hkusu.net", + ".hkvwet.com", + ".hkwcc.org.hk", + "||hkzone.org", + ".hmonghot.com", + "|http://hmonghot.com", + ".hmv.co.jp/", + "hnjhj.com", + "||hnjhj.com", + ".hnntube.com", + "||hola.com", + "||hola.org", + "holymountaincn.com", + "holyspiritspeaks.org", + "||holyspiritspeaks.org", + "||derekhsu.homeip.net", + ".homeperversion.com", + "|http://homeservershow.com", + "|http://old.honeynet.org/scans/scan31/sub/doug_eric/spam_translation.html", + ".hongkongfp.com", + "||hongkongfp.com", + "hongmeimei.com", + "||hongzhi.li", + ".hootsuite.com", + "||hootsuite.com", + ".hopedialogue.org", + "|http://hopedialogue.org", + ".hopto.org", + ".hornygamer.com", + ".hornytrip.com", + "|http://hornytrip.com", + ".hotav.tv", + ".hotels.cn", + "hotfrog.com.tw", + "hotgoo.com", + ".hotpornshow.com", + "hotpot.hk", + ".hotshame.com", + "||hotspotshield.com", + ".hotvpn.com", + "||hotvpn.com", + "||hougaige.com", + "||howtoforge.com", + "||hoxx.com", + ".hqcdp.org", + "||hqcdp.org", + "||hqjapanesesex.com", + "hqmovies.com", + ".hrcir.com", + ".hrcchina.org", + ".hrea.org", + ".hrichina.org", + "||hrichina.org", + ".hrw.org", + "||hrw.org", + "hrweb.org", + "||hsjp.net", + "||hsselite.com", + "|http://hst.net.tw", + ".hstern.net", + ".hstt.net", + ".htkou.net", + "||htkou.net", + ".hua-yue.net", + ".huaglad.com", + "||huaglad.com", + ".huanghuagang.org", + "||huanghuagang.org", + ".huangyiyu.com", + ".huaren.us", + "||huaren.us", + ".huaren4us.com", + ".huashangnews.com", + "|http://huashangnews.com", + "bbs.huasing.org", + "huaxia-news.com", + "huaxiabao.org", + "huaxin.ph", + "||huayuworld.org", + ".huffingtonpost.com/rebiya-kadeer", + "||hugoroy.eu", + "||huhaitai.com", + "||huhamhire.com", + "huiyi.in", + ".hulkshare.com", + "humanrightsbriefing.org", + "||hung-ya.com", + "||hungerstrikeforaids.org", + "||huping.net", + "hurgokbayrak.com", + ".hurriyet.com.tr", + ".hut2.ru", + "||hutianyi.net", + "hutong9.net", + "huyandex.com", + ".hwadzan.tw", + "||hwayue.org.tw", + "||hwinfo.com", + "||hxwk.org", + "hxwq.org", + "||hyperrate.com", + "ebook.hyread.com.tw", + "||ebook.hyread.com.tw", + "||i1.hk", + "||i2p2.de", + "||i2runner.com", + "||i818hk.com", + ".i-cable.com", + ".i-part.com.tw", + ".iamtopone.com", + "iask.ca", + "||iask.ca", + "iask.bz", + "||iask.bz", + ".iav19.com", + "ibiblio.org/pub/packages/ccic", + ".iblist.com", + "||iblogserv-f.net", + "ibros.org", + "|http://cn.ibtimes.com", + ".ibvpn.com", + "||ibvpn.com", + "icams.com", + "blogs.icerocket.com/tag", + ".icij.org", + "||icij.org", + "||icl-fi.org", + ".icoco.com", + "||icoco.com", + "||furbo.org", + "||warbler.iconfactory.net", + "||iconpaper.org", + "||icu-project.org", + "w.idaiwan.com/forum", + "||iddddg.com", + "idemocracy.asia", + ".identi.ca", + "||identi.ca", + "||idiomconnection.com", + "|http://www.idlcoyote.com", + ".idouga.com", + ".idreamx.com", + "forum.idsam.com", + ".idv.tw", + ".ieasy5.com", + "|http://ieasy5.com", + ".ied2k.net", + ".ienergy1.com", + "|http://if.ttt/", + "ifanqiang.com", + ".ifcss.org", + "||ifcss.org", + "ifjc.org", + ".ift.tt", + "|http://ift.tt", + "||ifreewares.com", + "||igcd.net", + ".igfw.net", + "||igfw.net", + ".igfw.tech", + "||igfw.tech", + ".igmg.de", + "||ignitedetroit.net", + ".igotmail.com.tw", + "||igvita.com", + "||ihakka.net", + ".ihao.org/dz5", + "||iicns.com", + ".ikstar.com", + "||illusionfactory.com", + "||ilove80.be", + "||im.tv", + "@@||myvlog.im.tv", + "||im88.tw", + ".imgchili.net", + "|http://imgchili.net", + ".imageab.com", + ".imagefap.com", + "||imagefap.com", + "||imageflea.com", + "imageshack.us", + "||imagevenue.com", + "||imagezilla.net", + ".imb.org", + "|http://imb.org", + "|http://www.imdb.com/name/nm0482730", + ".imdb.com/title/tt0819354", + ".imdb.com/title/tt1540068", + ".imdb.com/title/tt4908644", + ".img.ly", + "||img.ly", + ".imkev.com", + "||imkev.com", + ".imlive.com", + ".immoral.jp", + "impact.org.au", + "impp.mn", + "|http://tech2.in.com/video/", + "in99.org", + "in-disguise.com", + ".incapdns.net", + ".incloak.com", + "||incloak.com", + "||incredibox.fr", + "||indiandefensenews.in", + "timesofindia.indiatimes.com/dalai", + "timesofindia.indiatimes.com/defaultinterstitial.cms", + ".indiemerch.com", + "||indiemerch.com", + "info-graf.fr", + "website.informer.com", + ".initiativesforchina.org", + ".inkui.com", + ".inmediahk.net", + "||inmediahk.net", + "||innermongolia.org", + "|http://blog.inoreader.com", + ".inote.tw", + ".insecam.org", + "|http://insecam.org", + "||insidevoa.com", + ".institut-tibetain.org", + "|http://internet.org/", + "internetdefenseleague.org", + "internetfreedom.org", + "||internetpopculture.com", + "inxian.com", + "||inxian.com", + "ipalter.com", + ".ipfire.org", + "||iphone4hongkong.com", + "||iphonehacks.com", + "||iphonetaiwan.org", + "||iphonix.fr", + "||ipicture.ru", + ".ipjetable.net", + "||ipjetable.net", + ".ipobar.com/read.php?", + "ipoock.com/img", + ".iportal.me", + "|http://iportal.me", + "||ippotv.com", + ".ipredator.se", + "||ipredator.se", + ".iptv.com.tw", + "||iptvbin.com", + "||ipvanish.com", + "iredmail.org", + "chinese.irib.ir", + "||ironbigfools.compython.net", + "||ironpython.net", + ".ironsocket.com", + "||ironsocket.com", + ".is.gd", + ".islahhaber.net", + ".islam.org.hk", + "|http://islam.org.hk", + ".islamawareness.net/Asia/China", + ".islamhouse.com", + "||islamhouse.com", + ".islamicity.com", + ".islamicpluralism.org", + ".islamtoday.net", + ".isaacmao.com", + "||isaacmao.com", + "||isgreat.org", + "||ismaelan.com", + ".ismalltits.com", + "||ismprofessional.net", + "isohunt.com", + "||israbox.com", + ".issuu.com", + "||issuu.com", + ".istars.co.nz", + "oversea.istarshine.com", + "||oversea.istarshine.com", + "blog.istef.info/2007/10/21/myentunnel", + ".istiqlalhewer.com", + ".istockphoto.com", + "isunaffairs.com", + "isuntv.com", + "itaboo.info", + "||itaboo.info", + ".italiatibet.org", + "download.ithome.com.tw", + "ithelp.ithome.com.tw", + "||itshidden.com", + ".itsky.it", + ".itweet.net", + "|http://itweet.net", + ".iu45.com", + ".iuhrdf.org", + "||iuhrdf.org", + ".iuksky.com", + ".ivacy.com", + "||ivacy.com", + ".iverycd.com", + ".ivpn.net", + "||ixquick.com", + ".ixxx.com", + "iyouport.com", + "||iyouport.com", + ".izaobao.us", + "||gmozomg.izihost.org", + ".izles.net", + ".izlesem.org", + "||j.mp", + "blog.jackjia.com", + "jamaat.org", + ".jamyangnorbu.com", + "|http://jamyangnorbu.com", + ".jandyx.com", + "||janwongphoto.com", + "||japan-whores.com", + ".jav.com", + ".jav101.com", + ".jav2be.com", + "||jav2be.com", + ".jav68.tv", + ".javakiba.org", + "|http://javakiba.org", + ".javbus.com", + "||javbus.com", + "||javfor.me", + ".javhd.com", + ".javhip.com", + ".javmobile.net", + "|http://javmobile.net", + ".javmoo.com", + ".javseen.com", + "|http://javseen.com", + "jbtalks.cc", + "jbtalks.com", + "jbtalks.my", + ".jdwsy.com", + "jeanyim.com", + "||jfqu36.club", + "||jfqu37.xyz", + "||jgoodies.com", + ".jiangweiping.com", + "||jiangweiping.com", + "||jiaoyou8.com", + ".jiehua.cz", + "||hk.jiepang.com", + "||tw.jiepang.com", + "jieshibaobao.com", + ".jigglegifs.com", + "56cun04.jigsy.com", + "jigong1024.com", + "daodu14.jigsy.com", + "specxinzl.jigsy.com", + "wlcnew.jigsy.com", + ".jihadology.net", + "|http://jihadology.net", + "jinbushe.org", + "||jinbushe.org", + ".jingsim.org", + "zhao.jinhai.de", + "jingpin.org", + "||jingpin.org", + "jinpianwang.com", + ".jinroukong.com", + "ac.jiruan.net", + "||jitouch.com", + ".jizzthis.com", + "jjgirls.com", + ".jkb.cc", + "|http://jkb.cc", + "jkforum.net", + "||jma.go.jp", + "research.jmsc.hku.hk/social", + "weiboscope.jmsc.hku.hk", + ".jmscult.com", + "|http://jmscult.com", + "||joachims.org", + "||jobso.tv", + ".sunwinism.joinbbs.net", + ".journalchretien.net", + "||journalofdemocracy.org", + ".joymiihub.com", + ".joyourself.com", + "jpopforum.net", + ".jubushoushen.com", + "||jubushoushen.com", + ".juhuaren.com", + "||juliereyc.com", + "||junauza.com", + ".june4commemoration.org", + ".junefourth-20.net", + "||junefourth-20.net", + "||bbs.junglobal.net", + ".juoaa.com", + "|http://juoaa.com", + "justfreevpn.com", + ".justicefortenzin.org", + "justpaste.it", + "justtristan.com", + "juyuange.org", + "juziyue.com", + "||juziyue.com", + "||jwmusic.org", + "@@||music.jwmusic.org", + ".jyxf.net", + "||k-doujin.net", + "||ka-wai.com", + ".kagyu.org", + "||kagyu.org.za", + ".kagyumonlam.org", + ".kagyunews.com.hk", + ".kagyuoffice.org", + "||kagyuoffice.org", + "||kagyuoffice.org.tw", + ".kaiyuan.de", + ".kakao.com", + "||kakao.com", + ".kalachakralugano.org", + ".kankan.today", + ".kannewyork.com", + "||kannewyork.com", + ".kanshifang.com", + "||kanshifang.com", + "||kantie.org", + "kanzhongguo.com", + "kanzhongguo.eu", + ".kaotic.com", + "||karayou.com", + "karkhung.com", + ".karmapa.org", + ".karmapa-teachings.org", + "||kawase.com", + ".kba-tx.org", + ".kcoolonline.com", + ".kebrum.com", + "||kebrum.com", + ".kechara.com", + ".keepandshare.com/visit/visit_page.php?i=688154", + ".keezmovies.com", + ".kendincos.net", + ".kenengba.com", + "||kenengba.com", + "||keontech.net", + ".kepard.com", + "||kepard.com", + "wiki.keso.cn/Home", + "||keycdn.com", + ".khabdha.org", + ".khmusic.com.tw", + "||kichiku-doujinko.com", + ".kik.com", + "||kik.com", + "bbs.kimy.com.tw", + ".kindleren.com", + "|http://kindleren.com", + "|http://www.kindleren.com", + ".kingdomsalvation.org", + "||kingdomsalvation.org", + "kinghost.com", + "||kingstone.com.tw", + ".kink.com", + "killwall.com", + "||killwall.com", + "||kinmen.travel", + ".kir.jp", + ".kissbbao.cn", + "|http://kiwi.kz", + "||kk-whys.co.jp", + ".kmuh.org.tw", + ".knowledgerush.com/kr/encyclopedia", + ".kobo.com", + "||kobo.com", + ".kobobooks.com", + "||kobobooks.com", + "||kodingen.com", + "@@||www.kodingen.com", + "||kompozer.net", + ".konachan.com", + "|http://konachan.com", + ".kone.com", + "||koolsolutions.com", + ".koornk.com", + "||koornk.com", + "||koranmandarin.com", + ".korenan2.com", + "|http://gojet.krtco.com.tw", + ".ksdl.org", + ".ksnews.com.tw", + "||ktzhk.com", + ".kui.name/event", + "kun.im", + ".kurashsultan.com", + "||kurtmunger.com", + "kusocity.com", + "||kwcg.ca", + "kwongwah.com.my", + ".kxsw.life", + "||kxsw.life", + ".kyofun.com", + "kyohk.net", + "||kyoyue.com", + ".kyzyhello.com", + "||kyzyhello.com", + ".kzeng.info", + "||kzeng.info", + "la-forum.org", + "ladbrokes.com", + "||labiennale.org", + ".lagranepoca.com", + "||lagranepoca.com", + ".lalulalu.com", + ".lama.com.tw", + "||lama.com.tw", + ".lamayeshe.com", + "|http://lamayeshe.com", + "|http://www.lamenhu.com", + ".lamnia.co.uk", + "||lamnia.co.uk", + "lamrim.com", + ".lanterncn.cn", + "|http://lanterncn.cn", + ".lantosfoundation.org", + ".laod.cn", + "|http://laod.cn", + "laogai.org", + "||laogai.org", + "laomiu.com", + ".laoyang.info", + "|http://laoyang.info", + "||laptoplockdown.com", + ".laqingdan.net", + "||laqingdan.net", + "||larsgeorge.com", + ".lastcombat.com", + "|http://lastcombat.com", + "||lastfm.es", + "latelinenews.com", + ".latibet.org", + "||le-vpn.com", + ".leafyvpn.net", + "||leafyvpn.net", + "leeao.com.cn/bbs/forum.php", + "lefora.com", + "||left21.hk", + ".legalporno.com", + ".legsjapan.com", + "|http://leirentv.ca", + "leisurecafe.ca", + "||lematin.ch", + ".lemonde.fr", + "||lenwhite.com", + "lerosua.org", + "||lerosua.org", + "blog.lester850.info", + "||lesoir.be", + ".letou.com", + "letscorp.net", + "||letscorp.net", + "||ss.levyhsu.com", + "||cdn.assets.lfpcontent.com", + ".lhakar.org", + "|http://lhakar.org", + ".lhasocialwork.org", + ".liangyou.net", + "||liangyou.net", + ".lianyue.net", + "||liaowangxizang.net", + ".liaowangxizang.net", + "||liberal.org.hk", + ".libertytimes.com.tw", + "blogs.libraryinformationtechnology.com/jxyz", + ".lidecheng.com/blog/fucking-gfw", + ".lighten.org.tw", + ".lightnovel.cn", + "@@|https://www.lightnovel.cn", + "limiao.net", + "linkuswell.com", + "abitno.linpie.com/use-ipv6-to-fuck-gfw", + "||line.me", + "||line-apps.com", + ".linglingfa.com", + "||lingvodics.com", + ".link-o-rama.com", + "|http://link-o-rama.com", + ".linkideo.com", + "||api.linksalpha.com", + "||apidocs.linksalpha.com", + "||www.linksalpha.com", + "||help.linksalpha.com", + "||linux.org.hk", + "linuxtoy.org/archives/installing-west-chamber-on-ubuntu", + ".lionsroar.com", + ".lipuman.com", + "||liquidvpn.com", + "||greatfire.us7.list-manage.com", + "||listentoyoutube.com", + "listorious.com", + ".liu-xiaobo.org", + "||liudejun.com", + ".liuhanyu.com", + ".liujianshu.com", + "||liujianshu.com", + ".liuxiaobo.net", + "|http://liuxiaobo.net", + "liuxiaotong.com", + "||liuxiaotong.com", + ".livedoor.jp", + ".liveleak.com", + "||liveleak.com", + ".livestation.com", + "livestream.com", + "||livestream.com", + "||livingonline.us", + "||livingstream.com", + "||livevideo.com", + ".livevideo.com", + ".liwangyang.com", + "lizhizhuangbi.com", + "lkcn.net", + ".llss.me/", + ".load.to", + ".lobsangwangyal.com", + ".localdomain.ws", + "||localdomain.ws", + "localpresshk.com", + "||lockestek.com", + "logbot.net", + "||logiqx.com", + "secure.logmein.com", + "||secure.logmein.com", + ".londonchinese.ca", + ".longhair.hk", + "longmusic.com", + "||longtermly.net", + "||lookpic.com", + ".looktoronto.com", + "|http://looktoronto.com", + ".lotsawahouse.org/tibetan-masters/fourteenth-dalai-lama", + ".lotuslight.org.hk", + ".lotuslight.org.tw", + "hkreporter.loved.hk", + "||lpsg.com", + "||lrfz.com", + ".lrip.org", + "||lrip.org", + ".lsd.org.hk", + "||lsd.org.hk", + "lsforum.net", + ".lsm.org", + "||lsm.org", + ".lsmchinese.org", + "||lsmchinese.org", + ".lsmkorean.org", + "||lsmkorean.org", + ".lsmradio.com/rad_archives", + ".lsmwebcast.com", + ".ltn.com.tw", + "|http://ltn.com.tw", + ".luke54.com", + ".luke54.org", + ".lupm.org", + "||lupm.org", + "||lushstories.com", + "luxebc.com", + "lvhai.org", + "||lvhai.org", + "||lvv2.com", + ".lyfhk.net", + "|http://lyfhk.net", + ".lzmtnews.org", + "||lzmtnews.org", + "http://*.m-team.cc", + ".macrovpn.com", + "macts.com.tw", + "||mad-ar.ch", + "||madrau.com", + "||madthumbs.com", + "||magic-net.info", + "mahabodhi.org", + "my.mail.ru", + ".maiplus.com", + "|http://maiplus.com", + ".maizhong.org", + "makkahnewspaper.com", + ".mamingzhe.com", + "manicur4ik.ru", + ".maplew.com", + "|http://maplew.com", + "||marc.info", + "marguerite.su", + "||martincartoons.com", + "maskedip.com", + ".maiio.net", + "mail-archive.com", + ".malaysiakini.com", + "||makemymood.com", + ".manchukuo.net", + ".maniash.com", + "|http://maniash.com", + ".mansion.com", + ".mansionpoker.com", + "||martau.com", + "|http://blog.martinoei.com", + ".martsangkagyuofficial.org", + "|http://martsangkagyuofficial.org", + "maruta.be/forget", + ".marxist.com", + "||marxist.net", + ".marxists.org/chinese", + "||matainja.com", + "||mathable.io", + "||mathiew-badimon.com", + "||matsushimakaede.com", + "|http://maturejp.com", + "mayimayi.com", + ".maxing.jp", + ".mcaf.ee", + "|http://mcaf.ee", + "||mcadforums.com", + "mcfog.com", + "mcreasite.com", + ".md-t.org", + "||md-t.org", + "||meansys.com", + ".media.org.hk", + ".mediachinese.com", + "||mediachinese.com", + ".mediafire.com/?", + ".mediafire.com/download", + ".mediafreakcity.com", + "||mediafreakcity.com", + ".medium.com", + "||medium.com", + ".meetav.com", + "||meetup.com", + "mefeedia.com", + "jihadintel.meforum.org", + "||mega.nz", + "||megaproxy.com", + "||megarotic.com", + "megavideo.com", + "||megurineluka.com", + "meirixiaochao.com", + ".meltoday.com", + ".memehk.com", + "||memehk.com", + "memorybbs.com", + ".memri.org", + ".memrijttm.org", + ".mercyprophet.org", + "|http://mercyprophet.org", + ".meridian-trust.org", + "|http://meridian-trust.org", + ".meripet.biz", + "|http://meripet.biz", + ".meripet.com", + "|http://meripet.com", + "merit-times.com.tw", + "meshrep.com", + ".mesotw.com/bbs", + "metacafe.com/watch", + "||meteorshowersonline.com", + "|http://www.metro.taipei/", + ".metrohk.com.hk/?cmd=detail&categoryID=2", + "||metrolife.ca", + ".metroradio.com.hk", + "|http://metroradio.com.hk", + "meyou.jp", + ".meyul.com", + "||mgoon.com", + "||mgstage.com", + "||mh4u.org", + "mhradio.org", + "|http://michaelanti.com", + "||michaelmarketl.com", + ".microvpn.com", + "|http://microvpn.com", + "middle-way.net", + ".mihk.hk/forum", + ".mihr.com", + "mihua.org", + "||mikesoltys.com", + ".milph.net", + "|http://milph.net", + ".milsurps.com", + "mimiai.net", + ".mimivip.com", + ".mimivv.com", + ".mindrolling.org", + "|http://mindrolling.org", + ".minghui.or.kr", + "|http://minghui.or.kr", + "minghui.org", + "||minghui.org", + "minghui-a.org", + "minghui-b.org", + "minghui-school.org", + ".mingjinglishi.com", + "||mingjinglishi.com", + "mingjingnews.com", + "||mingjingtimes.com", + ".mingpao.com", + "||mingpao.com", + ".mingpaocanada.com", + ".mingpaomonthly.com", + "|http://mingpaomonthly.com", + "mingpaonews.com", + ".mingpaony.com", + ".mingpaosf.com", + ".mingpaotor.com", + ".mingpaovan.com", + ".mingshengbao.com", + ".minhhue.net", + ".miniforum.org", + ".ministrybooks.org", + ".minzhuhua.net", + "||minzhuhua.net", + "minzhuzhanxian.com", + "minzhuzhongguo.org", + "||miroguide.com", + "mirrorbooks.com", + ".mist.vip", + "thecenter.mit.edu", + ".mitao.com.tw", + ".mitbbs.com", + "||mitbbs.com", + "mitbbsau.com", + ".mixero.com", + "||mixero.com", + "mixpod.com", + ".mixx.com", + "||mixx.com", + "||mizzmona.com", + ".mk5000.com", + ".mlcool.com", + "||mlzs.work", + ".mm-cg.com", + "||mmaaxx.com", + ".mmmca.com", + "mnewstv.com", + "||mobatek.net", + ".mobile01.com", + "||mobile01.com", + "||mobileways.de", + ".mobypicture.com", + "|http://moby.to", + "||moeerolibrary.com", + "wiki.moegirl.org", + ".mofaxiehui.com", + ".mofos.com", + "||mog.com", + "molihua.org", + "||mondex.org", + ".money-link.com.tw", + "|http://money-link.com.tw", + "|http://www.monlamit.org", + ".moonbbs.com", + "||moonbbs.com", + "c1522.mooo.com", + "||monitorchina.org", + "bbs.morbell.com", + "||morningsun.org", + "||moroneta.com", + ".motherless.com", + "|http://motherless.com", + "motor4ik.ru", + ".mousebreaker.com", + ".movements.org", + "||movements.org", + "||moviefap.com", + "||www.moztw.org", + ".mp3buscador.com", + "mp3ye.eu", + "||mpettis.com", + "mpfinance.com", + "mpinews.com", + "mponline.hk", + ".mqxd.org", + "|http://mqxd.org", + "mrtweet.com", + "||mrtweet.com", + "news.hk.msn.com", + "news.msn.com.tw", + "msguancha.com", + ".mswe1.org", + "|http://mswe1.org", + "||mthruf.com", + "muchosucko.com", + "||multiply.com", + "multiproxy.org", + "multiupload.com", + ".mullvad.net", + "||mullvad.net", + ".mummysgold.com", + ".murmur.tw", + "|http://murmur.tw", + ".musicade.net", + ".muslimvideo.com", + "||muzi.com", + "||muzi.net", + "||mx981.com", + ".my-formosa.com", + ".my-proxy.com", + ".my-private-network.co.uk", + "||my-private-network.co.uk", + "forum.my903.com", + ".myactimes.com/actimes", + "||myanniu.com", + ".myaudiocast.com", + "||myaudiocast.com", + ".myav.com.tw/bbs", + ".mybbs.us", + ".myca168.com", + ".mycanadanow.com", + "||bbs.mychat.to", + "||mychinamyhome.com", + ".mychinamyhome.com", + ".mychinanet.com", + ".mychinanews.com", + "||mychinanews.com", + ".mychinese.news", + "||mycnnews.com", + "||mykomica.org", + "mycould.com/discuz", + ".myeasytv.com", + "||myeclipseide.com", + ".myforum.com.hk", + "||myforum.com.hk", + "||myforum.com.uk", + ".myfreecams.com", + ".myfreepaysite.com", + ".myfreshnet.com", + ".myiphide.com", + "||myiphide.com", + "forum.mymaji.com", + "mymediarom.com/files/box", + "||mymoe.moe", + "||mymusic.net.tw", + "||myparagliding.com", + "||mypopescu.com", + "myradio.hk/podcast", + ".myreadingmanga.info", + "mysinablog.com", + ".myspace.com", + "||myspacecdn.com", + ".mytalkbox.com", + ".mytizi.com", + "||naacoalition.org", + "old.nabble.com", + "||naitik.net", + ".nakuz.com/bbs", + "||nalandabodhi.org", + "||nalandawest.org", + ".namgyal.org", + "namgyalmonastery.org", + "||namsisi.com", + ".nanyang.com", + "||nanyang.com", + ".nanyangpost.com", + "||nanyangpost.com", + ".nanzao.com", + "||jpl.nasa.gov", + "||pds.nasa.gov", + "||solarsystem.nasa.gov", + ".nakido.com", + "||nakido.com", + ".naol.ca", + ".naol.cc", + "uighur.narod.ru", + ".nat.moe", + "||nat.moe", + "cyberghost.natado.com", + "||national-lottery.co.uk", + "news.nationalgeographic.com/news/2014/06/140603-tiananmen-square", + ".nationsonline.org/oneworld/tibet", + "||line.naver.jp", + "||navyfamily.navy.mil", + "||navyreserve.navy.mil", + "||nko.navy.mil", + "||usno.navy.mil", + "naweeklytimes.com", + ".nbtvpn.com", + "|http://nbtvpn.com", + "nccwatch.org.tw", + ".nch.com.tw", + ".ncn.org", + "||ncn.org", + "||etools.ncol.com", + ".nde.de", + ".ndr.de", + ".ned.org", + "||nekoslovakia.net", + "||nepusoku.com", + "||net-fits.pro", + "bbs.netbig.com", + ".netbirds.com", + "netcolony.com", + "bolin.netfirms.com", + "||netme.cc", + "netsneak.com", + ".network54.com", + "networkedblogs.com", + ".networktunnel.net", + "neverforget8964.org", + "new-3lunch.net", + ".new-akiba.com", + ".new96.ca", + ".newcenturymc.com", + "|http://newcenturymc.com", + "newcenturynews.com", + "||newchen.com", + ".newchen.com", + ".newgrounds.com", + "newipnow.com", + ".newlandmagazine.com.au", + ".newnews.ca", + "news100.com.tw", + "newschinacomment.org", + ".newscn.org", + "||newscn.org", + "newspeak.cc/story", + ".newsancai.com", + "||newsancai.com", + ".newsdetox.ca", + ".newsdh.com", + "||newstamago.com", + "||newstapa.org", + "newstarnet.com", + ".newtaiwan.com.tw", + "newtalk.tw", + "||newtalk.tw", + "newyorktimes.com", + "||nexon.com", + ".next11.co.jp", + ".nextmag.com.tw", + ".nextmedia.com", + "||nexton-net.jp", + "nexttv.com.tw", + ".nfjtyd.com", + "||co.ng.mil", + "||nga.mil", + "ngensis.com", + ".nhentai.net", + "|http://nhentai.net", + ".nhk-ondemand.jp", + ".nicovideo.jp/watch", + "||nighost.org", + "av.nightlife141.com", + "ninecommentaries.com", + ".ninjacloak.com", + "||ninjaproxy.ninja", + "nintendium.com", + "taiwanyes.ning.com", + "usmgtcg.ning.com/forum", + "||niusnews.com", + "||njactb.org", + "njuice.com", + "||njuice.com", + "nlfreevpn.com", + ".ddns.net/", + ".gooddns.info", + "||gotdns.ch", + ".maildns.xyz", + ".no-ip.org", + ".opendn.xyz", + ".servehttp.com", + "sytes.net", + ".whodns.xyz", + ".zapto.org", + "|http://dynupdate.no-ip.com/", + "||nobel.se", + "nobelprize.org/nobel_prizes/peace/laureates/1989", + "nobelprize.org/nobel_prizes/peace/laureates/2010", + "nobodycanstop.us", + "||nobodycanstop.us", + "||nokogiri.org", + "||nokola.com", + "noodlevpn.com", + ".norbulingka.org", + "nordvpn.com", + "||nordvpn.com", + "||novelasia.com", + ".news.now.com", + "|http://news.now.com", + "news.now.com%2Fhome", + "||nownews.com", + ".nowtorrents.com", + ".noypf.com", + "||noypf.com", + "||npa.go.jp", + ".npnt.me", + "|http://npnt.me", + ".nps.gov", + ".nradio.me", + "|http://nradio.me", + ".nrk.no", + "||nrk.no", + ".ntd.tv", + "||ntd.tv", + ".ntdtv.com", + "||ntdtv.com", + ".ntdtv.co.kr", + "ntdtv.ca", + "ntdtv.org", + "ntdtv.ru", + "ntdtvla.com", + ".ntrfun.com", + "||cbs.ntu.edu.tw", + "||media.nu.nl", + ".nubiles.net", + "||nuexpo.com", + ".nukistream.com", + "||nurgo-software.com", + "||nutaku.net", + ".nuvid.com", + "||nvdst.com", + "nuzcom.com", + ".nvquan.org", + ".nvtongzhisheng.org", + "|http://nvtongzhisheng.org", + ".nwtca.org", + "|http://nyaa.eu", + ".nydus.ca", + "nylon-angel.com", + "nylonstockingsonline.com", + ".nzchinese.com", + "||nzchinese.net.nz", + "observechina.net", + ".obutu.com", + "ocaspro.com", + "occupytiananmen.com", + "oclp.hk", + ".ocreampies.com", + "||october-review.org", + "offbeatchina.com", + "officeoftibet.com", + "|http://ofile.org", + "||ogaoga.org", + "twtr2src.ogaoga.org", + ".ogate.org", + "||ogate.org", + "www2.ohchr.org/english/bodies/cat/docs/ngos/II_China_41.pdf", + ".oikos.com.tw/v4", + ".oiktv.com", + "oizoblog.com", + ".ok.ru", + "||ok.ru", + ".okayfreedom.com", + "||okayfreedom.com", + "okk.tw", + "|http://filmy.olabloga.pl/player", + "old-cat.net", + "||olumpo.com", + ".olympicwatch.org", + "omgili.com", + "||omnitalk.com", + "||omnitalk.org", + "cling.omy.sg", + "forum.omy.sg", + "news.omy.sg", + "showbiz.omy.sg", + "||on.cc", + "||onedrive.live.com", + "||onion.city", + ".onlinecha.com", + "||onlineyoutube.com", + ".onlytweets.com", + "|http://onlytweets.com", + "onmoon.net", + "onmoon.com", + ".onthehunt.com", + "|http://onthehunt.com", + ".oopsforum.com", + "open.com.hk", + "openallweb.com", + "opendemocracy.net", + "||opendemocracy.net", + ".openervpn.in", + "openid.net", + "||openid.net", + ".openleaks.org", + "||openleaks.org", + "openvpn.net", + "||openvpn.net", + "||openwebster.com", + ".openwrt.org.cn", + "@@||openwrt.org.cn", + "my.opera.com/dahema", + "||demo.opera-mini.net", + ".opus-gaming.com", + "|http://opus-gaming.com", + "www.orchidbbs.com", + ".organcare.org.tw", + "organharvestinvestigation.net", + ".orgasm.com", + ".orgfree.com", + "||orient-doll.com", + "orientaldaily.com.my", + "||orientaldaily.com.my", + "||orn.jp", + "t.orzdream.com", + "||t.orzdream.com", + "tui.orzdream.com", + "||orzistic.org", + "||osfoora.com", + ".otnd.org", + "||otnd.org", + "||otto.de", + "||ourdearamy.com", + "oursogo.com", + ".oursteps.com.au", + "||oursteps.com.au", + ".oursweb.net", + "||ourtv.hk", + "xinqimeng.over-blog.com", + "||overplay.net", + "share.ovi.com/media", + "|http://owl.li", + "|http://ht.ly", + "|http://htl.li", + "|http://mash.to", + "www.owind.com", + "|http://www.oxid.it", + "oyax.com", + "oyghan.com/wps", + ".ozchinese.com/bbs", + "||ow.ly", + "bbs.ozchinese.com", + ".ozvoice.org", + "||ozvoice.org", + ".ozxw.com", + ".ozyoyo.com", + "||pachosting.com", + ".pacificpoker.com", + ".packetix.net", + "||pacopacomama.com", + ".padmanet.com", + "page2rss.com", + "||pagodabox.com", + ".palacemoon.com", + "forum.palmislife.com", + "||eriversoft.com", + ".paldengyal.com", + "paljorpublications.com", + ".paltalk.com", + "||pandapow.co", + ".pandapow.net", + ".pandavpn-jp.com", + ".panluan.net", + "||panluan.net", + "||pao-pao.net", + "paper.li", + "paperb.us", + ".paradisehill.cc", + ".paradisepoker.com", + ".partycasino.com", + ".partypoker.com", + ".passion.com", + "||passion.com", + ".passiontimes.hk", + "pastebin.com", + ".pastie.org", + "||pastie.org", + "||blog.pathtosharepoint.com", + "pbs.org/wgbh/pages/frontline/gate", + "pbs.org/wgbh/pages/frontline/tankman", + "pbs.org/wgbh/pages/frontline/tibet", + "video.pbs.org", + "pbwiki.com", + "||pbworks.com", + "||developers.box.net", + "||wiki.oauth.net", + "||wiki.phonegap.com", + "||wiki.jqueryui.com", + "||pbxes.com", + "||pbxes.org", + "pcdvd.com.tw", + ".pchome.com.tw", + "|http://pcij.org", + ".pcstore.com.tw", + "||pct.org.tw", + "pdetails.com", + "||pdproxy.com", + "||peace.ca", + "peacefire.org", + "peacehall.com", + "||peacehall.com", + "|http://pearlher.org", + ".peeasian.com", + ".pekingduck.org", + "||pekingduck.org", + ".pemulihan.or.id", + "|http://pemulihan.or.id", + "||pen.io", + "penchinese.com", + "||penchinese.net", + ".penchinese.net", + "pengyulong.com", + "penisbot.com", + "||blog.pentalogic.net", + ".penthouse.com", + ".pentoy.hk/%E4%B8%AD%E5%9C%8B", + ".pentoy.hk/%E6%99%82%E4%BA%8B", + ".peoplebookcafe.com", + ".peoplenews.tw", + "||peoplenews.tw", + ".peopo.org", + "||peopo.org", + ".percy.in", + ".perfectgirls.net", + "perfectvpn.net", + ".persecutionblog.com", + ".persiankitty.com", + "pfd.org.hk", + "phapluan.org", + "phayul.com", + "philborges.com", + "philly.com", + "||phncdn.com", + "||photodharma.net", + "||photofocus.com", + "||phuquocservices.com", + "||picacomiccn.com", + ".picidae.net", + "||img*.picturedip.com", + "picturesocial.com", + "||pin-cong.com", + ".pin6.com", + "||pin6.com", + ".ping.fm", + "||ping.fm", + "||pinimg.com", + ".pinkrod.com", + "||pinoy-n.com", + "||pinterest.at", + "||pinterest.co.kr", + "||pinterest.co.uk", + ".pinterest.com", + "||pinterest.com", + "||pinterest.de", + "||pinterest.dk", + "||pinterest.fr", + "||pinterest.jp", + "||pinterest.nl", + "||pinterest.se", + ".pipii.tv", + ".piposay.com", + "piraattilahti.org", + ".piring.com", + "||pixelqi.com", + "||css.pixnet.in", + "||pixnet.net", + ".pixnet.net", + ".pk.com", + "||placemix.com", + "|http://pictures.playboy.com", + "||playboy.com", + ".playboyplus.com", + "||playboyplus.com", + "||player.fm", + ".playno1.com", + "||playno1.com", + "||playpcesor.com", + "plays.com.tw", + "||m.plixi.com", + "plm.org.hk", + "plunder.com", + ".plurk.com", + "||plurk.com", + ".plus28.com", + ".plusbb.com", + ".pmatehunter.com", + "|http://pmatehunter.com", + ".pmates.com", + "||po2b.com", + "pobieramy.top", + "||podictionary.com", + ".pokerstars.com", + "||pokerstars.com", + ".pokerstars.net", + "zh.pokerstrategy.com", + "politicalchina.org", + "politicalconsultation.org", + ".politiscales.net", + "||poloniex.com", + ".polymerhk.com", + "|http://polymerhk.com", + ".popo.tw", + "||popvote.hk", + "popyard.com", + "||popyard.org", + ".porn.com", + ".porn2.com", + ".porn5.com", + ".pornbase.org", + ".pornerbros.com", + "||pornhd.com", + ".pornhost.com", + ".pornhub.com", + "||pornhub.com", + ".pornhubdeutsch.net", + "|http://pornhubdeutsch.net", + "||pornmm.net", + ".pornoxo.com", + ".pornrapidshare.com", + "||pornrapidshare.com", + ".pornsharing.com", + "|http://pornsharing.com", + ".pornsocket.com", + ".pornstarclub.com", + "||pornstarclub.com", + ".porntube.com", + ".porntubenews.com", + ".porntvblog.com", + "||porntvblog.com", + ".pornvisit.com", + ".portablevpn.nl", + "||poskotanews.com", + ".post01.com", + ".post76.com", + "||post76.com", + ".post852.com", + "postadult.com", + ".postimg.org", + "||potvpn.com", + "||powercx.com", + ".powerphoto.org", + "||www.powerpointninja.com", + "||presidentlee.tw", + "||cdn.printfriendly.com", + ".pritunl.com", + "provpnaccounts.com", + "||provpnaccounts.com", + ".proxfree.com", + "||proxfree.com", + "proxyanonimo.es", + ".proxynetwork.org.uk", + "||proxynetwork.org.uk", + "||pts.org.tw", + ".pttvan.org", + "pubu.com.tw", + "puffinbrowser.com", + "pureinsight.org", + ".pushchinawall.com", + ".putty.org", + "||putty.org", + "||calebelston.com", + "||blog.fizzik.com", + "||nf.id.au", + "||sogrady.me", + "||vatn.org", + "||ventureswell.com", + "||whereiswerner.com", + ".power.com", + "||power.com", + "powerapple.com", + "||powerapple.com", + "||abc.pp.ru", + "heix.pp.ru", + "||prayforchina.net", + "||premeforwindows7.com", + "||presentationzen.com", + "||prestige-av.com", + "prisoner-state-secret-journal-premier", + ".prisoneralert.com", + "||pritunl.com", + "||privacybox.de", + ".private.com/home", + "||privateinternetaccess.com", + "privatepaste.com", + "||privatepaste.com", + "privatetunnel.com", + "||privatetunnel.com", + "||privatevpn.com", + "||procopytips.com", + "provideocoalition.com", + "||prosiben.de", + "proxifier.com", + "api.proxlet.com", + "||proxomitron.info", + ".proxpn.com", + "||proxpn.com", + ".proxylist.org.uk", + "||proxylist.org.uk", + ".proxypy.net", + "||proxypy.net", + "proxyroad.com", + ".proxytunnel.net", + "||proyectoclubes.com", + "prozz.net", + "psblog.name", + "||psblog.name", + "||psiphon.ca", + ".psiphon3.com", + "||psiphon3.com", + ".psiphontoday.com", + ".ptt.cc", + "||ptt.cc", + ".puffstore.com", + ".puuko.com", + "||pullfolio.com", + ".punyu.com/puny", + "||pureconcepts.net", + "||pureinsight.org", + "||purepdf.com", + "||purevpn.com", + ".purplelotus.org", + ".pursuestar.com", + "||pursuestar.com", + ".pussyspace.com", + ".putihome.org", + ".putlocker.com/file", + "pwned.com", + "python.com", + ".python.com.tw", + "|http://python.com.tw", + "pythonhackers.com/p", + "ss.pythonic.life/", + ".qanote.com", + "||qanote.com", + ".qgirl.com.tw", + "||qiandao.today", + ".qi-gong.me", + "||qi-gong.me", + "||qiangyou.org", + ".qidian.ca", + ".qienkuen.org", + "||qienkuen.org", + "||qiwen.lu", + "qixianglu.cn", + "bbs.qmzdd.com", + ".qkshare.com", + "qoos.com", + "||qoos.com", + "blog.qooza.hk/dafengqixi", + "||efksoft.com", + "||qstatus.com", + "||qtweeter.com", + "||qtrac.eu", + ".quannengshen.org", + "|http://quannengshen.org", + "quantumbooter.net", + "||quitccp.net", + ".quitccp.net", + "||quitccp.org", + ".quitccp.org", + ".quora.com/Chinas-Future", + ".quran.com", + "|http://quran.com", + ".quranexplorer.com", + "qusi8.net", + ".qvodzy.org", + "nemesis2.qx.net/pages/MyEnTunnel", + "qxbbs.org", + ".ra.gg", + "|http://ra.gg/", + ".radicalparty.org", + "||rael.org", + "radicalparty.org", + "radioaustralia.net.au", + ".radiohilight.net", + "||radiohilight.net", + "opml.radiotime.com", + "||radiovaticana.org", + "||radiovncr.com", + "||raggedbanner.com", + "||raidcall.com.tw", + ".raidtalk.com.tw", + ".rainbowplan.org/bbs", + "|https://raindrop.io/", + ".raizoji.or.jp", + "|http://raizoji.or.jp", + "rangwang.biz", + "rangzen.com", + "rangzen.net", + "rangzen.org", + "|http://blog.ranxiang.com/", + "ranyunfei.com", + "||ranyunfei.com", + ".rapbull.net", + "|http://rapidgator.net/", + "||rapidmoviez.com", + "rapidvpn.com", + "||rapidvpn.com", + ".raremovie.cc", + "|http://raremovie.cc", + ".raremovie.net", + "|http://raremovie.net", + "||rawgit.com", + "||rawgithub.com", + "||razyboard.com", + "rcinet.ca", + ".read100.com", + ".readingtimes.com.tw", + "||readingtimes.com.tw", + "||readmoo.com", + ".readydown.com", + "|http://readydown.com", + ".realcourage.org", + ".realitykings.com", + "||realitykings.com", + ".realraptalk.com", + ".realsexpass.com", + ".recordhistory.org", + ".recovery.org.tw", + "|http://online.recoveryversion.org", + "||recoveryversion.com.tw", + "||red-lang.org", + "redballoonsolidarity.org", + ".redchinacn.net", + "|http://redchinacn.net", + "redchinacn.org", + "redtube.com", + "referer.us", + "||referer.us", + "||reflectivecode.com", + "relaxbbs.com", + ".relay.com.tw", + ".releaseinternational.org", + "religioustolerance.org", + "renminbao.com", + "||renminbao.com", + ".renyurenquan.org", + "||renyurenquan.org", + "|http://certificate.revocationcheck.com", + "subacme.rerouted.org", + "||resilio.com", + ".reuters.com", + "||reuters.com", + "||reutersmedia.net", + ".revleft.com", + "retweetist.com", + "||retweetrank.com", + "revver.com", + ".rfa.org", + "||rfa.org", + ".rfachina.com", + ".rfamobile.org", + "rfaweb.org", + "||rferl.org", + ".rfi.fr", + "||rfi.fr", + "|http://rfi.my/", + "|http://vds.rightster.com/", + ".rigpa.org", + ".rileyguide.com", + "riku.me/", + ".ritouki.jp", + "||ritter.vg", + ".rlwlw.com", + "||rlwlw.com", + ".rmjdw.com", + ".rmjdw132.info", + ".roadshow.hk", + ".roboforex.com", + "||robustnessiskey.com", + "||rocket-inc.net", + "|http://www2.rocketbbs.com/11/bbs.cgi?id=5mus", + "|http://www2.rocketbbs.com/11/bbs.cgi?id=freemgl", + "||rojo.com", + "||ronjoneswriter.com", + "||rolia.net", + ".roodo.com", + ".rosechina.net", + ".rotten.com", + ".rsf.org", + "||rsf.org", + ".rsf-chinese.org", + "||rsf-chinese.org", + ".rsgamen.org", + "||phosphation13.rssing.com", + ".rssmeme.com", + "||rssmeme.com", + "||rtalabel.org", + ".rthk.hk", + "|http://rthk.hk", + ".rthk.org.hk", + "|http://rthk.org.hk", + ".rti.org.tw", + "||rti.org.tw", + ".rtycminnesota.org", + ".ruanyifeng.com/blog*some_ways_to_break_the_great_firewall", + "rukor.org", + ".rushbee.com", + ".ruten.com.tw", + "rutube.ru", + ".ruyiseek.com", + ".rxhj.net", + "|http://rxhj.net", + ".s1s1s1.com", + "||s-cute.com", + ".s-dragon.org", + "||s1heng.com", + "|http://www.s4miniarchive.com", + "||s8forum.com", + "cdn1.lp.saboom.com", + "||sacks.com", + "sacom.hk", + "||sacom.hk", + "||sadpanda.us", + ".safervpn.com", + "||safervpn.com", + ".saintyculture.com", + "|http://saintyculture.com", + ".saiq.me", + "||saiq.me", + "||sakuralive.com", + ".sakya.org", + ".salvation.org.hk", + "||salvation.org.hk", + ".samair.ru/proxy/type-01", + ".sambhota.org", + ".cn.sandscotaicentral.com", + "|http://cn.sandscotaicentral.com", + ".sanmin.com.tw", + "sapikachu.net", + "savemedia.com", + "savetibet.de", + "savetibet.fr", + "savetibet.nl", + ".savetibet.org", + "||savetibet.org", + "savetibet.ru", + ".savetibetstore.org", + "||savetibetstore.org", + "savevid.com", + "||say2.info", + ".sbme.me", + "|http://sbme.me", + ".sbs.com.au/yourlanguage", + ".scasino.com", + "|http://www.sciencemag.org/content/344/6187/953", + ".sciencenets.com", + ".scmp.com", + ".scmpchinese.com", + "||scramble.io", + ".scribd.com", + "||scribd.com", + "||scriptspot.com", + "seapuff.com", + "domainhelp.search.com", + ".searchtruth.com", + "secretchina.com", + "||secretchina.com", + "||secretgarden.no", + ".secretsline.biz", + "||secretsline.biz", + "||securetunnel.com", + "securityinabox.org", + "|https://securityinabox.org", + ".securitykiss.com", + "||securitykiss.com", + "||seed4.me", + "news.seehua.com", + "seesmic.com", + "||seevpn.com", + "||seezone.net", + "sejie.com", + ".sendspace.com", + "|http://tweets.seraph.me/", + "sesawe.net", + "||sesawe.net", + ".sesawe.org", + "||sethwklein.net", + ".setn.com", + ".settv.com.tw", + "forum.setty.com.tw", + ".sevenload.com", + "||sevenload.com", + ".sex.com", + ".sex-11.com", + "||sex3.com", + "||sex8.cc", + ".sexandsubmission.com", + ".sexbot.com", + ".sexhu.com", + ".sexhuang.com", + "sexinsex.net", + "||sexinsex.net", + ".sextvx.com", + "67.220.91.15", + "67.220.91.18", + "67.220.91.23", + "|http://*.sf.net", + ".sfileydy.com", + "||sfshibao.com", + ".sftindia.org", + ".sftuk.org", + "||sftuk.org", + "||shadeyouvpn.com", + "shadow.ma", + ".shadowsky.xyz", + ".shadowsocks.asia", + "||www.shadowsocks.com", + ".shadowsocks.com", + "||shadowsocks.com.hk", + ".shadowsocks.org", + "||shadowsocks.org", + "||shadowsocks-r.com", + "|http://cn.shafaqna.com", + ".shambalapost.com", + ".shambhalasun.com", + ".shangfang.org", + "||shangfang.org", + "shapeservices.com", + ".sharebee.com", + "||sharecool.org", + "sharpdaily.com.hk", + "||sharpdaily.com.hk", + ".sharpdaily.hk", + ".sharpdaily.tw", + ".shat-tibet.com", + "sheikyermami.com", + ".shellfire.de", + "||shellfire.de", + ".shenshou.org", + "shenyun.com", + "shenyunperformingarts.org", + "||shenyunperformingarts.org", + "shenzhoufilm.com", + "||shenzhoufilm.com", + "||sherabgyaltsen.com", + ".shiatv.net", + ".shicheng.org", + "shinychan.com", + "shipcamouflage.com", + ".shireyishunjian.com", + ".shitaotv.org", + "||shixiao.org", + "||shizhao.org", + "shizhao.org", + "shkspr.mobi/dabr", + "||shodanhq.com", + "||shooshtime.com", + ".shop2000.com.tw", + ".shopping.com", + ".showhaotu.com", + ".showtime.jp", + ".shutterstock.com", + "||shutterstock.com", + "ch.shvoong.com", + ".shwchurch.org", + "||www.shwchurch.org", + ".shwchurch3.com", + "|http://shwchurch3.com", + ".siddharthasintent.org", + "||sidelinesnews.com", + ".sidelinessportseatery.com", + ".sijihuisuo.club", + ".sijihuisuo.com", + ".silkbook.com", + "||simbolostwitter.com", + "simplecd.org", + "||simplecd.org", + "@@||simplecd.me", + "simpleproductivityblog.com", + "bbs.sina.com/", + "bbs.sina.com%2F", + "blog.sina.com.tw", + "dailynews.sina.com/", + "dailynews.sina.com%2F", + "forum.sina.com.hk", + "home.sina.com", + "||magazines.sina.com.tw", + "news.sina.com.hk", + "news.sina.com.tw", + "news.sinchew.com.my", + ".sinchew.com.my/node/", + ".sinchew.com.my/taxonomy/term", + ".singaporepools.com.sg", + "||singaporepools.com.sg", + ".singfortibet.com", + ".singpao.com.hk", + "singtao.com", + "||singtao.com", + "news.singtao.ca", + ".singtaousa.com", + "||singtaousa.com", + "sino-monthly.com", + "||sinocast.com", + "sinocism.com", + "sinomontreal.ca", + ".sinonet.ca", + ".sinopitt.info", + ".sinoants.com", + "||sinoants.com", + ".sinoquebec.com", + ".sierrafriendsoftibet.org", + "sis.xxx", + "||sis001.com", + "sis001.us", + ".site2unblock.com", + "||site90.net", + ".sitebro.tw", + "||sitekreator.com", + "||siteks.uk.to", + "||sitemaps.org", + ".sjrt.org", + "|http://sjrt.org", + "||sjum.cn", + "||sketchappsources.com", + "||skimtube.com", + "||skybet.com", + "|http://users.skynet.be/reves/tibethome.html", + ".skyking.com.tw", + "bbs.skykiwi.com", + "|http://www.skype.com/intl/", + "|http://www.skype.com/zh-Hant", + "||skyvegas.com", + ".xskywalker.com", + "||xskywalker.com", + "||skyxvpn.com", + "m.slandr.net", + ".slaytizle.com", + ".sleazydream.com", + "||slheng.com", + "||slideshare.net", + "forum.slime.com.tw", + ".slinkset.com", + "||slickvpn.com", + ".slutload.com", + "||smartdnsproxy.com", + ".smarthide.com", + "||app.smartmailcloud.com", + "smchbooks.com", + ".smh.com.au/world/death-of-chinese-playboy-leaves-fresh-scratches-in-party-paintwork-20120903-25a8v", + "smhric.org", + ".smith.edu/dalailama", + ".smyxy.org", + "||snapchat.com", + ".snaptu.com", + "||snaptu.com", + "||sndcdn.com", + "sneakme.net", + "snowlionpub.com", + "home.so-net.net.tw/yisa_tsai", + "||soc.mil", + ".sockscap64.com", + "||sockslist.net", + ".socrec.org", + "|http://socrec.org", + ".sod.co.jp", + ".softether.org", + "||softether.org", + ".softether-download.com", + "||softether-download.com", + "||cdn.softlayer.net", + "||sogclub.com", + "sohcradio.com", + "||sohcradio.com", + ".sokmil.com", + "||sorting-algorithms.com", + ".sostibet.org", + ".soumo.info", + "||soup.io", + "@@||static.soup.io", + ".sobees.com", + "||sobees.com", + "socialwhale.com", + ".softether.co.jp", + "||softwarebychuck.com", + "blog.sogoo.org", + "soh.tw", + "||soh.tw", + "sohfrance.org", + "||sohfrance.org", + "chinese.soifind.com", + "sokamonline.com", + ".solidaritetibet.org", + ".solidfiles.com", + "||somee.com", + ".songjianjun.com", + "||songjianjun.com", + ".sonicbbs.cc", + ".sonidodelaesperanza.org", + ".sopcast.com", + ".sopcast.org", + ".sorazone.net", + "||sos.org", + "bbs.sou-tong.org", + ".soubory.com", + "|http://soubory.com", + ".soul-plus.net", + ".soulcaliburhentai.net", + "||soulcaliburhentai.net", + "||soundcloud.com", + ".soundofhope.kr", + "soundofhope.org", + "||soundofhope.org", + "||soupofmedia.com", + "|http://sourceforge.net/p*/shadowsocksgui/", + ".sourcewadio.com", + "southnews.com.tw", + "sowers.org.hk", + "||wlx.sowiki.net", + "||spankbang.com", + ".spankingtube.com", + ".spankwire.com", + "||spb.com", + "||speakerdeck.com", + "||speedify.com", + "spem.at", + "||spencertipping.com", + "||spicevpn.com", + ".spideroak.com", + "||spideroak.com", + ".spike.com", + ".spotflux.com", + "||spotflux.com", + ".spring4u.info", + "|http://spring4u.info", + "||sproutcore.com", + "||sproxy.info", + "||srocket.us", + ".ss-link.com", + "||ss-link.com", + ".ssglobal.co/wp", + "|http://ssglobal.co", + ".ssglobal.me", + "||ssh91.com", + ".sspro.ml", + "|http://sspro.ml", + ".ssrshare.com", + "||ssrshare.com", + "||sss.camp", + "||sstmlt.moe", + "sstmlt.net", + "||sstmlt.net", + "|http://stackoverflow.com/users/895245", + ".stage64.hk", + "||stage64.hk", + "||standupfortibet.org", + "stanford.edu/group/falun", + "usinfo.state.gov", + "||statueofdemocracy.org", + ".starfishfx.com", + ".starp2p.com", + "||starp2p.com", + ".startpage.com", + "||startpage.com", + ".startuplivingchina.com", + "|http://startuplivingchina.com", + "||static-economist.com", + "||stc.com.sa", + "||steel-storm.com", + ".steganos.com", + "||steganos.com", + ".steganos.net", + ".stepchina.com", + "ny.stgloballink.com", + "hd.stheadline.com/news/realtime", + "sthoo.com", + "||sthoo.com", + ".stickam.com", + "stickeraction.com/sesawe", + ".stileproject.com", + ".sto.cc", + ".stoporganharvesting.org", + "||storagenewsletter.com", + ".storm.mg", + "||storm.mg", + ".stoptibetcrisis.net", + "||stoptibetcrisis.net", + "||storify.com", + ".stormmediagroup.com", + "||stoweboyd.com", + "stranabg.com", + "||straplessdildo.com", + "||streamingthe.net", + "streema.com/tv/NTDTV_Chinese", + "cn.streetvoice.com/article", + "cn.streetvoice.com/diary", + "cn2.streetvoice.com", + "tw.streetvoice.com", + ".strikingly.com", + "||strongvpn.com", + ".strongwindpress.com", + ".student.tw/db", + "||studentsforafreetibet.org", + "||stumbleupon.com", + "stupidvideos.com", + ".successfn.com", + "panamapapers.sueddeutsche.de", + ".sugarsync.com", + "||sugarsync.com", + ".sugobbs.com", + "||sugumiru18.com", + "||suissl.com", + "summify.com", + ".sumrando.com", + "||sumrando.com", + "sun1911.com", + ".sunporno.com", + "||sunmedia.ca", + "||sunporno.com", + ".sunskyforum.com", + ".sunta.com.tw", + ".sunvpn.net", + ".suoluo.org", + ".superfreevpn.com", + ".supervpn.net", + "||supervpn.net", + ".superzooi.com", + "|http://superzooi.com", + ".suppig.net", + ".suprememastertv.com", + "|http://suprememastertv.com", + ".surfeasy.com", + "||surfeasy.com", + ".surfeasy.com.au", + "|http://surfeasy.com.au", + "||surrenderat20.net", + ".suyangg.com", + "|http://suyangg.com", + ".svsfx.com", + ".swissvpn.net", + "||swissvpn.net", + "switchvpn.net", + "||switchvpn.net", + ".sydneytoday.com", + "||sydneytoday.com", + ".sylfoundation.org", + "||syncback.com", + "sysresccd.org", + ".sytes.net", + "blog.syx86.com/2009/09/puff", + "blog.syx86.cn/2009/09/puff", + ".szbbs.net", + ".szetowah.org.hk", + "||t-g.com", + ".t35.com", + ".t66y.com", + "||t66y.com", + ".taa-usa.org", + "|http://taa-usa.org", + ".taaze.tw", + "||taaze.tw", + "|http://www.tablesgenerator.com/", + "tabtter.jp", + ".tacem.org", + ".taconet.com.tw", + "||taedp.org.tw", + ".tafm.org", + ".tagwa.org.au", + "tagwalk.com", + "||tagwalk.com", + "tahr.org.tw", + ".taipeisociety.org", + "||taipeisociety.org", + ".taiwanbible.com", + ".taiwancon.com", + ".taiwandaily.net", + "||taiwandaily.net", + ".taiwandc.org", + ".taiwanjustice.com", + "taiwankiss.com", + "taiwannation.com", + "taiwannation.com.tw", + "||taiwanncf.org.tw", + "||taiwannews.com.tw", + "|http://www.taiwanonline.cc/", + "taiwantp.net", + "||taiwantt.org.tw", + "taiwanus.net", + "taiwanyes.com", + "taiwan-sex.com", + ".talk853.com", + ".talkboxapp.com", + "||talkboxapp.com", + ".talkonly.net", + "||talkonly.net", + "||tamiaode.tk", + "||tanc.org", + "tangben.com", + ".tangren.us", + ".taoism.net", + "|http://taoism.net", + ".taolun.info", + "||taolun.info", + ".tapatalk.com", + "||tapatalk.com", + "blog.taragana.com", + ".tascn.com.au", + "||taup.net", + "|http://www.taup.org.tw", + ".taweet.com", + "||taweet.com", + ".tbcollege.org", + "||tbcollege.org", + ".tbi.org.hk", + ".tbicn.org", + ".tbjyt.org", + "||tbpic.info", + ".tbrc.org", + "tbs-rainbow.org", + ".tbsec.org", + "||tbsec.org", + "tbskkinabalu.page.tl", + ".tbsmalaysia.org", + ".tbsn.org", + "||tbsn.org", + ".tbsseattle.org", + ".tbssqh.org", + "|http://tbssqh.org", + "tbswd.org", + ".tbtemple.org.uk", + ".tbthouston.org", + ".tccwonline.org", + ".tcewf.org", + "tchrd.org", + "tcnynj.org", + "||tcpspeed.co", + ".tcpspeed.com", + "||tcpspeed.com", + ".tcsofbc.org", + ".tcsovi.org", + ".tdm.com.mo", + "teamamericany.com", + "||techviz.net", + "||teck.in", + ".teeniefuck.net", + "teensinasia.com", + ".telecomspace.com", + "||telegraph.co.uk", + ".tenacy.com", + "||tenzinpalmo.com", + ".tew.org", + ".thaicn.com", + "||theatrum-belli.com", + "theblemish.com", + "||thebcomplex.com", + ".thebobs.com", + "||thebobs.com", + ".thechinabeat.org", + "|http://www.thechinastory.org/yearbooks/yearbook-2012/", + ".thedalailamamovie.com", + "|http://thedalailamamovie.com", + "||thedw.us", + "thefrontier.hk/tf", + "cn.thegay.com", + "|http://thegioitinhoc.vn/", + ".thegly.com", + ".thehots.info", + "thehousenews.com", + "||thehun.net", + ".theinitium.com", + "||theinitium.com", + ".thenewslens.com", + "||thenewslens.com", + ".thepiratebay.org", + "||thepiratebay.org", + "||theportalwiki.com", + "thereallove.kr", + "therock.net.nz", + "thespeeder.com", + "||thestandnews.com", + "thetibetcenter.org", + "thetibetconnection.org", + ".thetibetmuseum.org", + ".thetibetpost.com", + "||thetibetpost.com", + "||thetinhat.com", + "thetrotskymovie.com", + "thevivekspot.com", + "||thewgo.org", + ".theync.com", + "|http://theync.com", + ".thinkingtaiwan.com", + ".thisav.com", + "|http://thisav.com", + ".thlib.org", + "||thomasbernhard.org", + ".thongdreams.com", + "threatchaos.com", + "||throughnightsfire.com", + ".thumbzilla.com", + "||thywords.com", + ".thywords.com.tw", + "tiananmenmother.org", + ".tiananmenduizhi.com", + "||tiananmenduizhi.com", + "||tiananmenuniv.com", + "||tiananmenuniv.net", + "||tiandixing.org", + ".tianhuayuan.com", + ".tianlawoffice.com", + "||tianti.io", + "tiantibooks.org", + "||tiantibooks.org", + "tianyantong.org.cn", + ".tianzhu.org", + ".tibet.at", + "tibet.ca", + ".tibet.com", + "||tibet.com", + "tibet.fr", + ".tibet.net", + "||tibet.net", + "tibet.nu", + ".tibet.org", + "||tibet.org", + ".tibet.sk", + "tibet.org.tw", + ".tibet.to", + ".tibet-envoy.eu", + "||tibet-envoy.eu", + ".tibet-foundation.org", + ".tibet-house-trust.co.uk", + "tibet-info.net", + "tibet-initiative.de", + "||tibet-initiative.de", + ".tibet-munich.de", + ".tibet3rdpole.org", + "|http://tibet3rdpole.org", + "tibetaction.net", + "||tibetaction.net", + ".tibetaid.org", + "tibetalk.com", + ".tibetan.fr", + "tibetan-alliance.org", + ".tibetanarts.org", + ".tibetanbuddhistinstitute.org", + "|http://tibetanbuddhistinstitute.org", + "tibetancommunity.org", + ".tibetanjournal.com", + ".tibetanlanguage.org", + ".tibetanliberation.org", + "||tibetanliberation.org", + ".tibetcollection.com", + ".tibetanaidproject.org", + ".tibetancommunityuk.net", + "|http://tibetancommunityuk.net", + "tibetanculture.org", + "tibetanfeministcollective.org", + ".tibetanpaintings.com", + ".tibetanphotoproject.com", + ".tibetanpoliticalreview.org", + ".tibetanreview.net", + "|http://tibetansports.org", + ".tibetanwomen.org", + "|http://tibetanwomen.org", + ".tibetanyouth.org", + ".tibetanyouthcongress.org", + "||tibetanyouthcongress.org", + ".tibetcharity.dk", + "tibetcharity.in", + ".tibetchild.org", + ".tibetcity.com", + ".tibetcorps.org", + ".tibetexpress.net", + "|http://tibetexpress.net", + "tibetfocus.com", + "tibetfund.org", + ".tibetgermany.com", + "||tibetgermany.de", + ".tibethaus.com", + ".tibetheritagefund.org", + "tibethouse.jp", + "tibethouse.org", + "||tibethouse.us", + ".tibetinfonet.net", + ".tibetjustice.org", + ".tibetkomite.dk", + "|http://tibetmuseum.org", + "tibetnetwork.org", + "||tibetnetwork.org", + ".tibetoffice.ch", + "|http://tibetoffice.ch", + "tibetoffice.eu", + "tibetoffice.org", + "tibetonline.com", + "||tibetonline.com", + ".tibetoffice.com.au", + "|http://tibetoffice.com.au", + "||tibetonline.tv", + ".tibetonline.tv", + ".tibetoralhistory.org", + "|http://tibetoralhistory.org", + ".tibetpolicy.eu", + ".tibetrelieffund.co.uk", + "tibetsites.com", + ".tibetsociety.com", + "||tibetsociety.com", + ".tibetsun.com", + ".tibetsupportgroup.org", + "|http://tibetsupportgroup.org", + ".tibetswiss.ch", + ".tibettelegraph.com", + "tibettimes.net", + "||tibetwrites.org", + ".ticket.com.tw", + ".tigervpn.com", + "||tigervpn.com", + ".timdir.com", + "|http://timdir.com", + ".time.com", + "|http://time.com", + ".timsah.com", + "||blog.tiney.com", + "tintuc101.com", + ".tiny.cc", + "|http://tiny.cc", + "tinychat.com", + "||tinypaste.com", + ".tistory.com", + "||tkcs-collins.com", + ".tmagazine.com", + "||tmagazine.com", + ".tmdfish.com", + "|http://tmi.me", + ".tmpp.org", + "|http://tmpp.org", + ".tnaflix.com", + "||tnaflix.com", + ".tngrnow.com", + ".tngrnow.net", + ".tnp.org", + "|http://tnp.org", + ".to-porno.com", + "||to-porno.com", + "togetter.com", + ".tokyo-247.com", + ".tokyo-hot.com", + "||tokyo-porn-tube.com", + "||tokyocn.com", + "tw.tomonews.net", + ".tongil.or.kr", + ".tono-oka.jp", + "tonyyan.net", + ".toodoc.com", + "toonel.net", + "top81.ws", + ".topnews.in", + ".toppornsites.com", + "|http://toppornsites.com", + ".torguard.net", + "||torguard.net", + "||top.tv", + ".topshareware.com", + ".topsy.com", + "||topsy.com", + "||toptip.ca", + "tora.to", + ".torcn.com", + ".torproject.org", + "||torproject.org", + "torrentprivacy.com", + "||torrentprivacy.com", + "|http://torrentproject.se", + "||torrenty.org", + "||torrentz.eu", + "||torvpn.com", + "||totalvpn.com", + ".toutiaoabc.com", + "towngain.com", + "toypark.in", + "toytractorshow.com", + ".tparents.org", + ".tpi.org.tw", + "||tpi.org.tw", + "traffichaus.com", + "||transparency.org", + "||treemall.com.tw", + "trendsmap.com", + "||trendsmap.com", + ".trialofccp.org", + "||trialofccp.org", + ".trimondi.de/SDLE", + ".trouw.nl", + "|http://trouw.nl", + ".trt.net.tr", + "trtc.com.tw", + ".truebuddha-md.org", + "|http://truebuddha-md.org", + "trulyergonomic.com", + ".truth101.co.tv", + "|http://truth101.co.tv", + ".truthontour.org", + "|http://truthontour.org", + ".truveo.com", + ".tsctv.net", + ".tsemtulku.com", + "tsquare.tv", + ".tsu.org.tw", + "tsunagarumon.com", + ".tsctv.net", + "||tt-rss.org", + "||tt1069.com", + ".tttan.com", + "||tttan.com", + "bb.ttv.com.tw/bb", + "tu8964.com", + ".tubaholic.com", + ".tube.com", + "tube8.com", + "||tube8.com", + ".tube911.com", + "||tube911.com", + ".tubecup.com", + ".tubegals.com", + ".tubeislam.com", + "|http://tubeislam.com", + ".tubestack.com", + "||tubewolf.com", + ".tuibeitu.net", + "tuidang.net", + ".tuidang.org", + "||tuidang.org", + ".tuidang.se", + "bbs.tuitui.info", + ".tumutanzi.com", + "|http://tumutanzi.com", + "||tumview.com", + ".tunein.com", + "|http://tunein.com", + "||tunnelbear.com", + ".tunnelr.com", + "||tunnelr.com", + ".tuo8.blue", + "||tuo8.blue", + ".tuo8.cc", + ".tuo8.club", + "||tuo8.club", + ".tuo8.fit", + ".tuo8.hk", + ".tuo8.in", + ".tuo8.ninja", + ".tuo8.org", + "||tuo8.fit", + "||tuo8.org", + ".tuo8.pw", + "|http://tuo8.pw", + "||tuo8.red", + ".tuo8.space", + "tuitwit.com", + ".turansam.org", + ".turbobit.net", + "|http://turbobit.net", + ".turbohide.com", + "||turbohide.com", + ".tushycash.com", + "|http://tushycash.com", + "||app.tutanota.com", + ".tuvpn.com", + "||tuvpn.com", + "|http://tuzaijidi.com", + "|http://*.tuzaijidi.com", + ".tw01.org", + "|http://tw01.org", + ".tumblr.com", + "||tumblr.com", + "||lecloud.net", + "|http://cosmic.monar.ch", + "||slutmoonbeam.com", + "|http://blog.soylent.com", + ".tv.com", + "|http://tv.com", + "tvants.com", + "forum.tvb.com", + "news.tvb.com/list/world", + "news.tvb.com/local", + "news.tvbs.com.tw", + ".tvboxnow.com", + "|http://tvboxnow.com/", + "tvider.com", + ".tvmost.com.hk", + ".tvplayvideos.com", + "||tvunetworks.com", + ".tw-blog.com", + "|https://tw-blog.com", + ".tw-npo.org", + ".twaitter.com", + "twapperkeeper.com", + "||twapperkeeper.com", + "||twaud.io", + ".twaud.io", + ".twavi.com", + ".twbbs.net.tw", + "twbbs.org", + "twbbs.tw", + "||twblogger.com", + "tweepmag.com", + ".tweepml.org", + "||tweepml.org", + ".tweetbackup.com", + "||tweetbackup.com", + "tweetboard.com", + "||tweetboard.com", + ".tweetboner.biz", + "||tweetboner.biz", + ".tweetcs.com", + "|http://tweetcs.com", + "|http://deck.ly", + "||mtw.tl", + "||tweetedtimes.com", + "||tweetmylast.fm", + "tweetphoto.com", + "||tweetphoto.com", + "||tweetrans.com", + "tweetree.com", + "||tweetree.com", + ".tweettunnel.com", + "||tweettunnel.com", + "||tweetwally.com", + "tweetymail.com", + "||twelve.today", + ".tweez.net", + "|http://tweez.net", + "||twftp.org", + "||twgreatdaily.com", + "twibase.com", + ".twibble.de", + "||twibble.de", + "twibbon.com", + "||twibs.com", + ".twicountry.org", + "|http://twicountry.org", + "twicsy.com", + ".twiends.com", + "|http://twiends.com", + ".twifan.com", + "|http://twifan.com", + "twiffo.com", + "||twiffo.com", + ".twilightsex.com", + "twilog.org", + "twimbow.com", + "||twindexx.com", + "twipple.jp", + "||twipple.jp", + "||twip.me", + "twishort.com", + "||twishort.com", + "twistar.cc", + "||twister.net.co", + "||twisterio.com", + "twisternow.com", + "twistory.net", + "twitbrowser.net", + "||twitcause.com", + "||twitgether.com", + "||twiggit.org", + "twitgoo.com", + "twitiq.com", + "||twitiq.com", + ".twitlonger.com", + "||twitlonger.com", + "|http://tl.gd/", + "twitmania.com", + "twitoaster.com", + "||twitoaster.com", + "||twitonmsn.com", + ".twit2d.com", + "||twit2d.com", + ".twitstat.com", + "||twitstat.com", + "||firstfivefollowers.com", + "||retweeteffect.com", + "||tweeplike.me", + "||tweepguide.com", + "||turbotwitter.com", + ".twitvid.com", + "||twitvid.com", + "|http://twt.tl", + "twittbot.net", + "||ads-twitter.com", + "||twttr.com", + "||twitter4j.org", + ".twittercounter.com", + "||twittercounter.com", + "twitterfeed.com", + ".twittergadget.com", + "||twittergadget.com", + ".twitterkr.com", + "||twitterkr.com", + "||twittermail.com", + "||twitterrific.com", + "twittertim.es", + "||twittertim.es", + "twitthat.com", + "||twitturk.com", + ".twitturly.com", + "||twitturly.com", + ".twitzap.com", + "twiyia.com", + "||twstar.net", + ".twtkr.com", + "|http://twtkr.com", + ".twnorth.org.tw", + "twskype.com", + "twtrland.com", + "twurl.nl", + ".twyac.org", + "||twyac.org", + ".txxx.com", + ".tycool.com", + "||tycool.com", + "||typepad.com", + "@@||www.typepad.com", + "@@||static.typepad.com", + "||blog.expofutures.com", + "||legaltech.law.com", + "||blogs.tampabay.com", + "||contests.twilio.com", + ".embr.in", + "||embr.in", + ".u9un.com", + "||u9un.com", + ".ubddns.org", + "|http://ubddns.org", + "||uberproxy.net", + ".uc-japan.org", + "||uc-japan.org", + ".srcf.ucam.org/salon/", + "|http://china.ucanews.com/", + "||ucdc1998.org", + "|http://hum*.uchicago.edu/faculty/ywang/history", + "||uderzo.it", + ".udn.com", + "||udn.com", + "||udn.com.tw", + "udnbkk.com/bbs", + "||uforadio.com.tw", + "ufreevpn.com", + ".ugo.com", + "||uhdwallpapers.org", + "||uhrp.org", + ".uighur.nl", + "||uighur.nl", + "uighurbiz.net", + ".ulike.net", + "ukcdp.co.uk", + "ukliferadio.co.uk", + "||ukliferadio.co.uk", + "ultravpn.fr", + "||ultravpn.fr", + "ultraxs.com", + "umich.edu/~falun", + "||unblock.cn.com", + ".unblocker.yt", + "unblock-us.com", + "||unblock-us.com", + ".unblockdmm.com", + "|http://unblockdmm.com", + "||unblocksit.es", + "uncyclomedia.org", + ".uncyclopedia.hk/wiki", + "|http://uncyclopedia.hk", + "|http://uncyclopedia.tw", + "underwoodammo.com", + "||underwoodammo.com", + "||unholyknight.com", + ".uni.cc", + "||cldr.unicode.org", + ".unification.net", + ".unification.org.tw", + "||unirule.cloud", + ".unitedsocialpress.com", + ".unix100.com", + "||unknownspace.org", + ".unodedos.com", + "unpo.org", + ".untraceable.us", + "|http://untraceable.us", + "||uocn.org", + "tor.updatestar.com", + ".upholdjustice.org", + ".upload4u.info", + "uploaded.net/file", + "|http://uploaded.net/file", + "|http://uploaded.to/file", + ".uploadstation.com/file", + ".upmedia.mg", + ".upornia.com", + "|http://upornia.com", + "||uproxy.org", + "|http://tor.cn.uptodown.com/", + ".upwill.org", + "ur7s.com", + "||urbansurvival.com", + "myshare.url.com.tw/", + "||urlborg.com", + "||urlparser.com", + "us.to", + "||usacn.com", + ".usaip.eu", + "||usaip.eu", + "dalailama.usc.edu", + "iipdigital.usembassy.gov", + "||usfk.mil", + "||usma.edu", + "||usmc.mil", + ".usocctn.com", + "|http://tarr.uspto.gov/", + "||tsdr.uspto.gov", + ".ustream.tv", + "||ustream.tv", + ".usunitednews.com", + "|http://usunitednews.com", + "usus.cc", + ".utopianpal.com", + "||utopianpal.com", + ".uu-gg.com", + ".uvwxyz.xyz", + "||uvwxyz.xyz", + ".uwants.com", + ".uwants.net", + "uyghur.co.uk", + "|http://uyghur-j.org", + "||uyghuramerican.org", + ".uyghurcanadiansociety.org", + ".uyghurensemble.co.uk", + "||uyghurcongress.org", + ".uyghurpen.org", + ".uyghurpress.com", + ".uyghurstudies.org", + "|http://uyghurstudies.org", + "uygur.org", + "|http://uymaarip.com/", + ".v2ray.com", + "|http://v2ray.com", + ".van001.com", + ".van698.com", + ".vanemu.cn", + ".vanilla-jp.com", + ".vanpeople.com", + "vansky.com", + "||vcf-online.org", + "||vcfbuilder.org", + ".vegasred.com", + ".velkaepocha.sk", + ".venbbs.com", + ".venchina.com", + ".venetianmacao.com", + "||venetianmacao.com", + "veoh.com", + "mysite.verizon.net", + "vermonttibet.org", + ".versavpn.com", + "||versavpn.com", + "||verybs.com", + ".vft.com.tw", + ".viber.com", + "||viber.com", + ".vica.info", + ".victimsofcommunism.org", + "|http://victimsofcommunism.org", + "||vid.me", + "||vidble.com", + "videobam.com", + "||videobam.com", + ".videodetective.com", + ".videomega.tv", + "||videomega.tv", + ".videomo.com", + "videopediaworld.com", + ".videopress.com", + ".vidinfo.org/video", + "vietdaikynguyen.com", + ".vijayatemple.org", + "vimeo.com", + "||vimeo.com", + "||vimperator.org", + "||vincnd.com", + "||vinniev.com", + "|http://www.lib.virginia.edu/area-studies/Tibet/tibet.html", + ".virtualrealporn.com", + "||virtualrealporn.com", + "visibletweets.com", + "|http://ny.visiontimes.com", + ".vital247.org", + "||viu.com", + ".vivahentai4u.net", + ".vivatube.com", + ".vivthomas.com", + "||vivthomas.com", + ".vjav.com", + "||vjav.com", + ".vjmedia.com.hk", + ".vllcs.org", + "|http://vllcs.org", + "||vmixcore.com", + "||vnet.link", + "cn.voa.mobi", + "tw.voa.mobi", + ".voachineseblog.com", + "||voachineseblog.com", + "voagd.com", + ".voacantonese.com", + "||voacantonese.com", + "voachinese.com", + "||voachinese.com", + ".voanews.com", + "||voanews.com", + "voatibetan.com", + "||voatibetan.com", + ".voatibetanenglish.com", + "||voatibetanenglish.com", + ".vocativ.com", + "vocn.tv", + ".vot.org", + "||vot.org", + ".vovo2000.com", + "|http://vovo2000.com", + ".voxer.com", + "||voxer.com", + ".voy.com", + "||vpn.ac", + ".vpn4all.com", + "||vpn4all.com", + ".vpnaccount.org", + "|http://vpnaccount.org", + ".vpnaccounts.com", + "||vpnaccounts.com", + ".vpncomparison.org", + ".vpncup.com", + "||vpncup.com", + "vpnbook.com", + ".vpncoupons.com", + "|http://vpncoupons.com", + ".vpndada.com", + "||vpndada.com", + ".vpnfan.com", + "vpnfire.com", + ".vpnfires.biz", + ".vpnforgame.net", + "||vpnforgame.net", + "||vpngate.jp", + ".vpngate.net", + "||vpngate.net", + ".vpngratis.net", + "vpnhq.com", + ".vpnmaster.com", + "||vpnmaster.com", + ".vpnmentor.com", + "||vpnmentor.com", + ".vpninja.net", + "||vpninja.net", + ".vpnintouch.com", + "||vpnintouch.net", + "vpnjack.com", + "||vpnjack.com", + ".vpnpick.com", + "||vpnpick.com", + "||vpnpop.com", + "||vpnpronet.com", + ".vpnreactor.com", + "||vpnreactor.com", + "||vpnreviewz.com", + ".vpnsecure.me", + "||vpnsecure.me", + ".vpnshazam.com", + "||vpnshazam.com", + ".vpnshieldapp.com", + "||vpnshieldapp.com", + ".vpnsp.com", + ".vpntraffic.com", + ".vpntunnel.com", + "||vpntunnel.com", + ".vpnuk.info", + "||vpnuk.info", + "||vpnunlimitedapp.com", + ".vpnvip.com", + "||vpnvip.com", + ".vpnworldwide.com", + ".vporn.com", + "||vporn.com", + ".vpser.net", + "@@||vpser.net", + "vraiesagesse.net", + ".vrmtr.com", + "||vtunnel.com", + "||vuku.cc", + "lists.w3.org/archives/public", + "||w3schools.com", + "||waffle1999.com", + ".wahas.com", + ".waigaobu.com", + "waikeung.org/php_wind", + ".wailaike.net", + ".waiwaier.com", + "|http://waiwaier.com", + "||wallmama.com", + "wallornot.org", + "||wallpapercasa.com", + ".wallproxy.com", + "@@||wallproxy.com.cn", + "||waltermartin.com", + "||waltermartin.org", + "||www.wan-press.org", + "||wanderinghorse.net", + "||wangafu.net", + "||wangjinbo.org", + ".wangjinbo.org", + "wanglixiong.com", + ".wango.org", + "||wango.org", + "wangruoshui.net", + "www.wangruowang.org", + "want-daily.com", + "wapedia.mobi/zhsimp", + "||waselpro.com", + ".watchinese.com", + ".wattpad.com", + "||wattpad.com", + ".makzhou.warehouse333.com", + "washeng.net", + ".watch8x.com", + "||watchmygf.net", + "||wav.tv", + ".wdf5.com", + ".wearehairy.com", + ".wearn.com", + "||wearn.com", + "|http://hkcoc.weather.com.hk", + "||hudatoriq.web.id", + "||web2project.net", + "webbang.net", + ".webevader.org", + ".webfreer.com", + "weblagu.com", + ".webjb.org", + ".webrush.net", + "webs-tv.net", + ".websitepulse.com/help/testtools.china-test", + "|http://www.websnapr.com", + ".webwarper.net", + "|http://webwarper.net", + "webworkerdaily.com", + ".weekmag.info", + "||wefightcensorship.org", + ".wefong.com", + "weiboleak.com", + ".weihuo.org", + "weijingsheng.org", + ".weiming.info", + "||weiming.info", + "weiquanwang.org", + "|http://weisuo.ws", + ".welovecock.com", + ".wemigrate.org", + "|http://wemigrate.org", + "wengewang.com", + "||wengewang.org", + ".wenhui.ch", + "|http://trans.wenweipo.com/gb/", + ".wenxuecity.com", + "||wenxuecity.com", + ".wenyunchao.com", + "||wenyunchao.com", + ".westca.com", + "||westca.com", + "||westernwolves.com", + ".westkit.net", + "||westpoint.edu", + ".westernshugdensociety.org", + "wetpussygames.com", + ".wetplace.com", + "wexiaobo.org", + "||wexiaobo.org", + "wezhiyong.org", + "||wezone.net", + ".wforum.com", + "||wforum.com/", + ".whatblocked.com", + "||whatblocked.com", + ".wheatseeds.org", + "||wheelockslatin.com", + ".whippedass.com", + ".whoer.net", + "||whoer.net", + "whotalking.com", + "whylover.com", + "||whyx.org", + "|http://zh.ecdm.wikia.com", + "|http://evchk.wikia.com", + "fq.wikia.com", + "cn.uncyclopedia.wikia.com", + "zh.uncyclopedia.wikia.com", + "||wikileaks.ch", + "||wikileaks.com", + "||wikileaks.de", + "||wikileaks.eu", + "||wikileaks.lu", + ".wikileaks.org", + "||wikileaks.org", + "||wikileaks.pl", + ".wikileaks-forum.com", + "wildammo.com", + ".williamhill.com", + "||collateralmurder.com", + "||collateralmurder.org", + "wikilivres.info/wiki/%E9%9B%B6%E5%85%AB%E5%AE%AA%E7%AB%A0", + "||wikimapia.org", + "|http://zh.wikisource.org", + "||zh.wikinews.org", + "||ja.wikipedia.org", + "zh.wikipedia.org", + "zh.m.wikipedia.org", + "|https://zh.m.wikipedia.org", + "|https://zh.wikipedia.org", + "wuu.wikipedia.org", + "|https://wuu.wikipedia.org", + "zh-yue.wikipedia.org", + "|https://zh-yue.wikipedia.org", + "||wikiwiki.jp", + "||casino.williamhill.com", + "||sports.williamhill.com", + "||vegas.williamhill.com", + "||willw.net", + "||windowsphoneme.com", + ".windscribe.com", + "||windscribe.com", + "||community.windy.com", + "||wingy.site", + "winning11.com", + "winwhispers.info", + "||wiredbytes.com", + "||wiredpen.com", + ".wisdompubs.org", + ".wisevid.com", + "||wisevid.com", + ".witnessleeteaching.com", + ".witopia.net", + ".wjbk.org", + "||wjbk.org", + "|http://wn.com", + ".wnacg.com", + ".wnacg.org", + ".wo.tc", + "||woeser.com", + "|http://woesermiddle-way.net/", + ".wokar.org", + "|http://wokar.org", + "wolfax.com", + "||wolfax.com", + "||woolyss.com", + "woopie.jp", + "||woopie.jp", + "woopie.tv", + "||woopie.tv", + "||workatruna.com", + ".workerdemo.org.hk", + "||workersthebig.net", + ".worldcat.org", + "worldjournal.com", + ".worldvpn.net", + "||worldvpn.net", + "||videopress.com", + ".wordpress.com", + "|http://*.wordpress.com", + "||chenshan20042005.wordpress.com", + "||chinaview.wordpress.com", + "||cnbbnews.wordpress.com", + "||freedominfonetweb.wordpress.com", + "||hka8964.wordpress.com", + "||hkanews.wordpress.com", + "||hqsbnet.wordpress.com", + "||hqsbonline.wordpress.com", + "||investigating.wordpress.com", + "||jobnewera.wordpress.com", + "||minghuiyw.wordpress.com", + "||wo3ttt.wordpress.com", + "||sujiatun.wordpress.com", + "||xijie.wordpress.com", + "||wp.com", + ".wow.com", + ".wow-life.net", + "||wowlegacy.ml", + "||wowporn.com", + "||wowgirls.com", + ".wowrk.com", + "woxinghuiguo.com", + ".woyaolian.org", + "|http://woyaolian.org", + ".wpoforum.com", + "||wpoforum.com", + ".wqyd.org", + "||wqyd.org", + "wrchina.org", + "wretch.cc", + ".wsj.com", + "||wsj.com", + ".wsj.net", + "||wsj.net", + ".wsjhk.com", + ".wtbn.org", + ".wtfpeople.com", + "wuerkaixi.com", + "||wufafangwen.com", + "wufi.org.tw", + "||wuguoguang.com", + "wujie.net", + "wujieliulan.com", + "||wujieliulan.com", + "wukangrui.net", + "||wuw.red", + "||wuyanblog.com", + ".wwitv.com", + "||wwitv.com", + "wzyboy.im/post/160", + ".x-berry.com", + "||x-berry.com", + "||x-art.com", + "||x-wall.org", + "x1949x.com", + "x365x.com", + "xanga.com", + "||xbabe.com", + ".xbookcn.com", + "||xbookcn.com", + "||xcafe.in", + "||xcity.jp", + ".xcritic.com", + "|http://cdn*.xda-developers.com", + ".xerotica.com", + "destiny.xfiles.to/ubbthreads", + ".xfm.pp.ru", + ".xgmyd.com", + "||xgmyd.com", + "xhamster.com", + "||xhamster.com", + ".xianba.net", + ".xianchawang.net", + ".xianjian.tw", + "|http://xianjian.tw", + ".xianqiao.net", + ".xiaobaiwu.com", + ".xiaochuncnjp.com", + ".xiaod.in", + ".xiaohexie.com", + "||xiaolan.me", + "||xiaoma.org", + "||xiaohexie.com", + "xiezhua.com", + ".xihua.es", + "forum.xinbao.de/forum", + ".xing.com", + "|http://xing.com", + ".xinmiao.com.hk", + "||xinmiao.com.hk", + "xinsheng.net", + "xinshijue.com", + "xinhuanet.org", + "|http://xinyubbs.net", + ".xiongpian.com", + ".xiuren.org", + "xizang-zhiye.org", + "xjp.cc", + "||xjp.cc", + "||xjtravelguide.com", + "xlfmtalk.com", + "||xlfmwz.info", + "||xml-training-guide.com", + "xmovies.com", + "||xnxx.com", + "xpdo.net", + "||xpud.org", + ".xrentdvd.com", + ".xskywalker.net", + "||xtube.com", + "blog.xuite.net", + "vlog.xuite.net", + "xuzhiyong.net", + "||xuchao.org", + "xuchao.net", + "||xuchao.net", + "xvideo.cc", + ".xvideos.com", + "||xvideos.com", + "||xvideos.es", + ".xkiwi.tk/", + ".xxbbx.com", + ".xxlmovies.com", + "||xxx.com", + ".xxx.xxx", + "|http://xxx.xxx", + ".xxxfuckmom.com", + "||xxxx.com.au", + ".xxxymovies.com", + "|http://xxxymovies.com", + "xys.org", + "xysblogs.org", + "xyy69.com", + "xyy69.info", + "||yakbutterblues.com", + "yam.com", + "||yam.com", + "||yam.org.tw", + ".yanghengjun.com", + "yangjianli.com", + ".yasni.co.uk", + "||yasni.co.uk", + ".yayabay.com/forum", + ".ydy.com", + ".yeahteentube.com", + "||yeahteentube.com", + "||yecl.net", + "||yeelou.com", + "yeeyi.com", + "yegle.net", + "||yegle.net", + ".yes.xxx", + "||yes123.com.tw", + "||yesasia.com", + "||yesasia.com.hk", + ".yes-news.com", + "|http://yes-news.com", + ".yespornplease.com", + "||yespornplease.com", + "|http://yeyeclub.com", + "||yhcw.net", + ".yibada.com", + ".yibaochina.com", + ".yidio.com", + "||yidio.com", + "yilubbs.com", + "xa.yimg.com", + ".yingsuoss.com", + ".yipub.com", + "||yipub.com", + "yinlei.org/mt", + ".yizhihongxing.com", + ".yobt.com", + ".yobt.tv", + "||yobt.tv", + ".yogichen.org", + "||yogichen.org", + ".yolasite.com", + ".yomiuri.co.jp", + "yong.hu", + ".yorkbbs.ca", + "||youxu.info", + ".youjizz.com", + "||youjizz.com", + ".youmaker.com", + "||youmaker.com", + ".youngpornvideos.com", + "youngspiration.hk", + ".youpai.org", + "||youpai.org", + ".your-freedom.net", + "||yourepeat.com", + ".yourprivatevpn.com", + "||yourprivatevpn.com", + ".yousendit.com", + "||yousendit.com", + ".youthnetradio.org/tmit/forum", + "blog.youthwant.com.tw", + "me.youthwant.com.tw", + "share.youthwant.com.tw", + "topic.youthwant.com.tw", + ".youporn.com", + "||youporn.com", + ".youporngay.com", + "||youporngay.com", + ".yourlisten.com", + "|http://yourlisten.com", + ".yourlust.com", + "|http://yourlust.com", + "youshun12.com", + ".youtubecn.com", + "youversion.com", + "||youversion.com", + "blog.youxu.info/2010/03/14/west-chamber", + "ytht.net", + "yuanming.net", + ".yuanzhengtang.org", + ".yulghun.com", + "||yunchao.net", + "||yuntipub.com", + ".yuvutu.com", + "||yvesgeleyn.com", + ".ywpw.com/forums/history/post/A0/p0/html/227", + "yx51.net", + ".yyii.org", + "||yyii.org", + ".yzzk.com", + "|http://yzzk.com", + "zacebook.com", + ".zalmos.com", + "||zalmos.com", + "||zannel.com", + ".zaobao.com", + "||zaobao.com", + "|http://zaobao.com.sg", + "||zaobao.com.sg", + ".zaozon.com", + "||zdnet.com.tw", + ".zello.com", + "||zello.com", + ".zengjinyan.org", + ".zenmate.com", + "||zenmate.com", + "||zenmate.com.ru", + "||zeronet.io", + "||zeutch.com", + ".zfreet.com", + ".zgsddh.com", + "zgzcjj.net", + ".zhanbin.net", + "||zhanbin.net", + ".zhangboli.net", + "||zhangtianliang.com", + "||zhanlve.org", + "zhenghui.org", + ".zhengjian.org", + "||zhengjian.org", + "zhengwunet.org", + "zhenlibu.info", + "||zhenlibu.info", + ".zhenlibu1984.com", + "||zhenlibu1984.com", + "|http://zhenxiang.biz", + ".zhinengluyou.com", + "zhongguo.ca", + "|http://zhongguorenquan.org", + "zhongguotese.net", + "||zhongguotese.net", + "||zhongmeng.org", + ".zhoushuguang.com", + "||zhreader.com", + ".zhuangbi.me", + "||zhuangbi.me", + ".zhuanxing.cn", + "||zhuatieba.com", + "zhuichaguoji.org", + "||zhuichaguoji.org", + "|http://book.zi5.me", + ".ziddu.com/download", + "||zillionk.com", + ".zinio.com", + "||zinio.com", + ".ziporn.com", + ".zippyshare.com", + ".zkaip.com", + "||zkaip.com", + "realforum.zkiz.com", + "||zmw.cn", + ".zodgame.us", + "zomobo.net", + ".zonaeuropa.com", + "||zonaeuropa.com", + "||zonghexinwen.com", + ".zonghexinwen.net", + "||zoogvpn.com", + "||zootool.com", + ".zoozle.net", + "writer.zoho.com", + "||zorrovpn.com", + "||zpn.im", + "||zspeeder.me", + ".zsrhao.com", + ".zuo.la", + "||zuo.la", + "||zuobiao.me", + ".zuola.com", + "||zuola.com", + "||zvereff.com", + ".zynaima.com", + "zyzc9.com", + ".zzcartoon.com", + "64memo", + "aHR0cHM6Ly95ZWNsLm5ldA", + "freenet", + ".google.*/falun", + "phobos.apple.com*/video", + "q=freedom", + "q%3Dfreedom", + "remembering_tiananmen_20_years", + "search*safeweb", + "q=triangle", + "q%3DTriangle", + "ultrareach", + "ultrasurf", + "@@||aliyun.com", + "@@||baidu.com", + "@@||chinaso.com", + "@@||chinaz.com", + "@@|http://nrch.culture.tw/", + "@@||dl.google.com", + "@@||kh.google.com", + "@@||khm.google.com", + "@@||khm0.google.com", + "@@||khm1.google.com", + "@@||khm2.google.com", + "@@||khm3.google.com", + "@@||khmdb.google.com", + "@@||tools.google.com", + "@@||clientservices.googleapis.com", + "@@||fonts.googleapis.com", + "@@||khm.googleapis.com", + "@@||khm0.googleapis.com", + "@@||khm1.googleapis.com", + "@@||khm2.googleapis.com", + "@@||khm3.googleapis.com", + "@@||khmdb.googleapis.com", + "@@||storage.googleapis.com", + "@@||translate.googleapis.com", + "@@||update.googleapis.com", + "@@||safebrowsing.googleapis.com", + "@@||cn.gravatar.com", + "@@||connectivitycheck.gstatic.com", + "@@||csi.gstatic.com", + "@@||fonts.gstatic.com", + "@@||ssl.gstatic.com", + "@@||haosou.com", + "@@||ip.cn", + "@@||jike.com", + "@@|http://translate.google.cn", + "@@|http://www.google.cn/maps", + "@@||http2.golang.org", + "@@||gov.cn", + "@@||qq.com", + "@@||sina.cn", + "@@||sina.com.cn", + "@@||sogou.com", + "@@||so.com", + "@@||soso.com", + "@@||uluai.com.cn", + "@@||weibo.com", + "@@||yahoo.cn", + "@@||youdao.com", + "@@||zhongsou.com", + "@@|http://ime.baidu.jp" +]; + +/* +* This file is part of Adblock Plus <http://adblockplus.org/>, +* Copyright (C) 2006-2014 Eyeo GmbH +* +* Adblock Plus is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 3 as +* published by the Free Software Foundation. +* +* Adblock Plus is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. +*/ + +function createDict() +{ + var result = {}; + result.__proto__ = null; + return result; +} + +function getOwnPropertyDescriptor(obj, key) +{ + if (obj.hasOwnProperty(key)) + { + return obj[key]; + } + return null; +} + +function extend(subclass, superclass, definition) +{ + if (Object.__proto__) + { + definition.__proto__ = superclass.prototype; + subclass.prototype = definition; + } + else + { + var tmpclass = function(){}, ret; + tmpclass.prototype = superclass.prototype; + subclass.prototype = new tmpclass(); + subclass.prototype.constructor = superclass; + for (var i in definition) + { + if (definition.hasOwnProperty(i)) + { + subclass.prototype[i] = definition[i]; + } + } + } +} + +function Filter(text) +{ + this.text = text; + this.subscriptions = []; +} +Filter.prototype = { + text: null, + subscriptions: null, + toString: function() + { + return this.text; + } +}; +Filter.knownFilters = createDict(); +Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/; +Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/; +Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/; +Filter.fromText = function(text) +{ + if (text in Filter.knownFilters) + { + return Filter.knownFilters[text]; + } + var ret; + if (text.charAt(0) == "!") + { + ret = new CommentFilter(text); + } + else + { + ret = RegExpFilter.fromText(text); + } + Filter.knownFilters[ret.text] = ret; + return ret; +}; + +function InvalidFilter(text, reason) +{ + Filter.call(this, text); + this.reason = reason; +} +extend(InvalidFilter, Filter, { + reason: null +}); + +function CommentFilter(text) +{ + Filter.call(this, text); +} +extend(CommentFilter, Filter, { +}); + +function ActiveFilter(text, domains) +{ + Filter.call(this, text); + this.domainSource = domains; +} +extend(ActiveFilter, Filter, { + domainSource: null, + domainSeparator: null, + ignoreTrailingDot: true, + domainSourceIsUpperCase: false, + getDomains: function() + { + var prop = getOwnPropertyDescriptor(this, "domains"); + if (prop) + { + return prop; + } + var domains = null; + if (this.domainSource) + { + var source = this.domainSource; + if (!this.domainSourceIsUpperCase) + { + source = source.toUpperCase(); + } + var list = source.split(this.domainSeparator); + if (list.length == 1 && (list[0]).charAt(0) != "~") + { + domains = createDict(); + domains[""] = false; + if (this.ignoreTrailingDot) + { + list[0] = list[0].replace(/\.+$/, ""); + } + domains[list[0]] = true; + } + else + { + var hasIncludes = false; + for (var i = 0; i < list.length; i++) + { + var domain = list[i]; + if (this.ignoreTrailingDot) + { + domain = domain.replace(/\.+$/, ""); + } + if (domain == "") + { + continue; + } + var include; + if (domain.charAt(0) == "~") + { + include = false; + domain = domain.substr(1); + } + else + { + include = true; + hasIncludes = true; + } + if (!domains) + { + domains = createDict(); + } + domains[domain] = include; + } + domains[""] = !hasIncludes; + } + this.domainSource = null; + } + return this.domains; + }, + sitekeys: null, + isActiveOnDomain: function(docDomain, sitekey) + { + if (this.getSitekeys() && (!sitekey || this.getSitekeys().indexOf(sitekey.toUpperCase()) < 0)) + { + return false; + } + if (!this.getDomains()) + { + return true; + } + if (!docDomain) + { + return this.getDomains()[""]; + } + if (this.ignoreTrailingDot) + { + docDomain = docDomain.replace(/\.+$/, ""); + } + docDomain = docDomain.toUpperCase(); + while (true) + { + if (docDomain in this.getDomains()) + { + return this.domains[docDomain]; + } + var nextDot = docDomain.indexOf("."); + if (nextDot < 0) + { + break; + } + docDomain = docDomain.substr(nextDot + 1); + } + return this.domains[""]; + }, + isActiveOnlyOnDomain: function(docDomain) + { + if (!docDomain || !this.getDomains() || this.getDomains()[""]) + { + return false; + } + if (this.ignoreTrailingDot) + { + docDomain = docDomain.replace(/\.+$/, ""); + } + docDomain = docDomain.toUpperCase(); + for (var domain in this.getDomains()) + { + if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1)) + { + return false; + } + } + return true; + } +}); + +function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) +{ + ActiveFilter.call(this, text, domains, sitekeys); + if (contentType != null) + { + this.contentType = contentType; + } + if (matchCase) + { + this.matchCase = matchCase; + } + if (thirdParty != null) + { + this.thirdParty = thirdParty; + } + if (sitekeys != null) + { + this.sitekeySource = sitekeys; + } + if (regexpSource.length >= 2 && regexpSource.charAt(0) == "/" && regexpSource.charAt(regexpSource.length - 1) == "/") + { + var regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i"); + this.regexp = regexp; + } + else + { + this.regexpSource = regexpSource; + } +} +extend(RegExpFilter, ActiveFilter, { + domainSourceIsUpperCase: true, + length: 1, + domainSeparator: "|", + regexpSource: null, + getRegexp: function() + { + var prop = getOwnPropertyDescriptor(this, "regexp"); + if (prop) + { + return prop; + } + var source = this.regexpSource.replace(/\*+/g, "*").replace(/\^\|$/, "^").replace(/\W/g, "\\$&").replace(/\\\*/g, ".*").replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)").replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?").replace(/^\\\|/, "^").replace(/\\\|$/, "$").replace(/^(\.\*)/, "").replace(/(\.\*)$/, ""); + var regexp = new RegExp(source, this.matchCase ? "" : "i"); + this.regexp = regexp; + return regexp; + }, + contentType: 2147483647, + matchCase: false, + thirdParty: null, + sitekeySource: null, + getSitekeys: function() + { + var prop = getOwnPropertyDescriptor(this, "sitekeys"); + if (prop) + { + return prop; + } + var sitekeys = null; + if (this.sitekeySource) + { + sitekeys = this.sitekeySource.split("|"); + this.sitekeySource = null; + } + this.sitekeys = sitekeys; + return this.sitekeys; + }, + matches: function(location, contentType, docDomain, thirdParty, sitekey) + { + if (this.getRegexp().test(location) && this.isActiveOnDomain(docDomain, sitekey)) + { + return true; + } + return false; + } +}); +RegExpFilter.prototype["0"] = "#this"; +RegExpFilter.fromText = function(text) +{ + var blocking = true; + var origText = text; + if (text.indexOf("@@") == 0) + { + blocking = false; + text = text.substr(2); + } + var contentType = null; + var matchCase = null; + var domains = null; + var sitekeys = null; + var thirdParty = null; + var collapse = null; + var options; + var match = text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null; + if (match) + { + options = match[1].toUpperCase().split(","); + text = match.input.substr(0, match.index); + for (var _loopIndex6 = 0; _loopIndex6 < options.length; ++_loopIndex6) + { + var option = options[_loopIndex6]; + var value = null; + var separatorIndex = option.indexOf("="); + if (separatorIndex >= 0) + { + value = option.substr(separatorIndex + 1); + option = option.substr(0, separatorIndex); + } + option = option.replace(/-/, "_"); + if (option in RegExpFilter.typeMap) + { + if (contentType == null) + { + contentType = 0; + } + contentType |= RegExpFilter.typeMap[option]; + } + else if (option.charAt(0) == "~" && option.substr(1) in RegExpFilter.typeMap) + { + if (contentType == null) + { + contentType = RegExpFilter.prototype.contentType; + } + contentType &= ~RegExpFilter.typeMap[option.substr(1)]; + } + else if (option == "MATCH_CASE") + { + matchCase = true; + } + else if (option == "~MATCH_CASE") + { + matchCase = false; + } + else if (option == "DOMAIN" && typeof value != "undefined") + { + domains = value; + } + else if (option == "THIRD_PARTY") + { + thirdParty = true; + } + else if (option == "~THIRD_PARTY") + { + thirdParty = false; + } + else if (option == "COLLAPSE") + { + collapse = true; + } + else if (option == "~COLLAPSE") + { + collapse = false; + } + else if (option == "SITEKEY" && typeof value != "undefined") + { + sitekeys = value; + } + else + { + return new InvalidFilter(origText, "Unknown option " + option.toLowerCase()); + } + } + } + if (!blocking && (contentType == null || contentType & RegExpFilter.typeMap.DOCUMENT) && (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text)) + { + if (contentType == null) + { + contentType = RegExpFilter.prototype.contentType; + } + contentType &= ~RegExpFilter.typeMap.DOCUMENT; + } + try + { + if (blocking) + { + return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse); + } + else + { + return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys); + } + } + catch (e) + { + return new InvalidFilter(origText, e); + } +}; +RegExpFilter.typeMap = { + OTHER: 1, + SCRIPT: 2, + IMAGE: 4, + STYLESHEET: 8, + OBJECT: 16, + SUBDOCUMENT: 32, + DOCUMENT: 64, + XBL: 1, + PING: 1, + XMLHTTPREQUEST: 2048, + OBJECT_SUBREQUEST: 4096, + DTD: 1, + MEDIA: 16384, + FONT: 32768, + BACKGROUND: 4, + POPUP: 268435456, + ELEMHIDE: 1073741824 +}; +RegExpFilter.prototype.contentType &= ~ (RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP); + +function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys, collapse) +{ + RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); + this.collapse = collapse; +} +extend(BlockingFilter, RegExpFilter, { + collapse: null +}); + +function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) +{ + RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); +} +extend(WhitelistFilter, RegExpFilter, { +}); + +function Matcher() +{ + this.clear(); +} +Matcher.prototype = { + filterByKeyword: null, + keywordByFilter: null, + clear: function() + { + this.filterByKeyword = createDict(); + this.keywordByFilter = createDict(); + }, + add: function(filter) + { + if (filter.text in this.keywordByFilter) + { + return; + } + var keyword = this.findKeyword(filter); + var oldEntry = this.filterByKeyword[keyword]; + if (typeof oldEntry == "undefined") + { + this.filterByKeyword[keyword] = filter; + } + else if (oldEntry.length == 1) + { + this.filterByKeyword[keyword] = [oldEntry, filter]; + } + else + { + oldEntry.push(filter); + } + this.keywordByFilter[filter.text] = keyword; + }, + remove: function(filter) + { + if (!(filter.text in this.keywordByFilter)) + { + return; + } + var keyword = this.keywordByFilter[filter.text]; + var list = this.filterByKeyword[keyword]; + if (list.length <= 1) + { + delete this.filterByKeyword[keyword]; + } + else + { + var index = list.indexOf(filter); + if (index >= 0) + { + list.splice(index, 1); + if (list.length == 1) + { + this.filterByKeyword[keyword] = list[0]; + } + } + } + delete this.keywordByFilter[filter.text]; + }, + findKeyword: function(filter) + { + var result = ""; + var text = filter.text; + if (Filter.regexpRegExp.test(text)) + { + return result; + } + var match = Filter.optionsRegExp.exec(text); + if (match) + { + text = match.input.substr(0, match.index); + } + if (text.substr(0, 2) == "@@") + { + text = text.substr(2); + } + var candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g); + if (!candidates) + { + return result; + } + var hash = this.filterByKeyword; + var resultCount = 16777215; + var resultLength = 0; + for (var i = 0, l = candidates.length; i < l; i++) + { + var candidate = candidates[i].substr(1); + var count = candidate in hash ? hash[candidate].length : 0; + if (count < resultCount || count == resultCount && candidate.length > resultLength) + { + result = candidate; + resultCount = count; + resultLength = candidate.length; + } + } + return result; + }, + hasFilter: function(filter) + { + return filter.text in this.keywordByFilter; + }, + getKeywordForFilter: function(filter) + { + if (filter.text in this.keywordByFilter) + { + return this.keywordByFilter[filter.text]; + } + else + { + return null; + } + }, + _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty, sitekey) + { + var list = this.filterByKeyword[keyword]; + for (var i = 0; i < list.length; i++) + { + var filter = list[i]; + if (filter == "#this") + { + filter = list; + } + if (filter.matches(location, contentType, docDomain, thirdParty, sitekey)) + { + return filter; + } + } + return null; + }, + matchesAny: function(location, contentType, docDomain, thirdParty, sitekey) + { + var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); + if (candidates === null) + { + candidates = []; + } + candidates.push(""); + for (var i = 0, l = candidates.length; i < l; i++) + { + var substr = candidates[i]; + if (substr in this.filterByKeyword) + { + var result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + if (result) + { + return result; + } + } + } + return null; + } +}; + +function CombinedMatcher() +{ + this.blacklist = new Matcher(); + this.whitelist = new Matcher(); + this.resultCache = createDict(); +} +CombinedMatcher.maxCacheEntries = 1000; +CombinedMatcher.prototype = { + blacklist: null, + whitelist: null, + resultCache: null, + cacheEntries: 0, + clear: function() + { + this.blacklist.clear(); + this.whitelist.clear(); + this.resultCache = createDict(); + this.cacheEntries = 0; + }, + add: function(filter) + { + if (filter instanceof WhitelistFilter) + { + this.whitelist.add(filter); + } + else + { + this.blacklist.add(filter); + } + if (this.cacheEntries > 0) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + }, + remove: function(filter) + { + if (filter instanceof WhitelistFilter) + { + this.whitelist.remove(filter); + } + else + { + this.blacklist.remove(filter); + } + if (this.cacheEntries > 0) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + }, + findKeyword: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.findKeyword(filter); + } + else + { + return this.blacklist.findKeyword(filter); + } + }, + hasFilter: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.hasFilter(filter); + } + else + { + return this.blacklist.hasFilter(filter); + } + }, + getKeywordForFilter: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.getKeywordForFilter(filter); + } + else + { + return this.blacklist.getKeywordForFilter(filter); + } + }, + isSlowFilter: function(filter) + { + var matcher = filter instanceof WhitelistFilter ? this.whitelist : this.blacklist; + if (matcher.hasFilter(filter)) + { + return !matcher.getKeywordForFilter(filter); + } + else + { + return !matcher.findKeyword(filter); + } + }, + matchesAnyInternal: function(location, contentType, docDomain, thirdParty, sitekey) + { + var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); + if (candidates === null) + { + candidates = []; + } + candidates.push(""); + var blacklistHit = null; + for (var i = 0, l = candidates.length; i < l; i++) + { + var substr = candidates[i]; + if (substr in this.whitelist.filterByKeyword) + { + var result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + if (result) + { + return result; + } + } + if (substr in this.blacklist.filterByKeyword && blacklistHit === null) + { + blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + } + } + return blacklistHit; + }, + matchesAny: function(location, docDomain) + { + var key = location + " " + docDomain + " "; + if (key in this.resultCache) + { + return this.resultCache[key]; + } + var result = this.matchesAnyInternal(location, 0, docDomain, null, null); + if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + this.resultCache[key] = result; + this.cacheEntries++; + return result; + } +}; +var defaultMatcher = new CombinedMatcher(); + +for (var i = 0; i < rules.length; i++) { + defaultMatcher.add(Filter.fromText(rules[i])); +} + +var subnetIpRangeList = [ +0,1, +167772160,184549376, //10.0.0.0/8 +2886729728,2887778304, //172.16.0.0/12 +3232235520,3232301056, //192.168.0.0/16 +2130706432,2130706688 //127.0.0.0/24 +]; + +function convertAddress(ipchars) { + var bytes = ipchars.split('.'); + var result = (bytes[0] << 24) | + (bytes[1] << 16) | + (bytes[2] << 8) | + (bytes[3]); + return result >>> 0; +} + +function check_ipv4(host) { + var re_ipv4 = /^\d+\.\d+\.\d+\.\d+$/g; + if (re_ipv4.test(host)) { + return true; + } +} +function check_ipv6(host) { + var re_ipv6 = /^\[?([a-fA-F0-9]{0,4}\:){1,7}[a-fA-F0-9]{0,4}\]?$/g; + if (re_ipv6.test(host)) { + return true; + } +} +function check_ipv6_dns(dnsstr) { + var re_ipv6 = /([a-fA-F0-9]{0,4}\:){1,7}[a-fA-F0-9]{0,4}(%[0-9]+)?/g; + if (re_ipv6.test(dnsstr)) { + return true; + } +} +function isInSubnetRange(ipRange, intIp) { + for ( var i = 0; i < 10; i += 2 ) { + if ( ipRange[i] <= intIp && intIp < ipRange[i+1] ) + return true; + } +} +function getProxyFromIP(strIp) { + var intIp = convertAddress(strIp); + if ( isInSubnetRange(subnetIpRangeList, intIp) ) { + return direct; + } + return ip_proxy(); +} + +function FindProxyForURL(url, host) { + if ( isPlainHostName(host) === true ) { + return direct; + } + if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) { + return wall_proxy(); + } + if ( check_ipv4(host) === true ) { + return getProxyFromIP(host); + } + return direct; +} diff --git a/other/proxy.pac b/other/proxy.pac new file mode 100644 index 0000000..2c8cb23 --- /dev/null +++ b/other/proxy.pac @@ -0,0 +1,7661 @@ + var hasOwnProperty = Object.hasOwnProperty; + var iproxy ='DIRECT'; + var proxy = "PROXY 127.0.0.1:25;"; + var list = [ + [ + ], + [ + [16777472, 4294967040], + [16777728, 4294966784], + [16779264, 4294965248], + [16785408, 4294959104], + [16842752, 4294967040], + [16843264, 4294966784], + [16843776, 4294966272], + [16844800, 4294965248], + [16846848, 4294963200], + [16850944, 4294959104], + [16908288, 4294966784], + [16908800, 4294967040], + [16909312, 4294967040], + [16909568, 4294967040], + [16909824, 4294966784], + [16910336, 4294967040], + [16910592, 4294967040], + [16910848, 4294966784], + [16911360, 4294966272], + [16912384, 4294963200], + [16916480, 4294959104], + [16924672, 4294950912], + [16973824, 4294901760], + [17039616, 4294967040], + [17039872, 4294966784], + [17040384, 4294967040], + [17040640, 4294967040], + [17040896, 4294966784], + [17041408, 4294965248], + [17043456, 4294963200], + [17047552, 4294959104], + [17055744, 4294950912], + [17301504, 4294901760], + [17432576, 4294965248], + [17434624, 4294966784], + [17435392, 4294967040], + [17435648, 4294966272], + [17436672, 4294963200], + [17440768, 4294959104], + [17448960, 4294950912], + [17563648, 4294705152], + [18350080, 4294443008], + [19726336, 4294901760], + [19922944, 4294836224], + [20054016, 4294901760], + [20119552, 4294901760], + [20447232, 4294443008], + [21233664, 4294705152], + [22020096, 4294443008], + [22544384, 4294705152], + [22806528, 4294836224], + [22937600, 4294836224], + [24379392, 4294705152], + [28573696, 4294705152], + [28835840, 4294836224], + [29097984, 4294705152], + [29360128, 4294443008], + [30015488, 4294836224], + [30146560, 4294705152] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [234881024, 4294965248], + [234884096, 4294966272], + [234946560, 4294966272], + [235929600, 4293918720], + [241598464, 4294966272], + [241605632, 4294966272], + [241631232, 4294901760], + [241696768, 4294443008], + [242221056, 4293918720], + [243400704, 4294836224], + [243662848, 4294836224], + [244318208, 4293918720], + [247479296, 4294966272], + [247483392, 4294966272], + [247726080, 4294836224], + [248250368, 4294836224], + [248512512, 4293918720] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [453509120, 4294443008], + [454033408, 4293918720], + [455272448, 4294965248], + [455344128, 4294705152], + [455606272, 4294443008], + [456271872, 4294965248], + [456294400, 4294934528], + [456542208, 4294965248], + [456562688, 4294965248], + [456572928, 4294950912], + [459460608, 4294963200], + [459464704, 4294959104], + [459505664, 4294934528], + [459735040, 4294901760], + [459964416, 4294950912], + [459983872, 4294966272], + [460136448, 4294959104], + [460324864, 4294950912], + [460345344, 4294963200], + [460423168, 4294950912], + [460521472, 4294934528], + [460598272, 4294966272], + [460933120, 4294965248], + [460945408, 4294965248], + [461373440, 4294836224], + [461626368, 4294966272], + [462422016, 4294901760], + [462684160, 4294705152], + [462946304, 4294443008], + [465043456, 4294443008], + [465567744, 4292870144], + [467664896, 4294705152] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [603979776, 4294966272], + [603981824, 4294965248], + [603983872, 4294963200], + [603987968, 4294959104], + [603996160, 4294950912], + [604012544, 4294934528], + [604045312, 4294901760], + [604241920, 4294705152], + [605028352, 4293918720], + [606076928, 4294705152], + [606339072, 4294901760], + [606404608, 4294959104], + [606413824, 4294966784], + [606414592, 4294967040], + [606414848, 4294965248], + [606416896, 4294963200], + [606601216, 4294443008], + [607125504, 4294836224], + [607322112, 4294901760], + [607649792, 4294443008], + [610271232, 4292870144], + [612368384, 4290772992], + [616562688, 4292870144], + [620232704, 4294705152], + [620625920, 4294901760] + ], + [ + ], + [ + ], + [ + [654311424, 4294967040], + [654311936, 4294966784], + [654312448, 4294966272], + [654313472, 4294965248], + [654315520, 4294963200], + [654319616, 4294959104], + [654327808, 4294950912], + [654344192, 4294934528], + [658505728, 4292870144], + [662700032, 4290772992] + ], + [ + ], + [ + ], + [ + [704643072, 4294966272], + [704645120, 4294965248], + [704647168, 4294965248], + [704649216, 4294966272], + [704651264, 4294959104], + [704675840, 4294934528], + [704708608, 4294959104], + [704716800, 4294963200], + [704720896, 4294965248], + [704722944, 4294966272], + [704741376, 4294934528], + [704905216, 4294705152], + [707788800, 4294836224], + [707919872, 4294901760], + [707985408, 4294901760], + [708050944, 4294705152], + [708313088, 4294705152], + [708706304, 4294934528], + [708739072, 4294959104], + [708747264, 4294963200], + [708752384, 4294966272], + [708753408, 4294965248], + [708771840, 4294901760], + [709885952, 4294836224], + [710098944, 4294963200], + [710103040, 4294966272], + [710105088, 4294965248], + [710107136, 4294959104], + [710115328, 4294934528], + [710148096, 4294705152], + [710410240, 4294443008], + [710950912, 4294959104], + [710959104, 4294965248], + [710962176, 4294966272], + [710963200, 4294963200], + [710967296, 4294934528], + [711000064, 4294901760], + [711131136, 4294950912], + [711147520, 4294959104], + [711155712, 4294963200], + [711159808, 4294966272], + [711161856, 4294965248], + [711196672, 4294705152], + [712507392, 4294836224], + [712638464, 4294901760], + [712704000, 4294959104], + [712713216, 4294966272], + [712714240, 4294965248], + [712716288, 4294963200], + [712720384, 4294950912], + [712736768, 4294934528], + [713031680, 4293918720], + [714866688, 4294959104], + [714875904, 4294966272], + [714876928, 4294965248], + [714878976, 4294963200], + [714883072, 4294950912], + [714899456, 4294934528], + [714932224, 4294901760], + [714997760, 4294836224], + [715128832, 4293918720], + [716177408, 4294443008], + [716701696, 4294836224], + [716832768, 4294901760], + [716898304, 4294950912], + [716914688, 4294959104], + [716922880, 4294963200], + [716926976, 4294965248], + [716929024, 4294966272], + [716931072, 4294934528], + [717225984, 4294836224], + [717357056, 4294965248], + [717359104, 4294966272], + [717360128, 4294966272], + [717361152, 4294963200], + [717365248, 4294959104], + [717373440, 4294950912], + [717389824, 4294934528], + [717422592, 4294901760], + [717488128, 4294705152], + [717815808, 4294934528], + [717881344, 4294836224], + [718012416, 4294705152], + [718274560, 4293918720], + [719323136, 4293918720], + [720371712, 4294934528], + [720404480, 4294934528], + [720502784, 4294836224], + [720633856, 4294705152], + [720896000, 4294443008] + ], + [ + [737542144, 4294966272], + [737543168, 4294966272], + [737544192, 4294966272], + [737545216, 4294966272], + [737546240, 4294966272], + [737547264, 4294966272], + [737548288, 4294966272], + [737549312, 4294966272], + [737550336, 4294966272], + [737551360, 4294966272], + [737552384, 4294966272], + [737553408, 4294966272], + [737554432, 4294966272], + [737555456, 4294966272], + [737556480, 4294966272], + [737557504, 4294966272], + [737558528, 4294966272], + [737559552, 4294966272], + [737560576, 4294966272], + [737561600, 4294966272], + [737562624, 4294966272], + [737563648, 4294966272], + [737564672, 4294966272], + [737565696, 4294966272], + [737566720, 4294966272], + [737608704, 4294966272], + [737609728, 4294966272], + [737618944, 4294966272], + [737619968, 4294966272], + [737625088, 4294966272], + [737627136, 4294966272], + [737629184, 4294966272], + [737630208, 4294966272], + [737631232, 4294966272], + [737632256, 4294966272], + [737633280, 4294966272], + [737635328, 4294966272], + [737636352, 4294966272], + [737645568, 4294966272], + [737646592, 4294966272], + [737652736, 4294966272], + [737653760, 4294966272], + [737654784, 4294966272], + [737655808, 4294966272], + [737657856, 4294966272], + [737658880, 4294966272], + [737659904, 4294966272], + [737660928, 4294966272], + [737661952, 4294966272], + [737662976, 4294966272], + [737664000, 4294966272], + [737665024, 4294966272], + [737666048, 4294966272], + [737667072, 4294966272], + [737668096, 4294966272], + [737669120, 4294966272], + [737670144, 4294966272], + [737671168, 4294966272], + [737672192, 4294966272], + [737945600, 4294966272], + [737947648, 4294966272], + [737949696, 4294966272], + [737992704, 4294966272], + [738066432, 4294966272], + [738067456, 4294966272], + [738068480, 4294966272], + [738072576, 4294966272], + [738075648, 4294966272], + [738077696, 4294966272], + [738079744, 4294966272], + [738082816, 4294966272], + [738084864, 4294966272], + [738087936, 4294966272], + [738088960, 4294966272], + [738089984, 4294966272], + [738092032, 4294966272], + [738093056, 4294966272], + [738095104, 4294966272], + [738096128, 4294966272], + [738099200, 4294966272], + [738101248, 4294966272], + [738102272, 4294966272], + [738103296, 4294966272], + [738104320, 4294966272], + [738105344, 4294966272], + [738106368, 4294966272], + [738109440, 4294966272], + [738110464, 4294966272], + [738112512, 4294966272], + [738113536, 4294966272], + [738114560, 4294966272], + [738115584, 4294966272], + [738116608, 4294966272], + [738117632, 4294966272], + [738119680, 4294966272], + [738122752, 4294966272], + [738123776, 4294966272], + [738124800, 4294966272], + [738125824, 4294966272], + [738126848, 4294966272], + [738127872, 4294966272], + [738129920, 4294966272], + [738130944, 4294966272], + [738131968, 4294966272], + [738132992, 4294966272], + [738134016, 4294966272], + [738136064, 4294966272], + [738144256, 4294966272], + [738147328, 4294966272], + [738148352, 4294966272], + [738149376, 4294966272], + [738150400, 4294966272], + [738151424, 4294966272], + [738153472, 4294966272], + [738156544, 4294966272] + ], + [ + ], + [ + [759197696, 4294966784] + ], + [ + ], + [ + ], + [ + ], + [ + [822345728, 4294705152], + [825425920, 4294901760], + [825491456, 4294705152], + [826277888, 4292870144], + [829423616, 4294443008], + [829947904, 4294705152], + [830472192, 4294967040], + [830472704, 4294966784], + [831258624, 4294836224], + [832045056, 4294705152], + [835715072, 4294836224], + [835846144, 4294836224], + [836501504, 4294705152], + [837287936, 4294705152], + [837746688, 4294950912], + [837795840, 4294950912], + [838262784, 4294959104] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [920518656, 4294836224] + ], + [ + ], + [ + ], + [ + ], + [ + [973996032, 4294836224], + [974127104, 4294901760], + [974192640, 4294934528], + [974225408, 4294934528], + [974258176, 4294901760], + [974323712, 4294901760], + [974389248, 4294901760], + [974454784, 4294901760], + [974520320, 4294836224], + [974651392, 4294836224], + [975044608, 4294836224], + [975175680, 4294443008], + [975699968, 4294836224], + [975831040, 4294901760], + [975896576, 4294901760], + [975962112, 4294705152], + [976224256, 4294443008], + [976748544, 4294836224], + [976879616, 4294901760], + [976945152, 4294934528], + [976977920, 4294934528], + [977010688, 4294705152], + [977397760, 4294965248], + [977403904, 4294836224], + [977567744, 4294934528], + [978452480, 4294934528], + [978518016, 4294934528], + [978550784, 4294934528], + [978796544, 4294950912], + [979599360, 4294934528], + [979632128, 4294836224], + [980680704, 4294705152], + [981467136, 4294443008], + [982515712, 4294901760], + [983171072, 4294836224], + [985661440, 4294836224], + [985792512, 4294836224], + [985923584, 4294836224], + [986054656, 4294836224], + [986185728, 4294443008], + [986710016, 4293918720], + [988807168, 4294836224], + [988938240, 4294836224], + [989069312, 4294836224], + [989200384, 4294836224], + [989331456, 4294443008] + ], + [ + [991952896, 4294443008], + [992477184, 4294836224], + [992608256, 4294901760], + [992673792, 4294901760], + [992739328, 4294705152], + [993001472, 4294901760], + [993067008, 4294934528], + [993099776, 4294934528], + [993132544, 4294901760], + [993198080, 4294934528], + [993230848, 4294934528], + [993263616, 4294705152], + [993525760, 4294705152], + [993787904, 4294836224], + [993918976, 4294836224], + [994050048, 4294705152], + [994312192, 4294705152], + [994574336, 4294836224], + [994705408, 4294836224], + [994836480, 4294901760], + [994902016, 4294901760], + [994967552, 4294836224], + [995098624, 4294836224], + [995229696, 4294836224], + [996868096, 4294934528], + [996900864, 4294934528], + [996933632, 4294836224], + [997064704, 4294836224], + [999751680, 4294934528], + [1000013824, 4294901760], + [1001127936, 4294836224], + [1001259008, 4294836224], + [1002373120, 4294934528], + [1002434560, 4294963200], + [1002438656, 4290772992] + ], + [ + [1006632960, 4294443008], + [1007157248, 4294836224], + [1007288320, 4294901760], + [1007353856, 4294901760], + [1007419392, 4294901760], + [1007484928, 4294950912], + [1007501312, 4294950912], + [1007517696, 4294934528], + [1007550464, 4294836224], + [1007681536, 4294443008], + [1008205824, 4294705152], + [1008467968, 4294836224], + [1008599040, 4294901760], + [1008664576, 4294901760], + [1010237440, 4294901760], + [1010761728, 4294901760], + [1017118720, 4294836224], + [1017249792, 4294836224], + [1017380864, 4294836224], + [1017511936, 4294836224], + [1017643008, 4294443008], + [1018167296, 4293918720], + [1019346944, 4294836224], + [1019740160, 4294705152], + [1020002304, 4294901760], + [1020067840, 4294901760], + [1020133376, 4294836224], + [1020264448, 4294443008], + [1020788736, 4294836224], + [1020919808, 4294836224], + [1021050880, 4294705152], + [1021837312, 4294836224], + [1022033920, 4294901760], + [1022722048, 4294934528], + [1022820352, 4294901760], + [1023148032, 4294901760], + [1023246336, 4294934528], + [1023344640, 4294901760] + ], + [ + [1023692800, 4294966272], + [1023693824, 4294966272], + [1023694848, 4294965248], + [1023717376, 4294963200], + [1023975424, 4294963200], + [1025245184, 4294963200], + [1025249280, 4294963200], + [1025253376, 4294959104], + [1025261568, 4294950912], + [1025343488, 4294950912], + [1025359872, 4294959104], + [1025368064, 4294963200], + [1025372160, 4294963200], + [1026392064, 4294950912], + [1026416640, 4294963200], + [1026523136, 4294950912], + [1026555904, 4294705152], + [1026818048, 4294836224], + [1026949120, 4294901760], + [1027014656, 4294901760], + [1029160960, 4294950912], + [1031798784, 4294836224], + [1031929856, 4294836224], + [1032060928, 4294901760], + [1032126464, 4294934528], + [1032159232, 4294934528], + [1032192000, 4294950912], + [1032208384, 4294959104], + [1032216576, 4294959104], + [1032224768, 4294950912], + [1032241152, 4294950912], + [1032257536, 4294901760], + [1032323072, 4294950912], + [1032339456, 4294950912], + [1032355840, 4294934528], + [1032388608, 4294934528], + [1032421376, 4294934528], + [1032454144, 4294950912], + [1032470528, 4294950912], + [1032486912, 4294950912], + [1032503296, 4294950912], + [1032519680, 4294934528], + [1032552448, 4294950912], + [1032568832, 4294950912], + [1032585216, 4294705152], + [1032847360, 4294705152], + [1033109504, 4294836224], + [1033240576, 4294836224], + [1033371648, 4294901760], + [1033437184, 4294901760], + [1033502720, 4294836224], + [1033633792, 4294901760], + [1033699328, 4294901760], + [1033764864, 4294934528], + [1033797632, 4294934528], + [1033830400, 4294950912], + [1033846784, 4294950912], + [1033863168, 4294934528], + [1033895936, 4294901760], + [1033961472, 4294950912], + [1033977856, 4294950912], + [1033994240, 4294934528], + [1034027008, 4294901760], + [1034092544, 4294901760], + [1034158080, 4294901760], + [1034223616, 4294901760], + [1034289152, 4294901760], + [1034354688, 4294901760], + [1034420224, 4294901760], + [1034485760, 4294901760], + [1034551296, 4294836224], + [1034682368, 4294705152], + [1034944512, 4294901760], + [1035010048, 4294901760], + [1035075584, 4294901760], + [1035141120, 4294901760], + [1035206656, 4294934528], + [1035239424, 4294934528], + [1035272192, 4294901760], + [1035337728, 4294901760], + [1035403264, 4294901760], + [1035468800, 4294705152], + [1035730944, 4294901760], + [1035796480, 4294934528], + [1035829248, 4294934528], + [1035862016, 4294836224], + [1038614528, 4294705152], + [1038876672, 4294836224], + [1039138816, 4294705152] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [1694498816, 4294966272], + [1694564352, 4294966272], + [1694673920, 4294966272], + [1694760960, 4294705152], + [1695547392, 4293918720], + [1696595968, 4293918720], + [1697644544, 4294836224], + [1697789952, 4294966272], + [1697906688, 4294901760], + [1697997824, 4294966272], + [1698037760, 4294901760], + [1698160640, 4294965248], + [1698693120, 4294443008], + [1699217408, 4294705152], + [1699479552, 4294836224], + [1699610624, 4294966272], + [1699618816, 4294959104], + [1699741696, 4293918720], + [1700790272, 4294965248], + [1700792320, 4294966272], + [1700794368, 4294963200], + [1700823040, 4294934528], + [1701011456, 4294959104], + [1701134336, 4294959104], + [1701143552, 4294967040], + [1701144064, 4294966784], + [1701144576, 4294965248], + [1701146624, 4294963200], + [1701199872, 4294959104], + [1701209088, 4294966784], + [1701209600, 4294967040], + [1701210112, 4294965248], + [1701212160, 4294963200], + [1701314560, 4294705152], + [1701724160, 4294959104], + [1701732352, 4294963200], + [1701737472, 4294966272], + [1701738496, 4294965248], + [1702363136, 4294705152], + [1702625280, 4294836224], + [1702756352, 4294901760], + [1702887424, 4294966272], + [1702889472, 4294965248], + [1702891520, 4294963200], + [1702895616, 4294959104], + [1702952960, 4294901760], + [1703018496, 4294836224], + [1703149568, 4294705152], + [1703936000, 4293918720], + [1707081728, 4294705152], + [1707343872, 4294705152], + [1707606016, 4294836224], + [1707835392, 4294959104], + [1707843584, 4294965248], + [1707846656, 4294966272], + [1707847680, 4294963200], + [1707868160, 4294705152], + [1709178880, 4294443008], + [1709703168, 4294836224], + [1709850624, 4294965248], + [1709853696, 4294966272], + [1709854720, 4294963200], + [1709858816, 4294959104], + [1709965312, 4294705152], + [1710227456, 4294705152], + [1710489600, 4294705152], + [1710751744, 4294836224], + [1710948352, 4294966272], + [1710950400, 4294965248], + [1710952448, 4294963200], + [1710956544, 4294959104], + [1710964736, 4294950912], + [1710981120, 4294934528], + [1711013888, 4294836224], + [1711144960, 4294901760] + ], + [ + ], + [ + [1728120832, 4294966272], + [1728123904, 4294966272], + [1728124928, 4294966272], + [1728137216, 4294966272], + [1728141312, 4294966272], + [1728161792, 4294966272], + [1728211968, 4294966272], + [1728224256, 4294966272], + [1728226304, 4294966272], + [1728235520, 4294966272], + [1728236544, 4294966272], + [1728237568, 4294966272], + [1728238592, 4294966272], + [1728271360, 4294966272], + [1728272384, 4294966272], + [1728273408, 4294966272], + [1728274432, 4294966272], + [1728275456, 4294966272], + [1728276480, 4294966272], + [1728277504, 4294966272], + [1728278528, 4294966272], + [1728279552, 4294966272], + [1728280576, 4294966272], + [1728281600, 4294966272], + [1728282624, 4294966272], + [1728283648, 4294966272], + [1728284672, 4294966272], + [1728285696, 4294966272], + [1728287744, 4294966272], + [1728288768, 4294966272], + [1728289792, 4294966272], + [1728329728, 4294966272], + [1728358400, 4294966272], + [1728362496, 4294966272], + [1728390144, 4294966272], + [1728394240, 4294966272], + [1728395264, 4294966272], + [1728445440, 4294966272], + [1728465920, 4294966272], + [1728502784, 4294966272], + [1728513024, 4294966272], + [1728519168, 4294966272], + [1728566272, 4294966272], + [1728567296, 4294966272], + [1728568320, 4294966272], + [1728578560, 4294966272], + [1728579584, 4294966272], + [1728585728, 4294966272], + [1728590848, 4294966272], + [1728605184, 4294966272], + [1728617472, 4294966272], + [1728628736, 4294966272], + [1728629760, 4294966272], + [1728633856, 4294966272], + [1728681984, 4294966272], + [1728706560, 4294966272], + [1728707584, 4294966272], + [1728708608, 4294966272], + [1728712704, 4294966272], + [1728730112, 4294966272], + [1728737024, 4294967040], + [1728744448, 4294966272], + [1728820224, 4294966272], + [1728847872, 4294966272], + [1728857088, 4294966272], + [1728874496, 4294966272], + [1728886784, 4294966272], + [1728899072, 4294966272], + [1728936960, 4294966272], + [1728942080, 4294966272], + [1728955392, 4294966272], + [1728967680, 4294966272], + [1728992256, 4294966272], + [1728999424, 4294966272], + [1729004544, 4294966272], + [1729005568, 4294966272], + [1729010688, 4294966272], + [1729032192, 4294966272], + [1729037312, 4294966272], + [1729038336, 4294966272], + [1729040384, 4294966272], + [1729060864, 4294966272], + [1729087488, 4294966272], + [1729115136, 4294966272], + [1729122304, 4294966272], + [1729123328, 4294966272], + [1729124352, 4294966272], + [1729129472, 4294966272], + [1729133568, 4294966272], + [1729177600, 4294966272], + [1729198080, 4294966272], + [1729208320, 4294966272], + [1729219584, 4294966272], + [1729225728, 4294966272], + [1729282048, 4294966272], + [1729286144, 4294966272], + [1729287168, 4294966272], + [1729290240, 4294966272], + [1729301504, 4294966272], + [1729308672, 4294966272], + [1729309696, 4294966272], + [1729314816, 4294966272], + [1729315840, 4294966272], + [1729316864, 4294966272], + [1729357824, 4294966272], + [1729367040, 4294966272], + [1729372160, 4294966272], + [1729392640, 4294966272], + [1729396736, 4294966272], + [1729404928, 4294966272], + [1729427456, 4294966272], + [1729458176, 4294966272], + [1729459200, 4294966272], + [1729464320, 4294966272], + [1729465344, 4294966272], + [1729474560, 4294966272], + [1729482752, 4294966272], + [1729490944, 4294966272], + [1729495040, 4294966272], + [1729496064, 4294966272], + [1729497088, 4294966272], + [1729498112, 4294966272], + [1729499136, 4294966272], + [1729500160, 4294966272], + [1729501184, 4294966272], + [1729502208, 4294966272], + [1729503232, 4294966272], + [1729504256, 4294966272], + [1729505280, 4294966272], + [1729506304, 4294966272], + [1729507328, 4294966272], + [1729508352, 4294966272], + [1729509376, 4294966272], + [1729510400, 4294966272], + [1729511424, 4294966272], + [1729512448, 4294966272], + [1729513472, 4294966272], + [1729514496, 4294966272], + [1729515520, 4294966272], + [1729516544, 4294966272], + [1729517568, 4294966272], + [1729518592, 4294966272], + [1729520640, 4294966272], + [1729521664, 4294966272], + [1729522688, 4294966272], + [1729523712, 4294966272], + [1729524736, 4294966272], + [1729525760, 4294966272], + [1729526784, 4294966272], + [1729543168, 4294966272], + [1729553408, 4294966272], + [1729559552, 4294966272], + [1729562624, 4294966272], + [1729574912, 4294966272], + [1729601536, 4294966272], + [1729602560, 4294966272], + [1729605632, 4294966272], + [1729618944, 4294966272], + [1729655808, 4294966272], + [1729658880, 4294966272], + [1729662976, 4294966272], + [1729671168, 4294966272], + [1729673216, 4294966272], + [1729682432, 4294966272], + [1729684480, 4294966272], + [1729689600, 4294966272], + [1729690624, 4294966272], + [1729693696, 4294966784], + [1729696768, 4294966272], + [1729697792, 4294966272], + [1729698816, 4294966272], + [1729699840, 4294966272], + [1729700864, 4294966272], + [1729701888, 4294966272], + [1729703936, 4294966272], + [1729708032, 4294966272], + [1729709056, 4294966272], + [1729729536, 4294966272], + [1729731584, 4294966272], + [1729746944, 4294966272], + [1729757184, 4294966272], + [1729773568, 4294966272], + [1729797120, 4294966272], + [1729798144, 4294966272], + [1729815552, 4294966272], + [1729818624, 4294966272], + [1729823744, 4294966272], + [1729825792, 4294966272], + [1729828864, 4294966272], + [1729837056, 4294966272], + [1729847296, 4294966272], + [1729875968, 4294966272], + [1729884160, 4294966272], + [1729889280, 4294966272], + [1729890304, 4294966272], + [1729940480, 4294966272], + [1729957888, 4294966272], + [1729986560, 4294966272], + [1729987584, 4294966272], + [1729988608, 4294966272], + [1730024448, 4294966272], + [1730043904, 4294966272], + [1730057216, 4294966272], + [1730070528, 4294966272], + [1730074624, 4294966272], + [1730077696, 4294966272], + [1730079744, 4294966272], + [1730084864, 4294966272], + [1730097152, 4294966272], + [1730098176, 4294966272], + [1730099200, 4294966272], + [1730100224, 4294966272], + [1730101248, 4294966272], + [1730102272, 4294966272], + [1730103296, 4294966272], + [1730122752, 4294966272], + [1730125824, 4294966272], + [1730127872, 4294966272], + [1730136064, 4294966272], + [1742743552, 4294966272], + [1742744576, 4294966272], + [1742748672, 4294966272], + [1742753792, 4294966272], + [1742789632, 4294966272], + [1742790656, 4294966272], + [1742791680, 4294966272], + [1742792704, 4294966272], + [1742820352, 4294966272], + [1742868480, 4294966272], + [1742874624, 4294966272], + [1742878720, 4294966272], + [1742879744, 4294966272], + [1742884864, 4294966272], + [1742894080, 4294966272], + [1742898176, 4294966272], + [1742904320, 4294966272], + [1742910464, 4294966272], + [1742914560, 4294966272], + [1742942208, 4294966272], + [1742948352, 4294966272], + [1742949376, 4294966272], + [1742950400, 4294966272], + [1742955520, 4294966272], + [1742960640, 4294966272], + [1742963712, 4294966272], + [1742964736, 4294966272], + [1742980096, 4294966272], + [1742982144, 4294966272], + [1742984192, 4294966272], + [1742988288, 4294966272], + [1742998528, 4294966272], + [1743002624, 4294966272], + [1743012864, 4294966272], + [1743017984, 4294966272], + [1743028224, 4294966272], + [1743036416, 4294966272], + [1743040512, 4294966272], + [1743047680, 4294966272], + [1743048704, 4294966272], + [1743053824, 4294966272], + [1743054848, 4294966272], + [1743066112, 4294966272], + [1743095808, 4294966272], + [1743098880, 4294966272], + [1743105024, 4294966272], + [1743115264, 4294966272], + [1743116288, 4294966272], + [1743117312, 4294966272], + [1743119360, 4294966272], + [1743121408, 4294966272], + [1743122432, 4294966272], + [1743126528, 4294966272], + [1743133696, 4294966272], + [1743136768, 4294966272], + [1743137792, 4294966272], + [1743151104, 4294966272], + [1743176704, 4294966272], + [1743177728, 4294966272], + [1743178752, 4294966272], + [1743180800, 4294966272], + [1743186944, 4294966272], + [1743196160, 4294966272], + [1743197184, 4294966272], + [1743208448, 4294966272], + [1743209472, 4294966272], + [1743228928, 4294966272], + [1743238144, 4294966272], + [1743239168, 4294966272], + [1743254528, 4294966272], + [1743258624, 4294966272], + [1743294464, 4294966272], + [1743311872, 4294966272], + [1743324160, 4294966272], + [1743334400, 4294966272], + [1743336448, 4294966272], + [1743349760, 4294966272], + [1743355904, 4294966272], + [1743357952, 4294966272], + [1743381504, 4294966272], + [1743388672, 4294966272], + [1743393792, 4294966272], + [1743403008, 4294966272], + [1743420416, 4294966272], + [1743421440, 4294966272], + [1743432704, 4294966272], + [1743434752, 4294966272], + [1743458304, 4294966272], + [1743466496, 4294966272], + [1743468544, 4294966272], + [1743469568, 4294966272], + [1743474688, 4294966272], + [1743475712, 4294966272], + [1743486976, 4294966272], + [1743488000, 4294966272], + [1743489024, 4294966272], + [1743490048, 4294966272], + [1743491072, 4294966272], + [1743492096, 4294966272], + [1743501312, 4294966272], + [1743503360, 4294966272], + [1743505408, 4294966272], + [1743510528, 4294966272], + [1743511552, 4294966272], + [1743512576, 4294966272], + [1743513600, 4294966272], + [1743514624, 4294966272], + [1743515648, 4294966272], + [1743516672, 4294966272], + [1743517696, 4294966272], + [1743518720, 4294966272], + [1743519744, 4294966272], + [1743520768, 4294966272], + [1743521792, 4294966272], + [1743522816, 4294966272], + [1743523840, 4294966272], + [1743524864, 4294966272], + [1743525888, 4294966272], + [1743526912, 4294966272], + [1743527936, 4294966272], + [1743528960, 4294966272], + [1743529984, 4294966272], + [1743531008, 4294966272], + [1743532032, 4294966272], + [1743533056, 4294966272], + [1743534080, 4294966272], + [1743535104, 4294966272], + [1743536128, 4294966272], + [1743537152, 4294966272], + [1743538176, 4294966272], + [1743539200, 4294966272], + [1743540224, 4294966272], + [1743541248, 4294966272], + [1743542272, 4294966272], + [1743543296, 4294966272], + [1743544320, 4294966272], + [1743585280, 4294966272], + [1743586304, 4294966272], + [1743587328, 4294966272], + [1743588352, 4294966272], + [1743591424, 4294966272], + [1743592448, 4294966272], + [1743602688, 4294966272], + [1743607808, 4294966272], + [1743624192, 4294966272], + [1743630336, 4294966272], + [1743631360, 4294966272], + [1743632384, 4294966272], + [1743633408, 4294966272], + [1743634432, 4294966272], + [1743635456, 4294966272], + [1743636480, 4294966272], + [1743637504, 4294966272], + [1743638528, 4294966272], + [1743639552, 4294966272], + [1743640576, 4294966272], + [1743641600, 4294966272], + [1743642624, 4294966272], + [1743643648, 4294966272], + [1743644672, 4294966272], + [1743645696, 4294966272], + [1743646720, 4294966272], + [1743647744, 4294966272], + [1743648768, 4294966272], + [1743649792, 4294966272], + [1743650816, 4294966272], + [1743651840, 4294966272], + [1743654912, 4294966272], + [1743655936, 4294966272], + [1743656960, 4294966272], + [1743657984, 4294966272], + [1743659008, 4294966272], + [1743660032, 4294966272], + [1743661056, 4294966272], + [1743662080, 4294966272], + [1743663104, 4294966272], + [1743664128, 4294966272], + [1743665152, 4294966272], + [1743673344, 4294966272], + [1743674368, 4294966272], + [1743675392, 4294966272], + [1743684608, 4294966272], + [1743686656, 4294966272], + [1743687680, 4294966272], + [1743691776, 4294966272], + [1743692800, 4294966272], + [1743693824, 4294966272], + [1743694848, 4294966272], + [1743695872, 4294966272], + [1743696896, 4294966272], + [1743697920, 4294966272], + [1743698944, 4294966272], + [1743700992, 4294966272], + [1743703040, 4294966272], + [1743715328, 4294966272], + [1743716352, 4294966272], + [1743726592, 4294966272], + [1743727616, 4294966272], + [1743733760, 4294966272], + [1743785984, 4294966272], + [1743791104, 4294966272], + [1743800320, 4294966272], + [1743803392, 4294966272], + [1743813632, 4294966272], + [1743821824, 4294966272], + [1743825920, 4294966272], + [1743844352, 4294966272], + [1743850496, 4294966272], + [1743865856, 4294966272], + [1743870976, 4294966272], + [1743872000, 4294966272], + [1743888384, 4294966272], + [1743894528, 4294966272], + [1743895552, 4294966272], + [1743903744, 4294966272], + [1743915008, 4294966272], + [1743929344, 4294966272], + [1743945728, 4294966272], + [1743946752, 4294966272], + [1743953920, 4294966272], + [1743955968, 4294966272], + [1743956992, 4294966272], + [1743958016, 4294966272], + [1743964160, 4294966272], + [1743967232, 4294966272], + [1743969280, 4294966272], + [1743974400, 4294966272], + [1743984640, 4294966272], + [1744013312, 4294966272], + [1744043008, 4294966272], + [1744048128, 4294966272], + [1744058880, 4294966784], + [1744059392, 4294966272], + [1744060416, 4294966272], + [1744061440, 4294966272], + [1744062464, 4294966272], + [1744063488, 4294966272], + [1744064512, 4294966272], + [1744065536, 4294966272], + [1744086016, 4294966272], + [1744103424, 4294966272], + [1744108544, 4294966272], + [1744115456, 4294967040], + [1744122880, 4294966272], + [1744124928, 4294966272], + [1744130048, 4294966272], + [1744141312, 4294966272], + [1744142336, 4294966272], + [1744177152, 4294966272], + [1744178176, 4294966272], + [1744205824, 4294966272], + [1744206848, 4294966272], + [1744208896, 4294966272], + [1744214016, 4294966272], + [1744215040, 4294966272], + [1744283648, 4294966272], + [1744284672, 4294966272], + [1744285696, 4294966272], + [1744291840, 4294966272], + [1744294912, 4294966272], + [1744306176, 4294966784], + [1744322560, 4294966272], + [1744331776, 4294966272], + [1744337920, 4294966272], + [1744345088, 4294966272], + [1744349184, 4294966272], + [1744355328, 4294966272], + [1744360448, 4294966272], + [1744363520, 4294966272], + [1744364544, 4294966272], + [1744374784, 4294966272], + [1744385024, 4294966272], + [1744404480, 4294966272], + [1744406528, 4294966272], + [1744408576, 4294966272], + [1744413696, 4294966272], + [1744414720, 4294966272], + [1744415744, 4294966272], + [1744416768, 4294966272], + [1744419840, 4294966272], + [1744420864, 4294966272], + [1744434176, 4294966272], + [1744436224, 4294966272], + [1744445440, 4294966272], + [1744463872, 4294966272], + [1744468992, 4294966272], + [1744483328, 4294966272], + [1744486400, 4294966272], + [1744492544, 4294966272], + [1744494592, 4294966272], + [1744497664, 4294966272], + [1744500736, 4294966272], + [1744501760, 4294966272], + [1744510976, 4294966272], + [1744524288, 4294966272], + [1744527360, 4294966272], + [1744534528, 4294966272], + [1744535552, 4294966272], + [1744543744, 4294966272], + [1744555008, 4294966272], + [1744563200, 4294966272], + [1744564224, 4294966272], + [1744575488, 4294966272], + [1744577536, 4294966272], + [1744584704, 4294966272], + [1744594944, 4294966272], + [1744612352, 4294966272], + [1744620544, 4294966272], + [1744621568, 4294966272], + [1744627712, 4294966272], + [1744631808, 4294966272], + [1744634880, 4294966272], + [1744649216, 4294966272], + [1744686080, 4294966272], + [1744690176, 4294966272], + [1744691200, 4294966272], + [1744693248, 4294966272], + [1744701440, 4294966272], + [1744704512, 4294966272], + [1744715776, 4294966272], + [1744716800, 4294966272], + [1744717824, 4294966272], + [1744718848, 4294966272], + [1744728064, 4294966272], + [1744737280, 4294966272], + [1744744448, 4294966272], + [1744747520, 4294966272], + [1744749568, 4294967040], + [1744755712, 4294966272], + [1744782336, 4294966272], + [1744787456, 4294966272], + [1744788480, 4294966272], + [1744799744, 4294966272], + [1744800768, 4294966272], + [1744812032, 4294966272], + [1744816128, 4294966272], + [1744818176, 4294966272], + [1744819200, 4294966272], + [1744823296, 4294966272] + ], + [ + ], + [ + ], + [ + [1778384896, 4294967040], + [1778385408, 4294966784], + [1778385920, 4294966272], + [1778386944, 4294965248], + [1778388992, 4294963200], + [1778401280, 4294950912], + [1778515968, 4294836224], + [1778647040, 4294705152], + [1778909184, 4294836224], + [1779105792, 4294901760], + [1779171328, 4294705152], + [1779433472, 4293918720], + [1780482048, 4293918720], + [1781530624, 4294836224], + [1781661696, 4294901760], + [1781792768, 4294705152], + [1782054912, 4294443008], + [1783234560, 4294901760], + [1783300096, 4294901760], + [1783627776, 4293918720], + [1785462784, 4294705152], + [1785724928, 4294443008], + [1786249216, 4294443008], + [1793064960, 4293918720] + ], + [ + ], + [ + ], + [ + ], + [ + [1845886976, 4294836224], + [1846542336, 4294705152], + [1848115200, 4294705152], + [1848414208, 4294963200], + [1848639488, 4294901760], + [1848836096, 4294901760], + [1848901632, 4294836224], + [1849163776, 4294443008], + [1849688064, 4294836224], + [1850212352, 4294836224], + [1850408960, 4294934528], + [1850441728, 4294959104], + [1850449920, 4294959104], + [1850458112, 4294950912], + [1850474496, 4294959104], + [1850482688, 4294959104], + [1850514432, 4294966272], + [1850521600, 4294966272], + [1850523648, 4294950912], + [1850540032, 4294934528], + [1850736640, 4294443008], + [1851260928, 4294705152], + [1851596800, 4294959104], + [1851654144, 4294836224], + [1851785216, 4292870144], + [1855455232, 4294705152], + [1855717376, 4294836224], + [1856315392, 4294959104], + [1856372736, 4294836224], + [1856815104, 4294950912], + [1856831488, 4294959104], + [1856839680, 4294963200], + [1856847872, 4294959104], + [1856856064, 4294959104], + [1856880640, 4294959104], + [1857028096, 4294443008], + [1857552384, 4294443008], + [1858076672, 4292870144], + [1860435968, 4294705152], + [1860706304, 4294959104], + [1860960256, 4294836224], + [1861222400, 4293918720] + ], + [ + [1862270976, 4290772992], + [1866596352, 4294901760], + [1866711040, 4294963200], + [1866743808, 4294959104], + [1866989568, 4294443008], + [1867841536, 4294901760], + [1868283904, 4294959104], + [1869611008, 4294836224], + [1869742080, 4294836224], + [1869873152, 4294836224], + [1870055424, 4294965248], + [1870086144, 4294950912], + [1870102528, 4294959104], + [1870135296, 4294705152], + [1870397440, 4294901760], + [1870528512, 4294836224], + [1870659584, 4292870144], + [1872756736, 4294443008], + [1873412096, 4294901760], + [1873543168, 4294705152], + [1873805312, 4294443008], + [1874460672, 4294836224], + [1874853888, 4293918720], + [1875902464, 4294705152], + [1876164608, 4294705152], + [1876787200, 4294934528], + [1876819968, 4294901760], + [1876946944, 4294966272], + [1876948992, 4294966272], + [1876951040, 4294705152], + [1877213184, 4294705152], + [1877696512, 4294959104], + [1877711872, 4294966272], + [1877712896, 4294959104] + ], + [ + [1879048192, 4290772992], + [1883242496, 4294836224], + [1883373568, 4294836224], + [1883832320, 4294901760], + [1883897856, 4294836224], + [1884291072, 4294443008], + [1884815360, 4294443008], + [1885339648, 4294836224], + [1885470720, 4294836224], + [1885601792, 4294705152], + [1886224384, 4294934528], + [1886322688, 4294901760], + [1886388224, 4294705152], + [1886650368, 4294836224], + [1887043584, 4294836224], + [1887174656, 4294705152], + [1887436800, 4294705152], + [1887698944, 4294901760], + [1888038912, 4294965248], + [1891631104, 4294705152], + [1893728256, 4292870144] + ], + [ + [1895825408, 4294443008], + [1896349696, 4294836224], + [1896595456, 4294959104], + [1896611840, 4294705152], + [1896873984, 4294836224], + [1897005056, 4294901760], + [1897398272, 4294705152], + [1897857024, 4294901760], + [1898708992, 4294705152], + [1898971136, 4294705152], + [1899274240, 4294959104], + [1899364352, 4294836224], + [1899495424, 4294836224], + [1899626496, 4294901760], + [1899692032, 4294934528], + [1899749376, 4294966272], + [1899888640, 4294836224], + [1900019712, 4292870144], + [1902116864, 4293918720], + [1903165440, 4294443008], + [1903689728, 4294443008], + [1904214016, 4294836224], + [1904369664, 4294963200], + [1904373760, 4294965248], + [1904476160, 4294705152], + [1904738304, 4294443008], + [1908539392, 4294836224], + [1908761600, 4294966272], + [1908932608, 4294836224], + [1909063680, 4294901760], + [1909194752, 4294705152], + [1909481472, 4294959104], + [1909489664, 4294934528], + [1909522432, 4294901760], + [1909719040, 4294950912], + [1909744640, 4294966272], + [1909766144, 4294965248], + [1909784576, 4294934528], + [1909850112, 4294836224], + [1910112256, 4294836224], + [1910243328, 4294705152], + [1910505472, 4293918720], + [1911554048, 4294443008], + [1912078336, 4294705152] + ], + [ + [1914437632, 4294901760], + [1916141568, 4294836224], + [1916534784, 4294705152], + [1916796928, 4294705152], + [1917059072, 4294901760], + [1917796352, 4294950912], + [1917845504, 4293918720], + [1918894080, 4294443008], + [1919418368, 4294705152], + [1919811584, 4294963200], + [1919827968, 4294950912], + [1919877120, 4294959104], + [1919918080, 4294959104], + [1919942656, 4294705152], + [1920204800, 4294836224], + [1920335872, 4294901760], + [1920401408, 4294934528], + [1920434176, 4294950912], + [1920450560, 4294965248], + [1920452608, 4294966272], + [1920453632, 4294966272], + [1920454656, 4294963200], + [1920458752, 4294959104], + [1921253376, 4294901760], + [1921449984, 4294901760], + [1921646592, 4294836224], + [1921859584, 4294965248], + [1921875968, 4294950912], + [1925447680, 4294836224], + [1925642240, 4294965248], + [1926234112, 4294705152], + [1926496256, 4294836224], + [1926627328, 4294901760], + [1926692864, 4294901760], + [1926758400, 4294443008], + [1927282688, 4293918720], + [1928331264, 4293918720] + ], + [ + [1930952704, 4294705152], + [1931214848, 4294836224], + [1931476992, 4294705152], + [1932263424, 4294836224], + [1932394496, 4294901760], + [1932460032, 4294901760], + [1932525568, 4293918720], + [1933918208, 4294963200], + [1934884864, 4294950912], + [1934934016, 4294959104], + [1934999552, 4294950912], + [1935933440, 4294705152], + [1936195584, 4294705152], + [1937244160, 4294705152], + [1937510400, 4294963200], + [1939079168, 4294705152], + [1939341312, 4294836224], + [1939472384, 4294836224], + [1939603456, 4294836224], + [1939734528, 4294901760], + [1939800064, 4294901760], + [1940275200, 4294959104], + [1940389888, 4294705152], + [1940652032, 4294705152], + [1941176320, 4294705152], + [1941831680, 4294836224], + [1941962752, 4292870144], + [1944059904, 4293918720] + ], + [ + [1946159104, 4294965248], + [1946163200, 4294965248], + [1946222592, 4294901760], + [1946288128, 4294836224], + [1946419200, 4294705152], + [1946681344, 4294705152], + [1947009024, 4294901760], + [1947205632, 4293918720], + [1949433856, 4294963200], + [1949564928, 4294705152], + [1949827072, 4294836224], + [1949990912, 4294963200], + [1950011392, 4294963200], + [1950089216, 4294705152], + [1950482432, 4294934528], + [1950679040, 4294901760], + [1950744576, 4294934528], + [1951137792, 4294836224], + [1951268864, 4294836224], + [1951727616, 4294901760], + [1952026624, 4294963200], + [1952075776, 4294963200], + [1952102400, 4294965248], + [1952382976, 4294901760], + [1953497088, 4294705152], + [1953759232, 4294836224], + [1954545664, 4290772992], + [1958739968, 4294901760], + [1958809600, 4294963200], + [1958813696, 4294959104], + [1958850560, 4294965248], + [1958871040, 4294836224], + [1959002112, 4294901760], + [1959133184, 4294901760], + [1959198720, 4294934528], + [1959231488, 4294959104], + [1959526400, 4294836224], + [1959723008, 4294901760], + [1959788544, 4294705152], + [1960091648, 4294963200], + [1960132608, 4294950912], + [1960148992, 4294934528], + [1960189952, 4294959104], + [1960198144, 4294963200], + [1960214528, 4294934528], + [1960247296, 4294901760], + [1960312832, 4294705152], + [1960837120, 4293918720], + [1962016768, 4294836224], + [1962147840, 4294836224], + [1962278912, 4294836224], + [1962409984, 4294836224], + [1962622976, 4294950912], + [1962672128, 4294836224], + [1962835968, 4294934528], + [1962901504, 4294934528] + ], + [ + [1963458560, 4294443008], + [1964310528, 4294901760], + [1964376064, 4294836224], + [1964507136, 4294443008], + [1965031424, 4294443008], + [1965555712, 4294705152], + [1965817856, 4294836224], + [1966080000, 4294705152], + [1966419968, 4294963200], + [1966452736, 4294963200], + [1966669824, 4294901760], + [1966735360, 4294934528], + [1966800896, 4294901760], + [1966866432, 4294705152], + [1967128576, 4294443008], + [1967652864, 4294836224], + [1967800320, 4294963200], + [1967804416, 4294963200], + [1967816704, 4294934528], + [1967849472, 4294901760], + [1967915008, 4294705152], + [1968177152, 4293918720], + [1969487872, 4294836224], + [1969688576, 4294963200], + [1969694720, 4294965248], + [1969702912, 4294965248], + [1969717248, 4294963200], + [1969793024, 4294965248], + [1969881088, 4294836224], + [1970274304, 4294443008], + [1970814976, 4294950912], + [1970831360, 4294934528], + [1970864128, 4294934528], + [1970896896, 4294950912], + [1970913280, 4294965248], + [1970962432, 4294934528], + [1971060736, 4294705152], + [1971322880, 4290772992] + ], + [ + [1981284352, 4294836224], + [1981415424, 4294901760], + [1981546496, 4294836224], + [1981677568, 4294901760], + [1981743104, 4294901760], + [1983905792, 4294836224], + [1984036864, 4294901760], + [1984131072, 4294963200], + [1984430080, 4294443008], + [1984954368, 4294836224], + [1985216512, 4294836224], + [1985486848, 4294959104], + [1985495040, 4294950912], + [1985511424, 4294934528], + [1985544192, 4294901760], + [1985736704, 4294963200], + [1986400256, 4294963200], + [1986404352, 4294965248], + [1987051520, 4294443008], + [1987575808, 4294705152], + [1987837952, 4294836224], + [1987969024, 4294901760], + [1988067328, 4294959104], + [1988362240, 4294705152], + [1989148672, 4294705152], + [1991376896, 4294901760], + [1991507968, 4294705152], + [1991770112, 4294901760], + [1991901184, 4294836224], + [1992032256, 4294901760], + [1992163328, 4294836224], + [1992294400, 4294836224], + [1992425472, 4294934528], + [1992458240, 4294934528], + [1992491008, 4294934528], + [1992523776, 4294934528], + [1992556544, 4294705152], + [1992949760, 4294836224], + [1993080832, 4294705152], + [1993605120, 4294901760], + [1993670656, 4294901760], + [1994391552, 4294705152], + [1994653696, 4294836224], + [1994784768, 4294901760], + [1995374592, 4294901760], + [1995571200, 4294901760], + [1995702272, 4294705152], + [1995964416, 4294443008] + ], + [ + [1996488704, 4294836224], + [1996619776, 4294959104], + [1996652544, 4294934528], + [1996685312, 4294901760], + [1996750848, 4294705152], + [1997012992, 4294901760], + [1997144064, 4294934528], + [1997506560, 4294965248], + [1997537280, 4294901760], + [1997717504, 4294963200], + [1997721600, 4294965248], + [1997725696, 4294963200], + [1997729792, 4294963200], + [1997733888, 4294901760], + [1997799424, 4294705152], + [1998274560, 4294950912], + [1998290944, 4294959104], + [1998299136, 4294959104], + [1998307328, 4294950912], + [1998323712, 4294836224], + [1998467072, 4294963200], + [1998569472, 4294959104], + [1998585856, 4294705152], + [1998848000, 4294901760], + [1998913536, 4294934528], + [1998946304, 4294950912], + [1998962688, 4294950912], + [1998979072, 4294934528], + [1999011840, 4294950912], + [1999028224, 4294963200], + [1999032320, 4294963200], + [1999036416, 4294959104], + [1999044608, 4294901760], + [1999110144, 4294950912], + [1999126528, 4294963200], + [1999142912, 4294934528], + [1999175680, 4294901760], + [1999241216, 4294959104], + [1999273984, 4294965248], + [1999276032, 4294965248], + [1999298560, 4294959104], + [1999372288, 4294836224], + [1999634432, 4294443008], + [2000224256, 4294901760], + [2000289792, 4294901760], + [2000388096, 4294934528], + [2000420864, 4294901760], + [2000486400, 4294901760], + [2000551936, 4294901760], + [2000625664, 4294959104], + [2001457152, 4294963200], + [2001600512, 4294836224], + [2001731584, 4294901760], + [2001915904, 4294963200], + [2001993728, 4294705152], + [2002255872, 4294705152], + [2002780160, 4294443008], + [2003566592, 4294836224], + [2003828736, 4294443008], + [2004353024, 4294443008], + [2004877312, 4293918720], + [2005925888, 4294705152], + [2006228992, 4294963200], + [2006233088, 4294963200], + [2006433792, 4294950912], + [2007025664, 4294965248], + [2007072768, 4294934528], + [2007105536, 4294836224], + [2007236608, 4294705152], + [2008023040, 4293918720], + [2011693056, 4294836224], + [2011922432, 4294950912], + [2012741632, 4294705152], + [2013028352, 4294965248], + [2013065216, 4294963200], + [2013069312, 4294901760], + [2013134848, 4294836224] + ], + [ + [2013265920, 4293918720], + [2014838784, 4294705152], + [2015232000, 4294901760], + [2015297536, 4294901760], + [2015363072, 4294443008], + [2015887360, 4294705152], + [2016149504, 4294705152], + [2016411648, 4294836224], + [2016673792, 4294901760], + [2016739328, 4294901760], + [2016804864, 4294836224], + [2017460224, 4294705152], + [2017722368, 4294705152], + [2017992704, 4294959104], + [2018017280, 4294934528], + [2018246656, 4294705152], + [2018508800, 4294443008], + [2019035136, 4294965248], + [2019164160, 4294836224], + [2019295232, 4294901760], + [2019426304, 4294901760], + [2019491840, 4294901760], + [2021654528, 4294705152], + [2021916672, 4294934528], + [2021949440, 4294934528], + [2021982208, 4294901760], + [2022047744, 4294836224], + [2022211584, 4294950912], + [2022244352, 4294934528], + [2022670336, 4294959104], + [2025848832, 4290772992] + ], + [ + [2030045184, 4294965248], + [2030047232, 4294963200], + [2030305280, 4294836224], + [2030567424, 4294443008], + [2031091712, 4294443008], + [2031616000, 4294705152], + [2031878144, 4294836224], + [2032009216, 4294901760], + [2032074752, 4294901760], + [2032140288, 4294705152], + [2032402432, 4294901760], + [2032467968, 4294901760], + [2032533504, 4294836224], + [2032664576, 4294705152], + [2033057792, 4294950912], + [2033090560, 4294934528], + [2033123328, 4294901760], + [2033188864, 4294836224], + [2033321984, 4294965248], + [2033385472, 4294901760], + [2033491968, 4294959104], + [2033504256, 4294963200], + [2033508352, 4294959104], + [2033627136, 4294965248], + [2033647616, 4294950912], + [2033713152, 4294836224], + [2033844224, 4294934528], + [2033879040, 4294965248], + [2033881088, 4294963200], + [2033885184, 4294965248], + [2033909760, 4294901760], + [2033975296, 4294705152], + [2034499584, 4294705152], + [2035023872, 4294836224], + [2035253248, 4294950912], + [2035875840, 4294901760], + [2036629504, 4294934528], + [2036662272, 4294950912], + [2036715520, 4294963200], + [2042626048, 4294901760], + [2042691584, 4294901760], + [2042757120, 4294836224], + [2042888192, 4294705152], + [2043199488, 4294965248], + [2043215872, 4294901760], + [2043412480, 4294705152], + [2044723200, 4293918720], + [2046296064, 4294705152], + [2046754816, 4294901760] + ], + [ + [2046836736, 4294950912], + [2046853120, 4294934528], + [2047082496, 4294705152], + [2047344640, 4294901760], + [2047410176, 4294901760], + [2047475712, 4294934528], + [2047508480, 4294934528], + [2047541248, 4294934528], + [2047606784, 4294901760], + [2047672320, 4294901760], + [2047737856, 4294901760], + [2049966080, 4294901760], + [2050031616, 4294950912], + [2050162688, 4294901760], + [2051014656, 4292870144], + [2053111808, 4294836224], + [2053505024, 4294963200], + [2053521408, 4294963200], + [2053525504, 4294963200], + [2054160384, 4294705152], + [2054619136, 4294901760], + [2055239680, 4294965248], + [2055733248, 4294443008], + [2056290304, 4294934528], + [2056830976, 4294950912], + [2057043968, 4294705152], + [2059141120, 4294705152], + [2059403264, 4294705152], + [2059796480, 4294901760], + [2059943936, 4294950912], + [2060005376, 4294963200], + [2060189696, 4294705152], + [2061500416, 4293918720], + [2062548992, 4294443008], + [2063079424, 4294965248], + [2063085568, 4294963200], + [2063548416, 4294965248] + ], + [ + [2063630336, 4294950912], + [2063859712, 4294705152], + [2064121856, 4294443008], + [2066841600, 4294934528], + [2066915328, 4294959104], + [2067005440, 4294705152], + [2067267584, 4294836224], + [2067398656, 4294901760], + [2067464192, 4294901760], + [2067529728, 4294901760], + [2067595264, 4294901760], + [2067660800, 4294901760], + [2067791872, 4292870144], + [2069889024, 4294836224], + [2070020096, 4294934528], + [2070118400, 4294934528], + [2070151168, 4294959104], + [2070216704, 4294901760], + [2070347776, 4294934528], + [2070708224, 4294963200], + [2070728704, 4294963200], + [2070937600, 4293918720], + [2071986176, 4294443008], + [2072530944, 4294963200], + [2072576000, 4294901760], + [2072641536, 4294836224], + [2073034752, 4294705152], + [2073296896, 4294901760], + [2073362432, 4294901760], + [2073427968, 4294836224], + [2073559040, 4294443008], + [2074083328, 4294705152], + [2074345472, 4294705152], + [2074607616, 4294705152], + [2074869760, 4294836224], + [2075000832, 4294836224], + [2075147264, 4294966272], + [2075152384, 4294963200], + [2075197440, 4294901760], + [2075262976, 4294836224], + [2075394048, 4294705152], + [2075656192, 4294705152], + [2075918336, 4294705152], + [2076442624, 4294836224], + [2076672000, 4294934528], + [2077097984, 4294836224], + [2078801920, 4294705152], + [2079457280, 4294934528], + [2079588352, 4294705152], + [2079916032, 4294901760], + [2080178176, 4294901760] + ], + [ + [2080784384, 4294950912], + [2081292288, 4294836224], + [2081423360, 4294836224], + [2081685504, 4294901760], + [2081751040, 4294963200], + [2081755136, 4294963200], + [2081759232, 4294959104], + [2081767424, 4294950912], + [2081783808, 4294934528], + [2081816576, 4294836224], + [2082258944, 4294950912], + [2082275328, 4294934528], + [2082406400, 4294901760], + [2083024896, 4294963200], + [2083028992, 4294950912], + [2083045376, 4294959104], + [2083127296, 4294934528], + [2083160064, 4294934528], + [2083454976, 4294950912], + [2084569088, 4294836224], + [2084700160, 4294934528], + [2084765696, 4294901760], + [2084831232, 4294705152], + [2085093376, 4294901760], + [2085158912, 4294901760], + [2085224448, 4294836224], + [2085355520, 4294705152], + [2086141952, 4294901760], + [2086207488, 4294934528], + [2086240256, 4294934528], + [2086273024, 4294836224], + [2086404096, 4294705152], + [2087454720, 4294965248], + [2087462912, 4294965248], + [2087542784, 4294965248], + [2087714816, 4294836224], + [2087845888, 4294836224], + [2087976960, 4294901760], + [2088042496, 4294901760], + [2088108032, 4294836224], + [2088632320, 4294836224], + [2088763392, 4294443008], + [2090041344, 4294934528], + [2090270720, 4294901760], + [2090336256, 4294901760], + [2090598400, 4294901760], + [2090860544, 4294901760], + [2090926080, 4294901760], + [2090991616, 4294901760], + [2091057152, 4294901760], + [2091122688, 4294705152], + [2091646976, 4294836224], + [2091778048, 4294836224], + [2092957696, 4294836224], + [2093219840, 4294901760], + [2093481984, 4294443008], + [2094792704, 4294705152], + [2095054848, 4294901760], + [2095120384, 4294901760], + [2095185920, 4294836224], + [2095316992, 4294705152], + [2095579136, 4294836224], + [2095710208, 4294836224], + [2095841280, 4294705152], + [2096103424, 4294934528], + [2096136192, 4294950912], + [2096234496, 4294901760], + [2096349184, 4294950912], + [2096627712, 4294934528], + [2096693248, 4294901760], + [2096758784, 4294836224], + [2097020928, 4294950912] + ], + [ + [2099232768, 4294950912], + [2099249152, 4294901760], + [2099314688, 4294901760], + [2099380224, 4294901760], + [2099445760, 4294934528], + [2099478528, 4294934528], + [2099511296, 4294705152], + [2099773440, 4294443008], + [2100985856, 4294934528], + [2101182464, 4294934528], + [2101215232, 4294950912], + [2101346304, 4294443008], + [2101870592, 4294901760], + [2101936128, 4294901760], + [2102001664, 4294836224], + [2102132736, 4294934528], + [2102165504, 4294934528], + [2102198272, 4294901760], + [2102263808, 4294836224], + [2102394880, 4294443008], + [2102919168, 4294443008], + [2103443456, 4294836224], + [2103574528, 4294901760], + [2103967744, 4294443008], + [2104492032, 4293918720], + [2108227584, 4294901760], + [2108358656, 4294901760], + [2110783488, 4294950912], + [2110914560, 4294901760], + [2110980096, 4294901760], + [2111111168, 4294934528], + [2111201280, 4294959104], + [2111242240, 4294950912], + [2111307776, 4294836224], + [2111438848, 4294901760], + [2111504384, 4294901760], + [2111569920, 4294836224], + [2111700992, 4294836224], + [2113830912, 4294950912], + [2113847296, 4294950912] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [2260992000, 4294901760] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [2332622848, 4294901760], + [2340487168, 4294901760], + [2341732352, 4294901760], + [2342191104, 4294901760], + [2342453248, 4294901760], + [2343174144, 4294901760], + [2343567360, 4294901760], + [2344026112, 4294901760], + [2344222720, 4294901760], + [2344419328, 4294901760], + [2344878080, 4294705152], + [2345140224, 4294443008], + [2345664512, 4294443008], + [2346254336, 4294901760], + [2346385408, 4294901760], + [2346450944, 4294836224], + [2346713088, 4294901760], + [2346844160, 4294836224] + ], + [ + [2353725440, 4294901760], + [2358181888, 4294901760], + [2362245120, 4294901760], + [2362310656, 4294836224], + [2362572800, 4294901760], + [2363490304, 4294901760], + [2364342272, 4294901760], + [2364538880, 4294901760], + [2364735488, 4294901760], + [2364932096, 4294901760], + [2365128704, 4294901760], + [2365194240, 4294901760], + [2365521920, 4294901760] + ], + [ + ], + [ + ], + [ + ], + [ + [2415919104, 4294901760], + [2416377856, 4294901760], + [2416705536, 4294901760], + [2419326976, 4294901760], + [2423980032, 4294901760], + [2432630784, 4294901760] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [2516582400, 4294901760], + [2524119040, 4294901760], + [2524512256, 4294901760], + [2524577792, 4294901760], + [2525075456, 4294966272], + [2525085696, 4294966272], + [2525091840, 4294966272], + [2525101056, 4294966272], + [2525626368, 4294836224], + [2531196928, 4294901760], + [2532442112, 4294966272], + [2532443136, 4294966272], + [2532444160, 4294966272], + [2532449280, 4294966272], + [2532453376, 4294966272], + [2532454400, 4294966272], + [2532455424, 4294966272], + [2532456448, 4294966272], + [2532461568, 4294966272], + [2532462592, 4294966272], + [2532465664, 4294966272], + [2532466688, 4294966272], + [2532470784, 4294966272], + [2532471808, 4294966272], + [2532472832, 4294966272], + [2532481024, 4294966272], + [2532482048, 4294966272], + [2532483072, 4294966272], + [2532484096, 4294966272], + [2532485120, 4294966272], + [2532489216, 4294966272], + [2532490240, 4294966272], + [2532491264, 4294966272], + [2532496384, 4294966272], + [2532499456, 4294966272], + [2532501504, 4294966272], + [2532502528, 4294966272], + [2532503552, 4294966272], + [2532504576, 4294966272], + [2532505600, 4294966272], + [2533294080, 4294901760] + ], + [ + ], + [ + [2556985344, 4294934528] + ], + [ + [2566914048, 4294901760], + [2567110656, 4294901760], + [2569142272, 4294836224], + [2569273344, 4294836224], + [2573402112, 4294901760], + [2573533184, 4294901760], + [2574647296, 4294836224] + ], + [ + ], + [ + ], + [ + ], + [ + [2634022912, 4294901760], + [2635202560, 4294901760], + [2638020608, 4294901760], + [2642018304, 4294901760], + [2643722240, 4294901760], + [2644246528, 4294901760], + [2650734592, 4294901760] + ], + [ + ], + [ + [2682388480, 4294901760] + ], + [ + ], + [ + [2714697728, 4294901760] + ], + [ + [2724790272, 4294901760] + ], + [ + [2734686208, 4294901760], + [2737767424, 4294966272], + [2738159616, 4294966272], + [2738160640, 4294966272], + [2738161664, 4294966272], + [2738162688, 4294966272], + [2738168832, 4294966272], + [2738169856, 4294966272], + [2738170880, 4294966272], + [2738171904, 4294966272], + [2738172928, 4294966272], + [2738173952, 4294966272], + [2738174976, 4294966272], + [2738176000, 4294966272], + [2738182144, 4294966272], + [2738183168, 4294966272], + [2738184192, 4294966272], + [2738185216, 4294966272], + [2738186240, 4294966272], + [2738187264, 4294966272], + [2738188288, 4294966272], + [2738189312, 4294966272], + [2738190336, 4294966272], + [2738191360, 4294966272], + [2738192384, 4294966272], + [2738193408, 4294966272], + [2738194432, 4294966272], + [2738200576, 4294966272], + [2738201600, 4294966272], + [2738202624, 4294966272], + [2738203648, 4294966272], + [2738207744, 4294966272], + [2738215936, 4294966272], + [2738221056, 4294966272], + [2742878208, 4294901760], + [2743992320, 4294901760], + [2746286080, 4294901760], + [2746417152, 4294901760], + [2748055552, 4294901760] + ], + [ + ], + [ + ], + [ + [2792292352, 4294901760] + ], + [ + [2810904576, 4294901760], + [2814181376, 4294901760] + ], + [ + [2829058048, 4294901760] + ], + [ + ], + [ + ], + [ + [2869428224, 4294443008], + [2871132160, 4294836224], + [2871263232, 4294705152], + [2871525376, 4294443008], + [2874146816, 4294705152], + [2874408960, 4294705152], + [2874671104, 4294443008], + [2875719680, 4294443008], + [2876243968, 4294705152], + [2876506112, 4294705152], + [2876768256, 4294443008], + [2882535424, 4293918720] + ], + [ + ], + [ + ], + [ + ], + [ + [2936012800, 4293918720], + [2937061376, 4294443008], + [2937585664, 4294705152], + [2937978880, 4294836224], + [2938765312, 4294836224], + [2938896384, 4294901760], + [2939027456, 4294836224], + [2939158528, 4293918720], + [2940207104, 4292870144], + [2942697472, 4294901760], + [2942992384, 4294934528], + [2945581056, 4294836224], + [2945712128, 4294705152], + [2945974272, 4294705152], + [2946498560, 4293918720], + [2947678208, 4294901760], + [2948104192, 4294950912], + [2948136960, 4294901760], + [2948202496, 4294836224], + [2948333568, 4294705152] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [3024879616, 4294901760], + [3024945152, 4294901760], + [3025010688, 4294836224], + [3025403904, 4294836224], + [3025534976, 4294901760], + [3025666048, 4294705152], + [3026073600, 4294965248], + [3026083840, 4294963200], + [3026157568, 4294934528], + [3026190336, 4292870144], + [3028385792, 4294934528], + [3028418560, 4294901760], + [3028811776, 4294443008], + [3029602304, 4294965248], + [3029637120, 4294965248], + [3029653504, 4294965248], + [3029655552, 4294959104], + [3029696512, 4294959104], + [3029770240, 4294959104], + [3029860352, 4294443008], + [3030384640, 4293918720], + [3031613440, 4294950912], + [3031957504, 4294705152], + [3032219648, 4294934528], + [3032323072, 4294966272], + [3033070592, 4294966272], + [3033071616, 4294901760], + [3033137152, 4294836224], + [3033530368, 4294836224], + [3033718784, 4294959104], + [3033792512, 4294836224], + [3034505216, 4294959104], + [3034513408, 4294901760], + [3035168768, 4294950912], + [3035185152, 4294959104], + [3035316224, 4294959104] + ], + [ + ], + [ + [3054551040, 4294959104], + [3054632960, 4294934528], + [3055007744, 4294965248], + [3055011840, 4294965248], + [3055550464, 4293918720], + [3056623616, 4294959104], + [3056664576, 4294901760], + [3056730112, 4294963200], + [3056758784, 4294963200], + [3056795648, 4294901760], + [3056992256, 4294934528], + [3057451008, 4294901760], + [3058696192, 4294705152], + [3058958336, 4294705152], + [3059220480, 4294705152], + [3059482624, 4294901760], + [3059744768, 4293918720], + [3060793344, 4293918720], + [3061841920, 4293918720], + [3062890496, 4294443008], + [3063742464, 4294901760], + [3063955456, 4294959104], + [3064856576, 4294836224], + [3066560512, 4294443008], + [3068952576, 4294934528], + [3069050880, 4294901760], + [3069116416, 4294959104], + [3069181952, 4294443008], + [3070099456, 4294901760] + ], + [ + [3070230528, 4290772992], + [3074424832, 4294443008], + [3075388416, 4294966272], + [3075585024, 4294966272], + [3075735552, 4294836224], + [3076227072, 4294966272], + [3076229120, 4294965248], + [3076231168, 4294963200], + [3076259840, 4294705152], + [3078619136, 4292870144], + [3080716288, 4294443008], + [3081240576, 4294836224], + [3081371648, 4294901760], + [3081502720, 4294705152], + [3082158080, 4294959104], + [3082289152, 4294443008], + [3082813440, 4290772992] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [3229391360, 4294967040], + [3233589760, 4294967040] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [3389023232, 4294966784], + [3389028864, 4294966784], + [3389042688, 4294966272], + [3389227008, 4294966784], + [3389292544, 4294959104], + [3389324288, 4294966272], + [3389392384, 4294966784], + [3389407744, 4294966784], + [3389409280, 4294966784], + [3389413120, 4294967040], + [3389413376, 4294966784], + [3389414400, 4294966784], + [3389417216, 4294967040], + [3389418496, 4294967040], + [3389419008, 4294966784], + [3389420032, 4294967040], + [3389435904, 4294963200], + [3389521920, 4294967040], + [3389522432, 4294966784], + [3389522944, 4294966784], + [3389524992, 4294967040], + [3389528064, 4294967040], + [3389541632, 4294967040], + [3389554688, 4294959104], + [3389571072, 4294963200], + [3389595648, 4294967040], + [3389596160, 4294966784], + [3389599744, 4294966784], + [3389600512, 4294967040], + [3389600768, 4294966784], + [3389601280, 4294967040], + [3389602048, 4294967040], + [3389602304, 4294966784], + [3389669376, 4294963200], + [3389784320, 4294967040], + [3389784576, 4294967040], + [3389788416, 4294967040], + [3389788672, 4294967040], + [3389788928, 4294967040], + [3389802496, 4294967040], + [3389805568, 4294966784], + [3389808640, 4294967040], + [3389809152, 4294966784], + [3389811200, 4294967040], + [3389812480, 4294967040], + [3389813760, 4294967040], + [3389931520, 4294966784], + [3389932800, 4294967040], + [3389933824, 4294967040], + [3389934080, 4294966784], + [3389934592, 4294967040], + [3389935104, 4294966784], + [3389937664, 4294967040], + [3389939968, 4294967040], + [3389941760, 4294966784], + [3389942784, 4294966784], + [3389943552, 4294967040], + [3389944320, 4294966784], + [3389945344, 4294966784], + [3389946880, 4294966784], + [3389947648, 4294967040], + [3389948160, 4294967040], + [3389949696, 4294967040], + [3389949952, 4294967040], + [3389953280, 4294967040], + [3389953792, 4294967040], + [3389955328, 4294967040], + [3389955584, 4294966784], + [3389958400, 4294967040], + [3389958656, 4294966784], + [3389960192, 4294967040], + [3389962240, 4294966784], + [3389968384, 4294966784], + [3389969664, 4294967040], + [3389971200, 4294967040], + [3389971456, 4294967040], + [3389971968, 4294966784], + [3389972736, 4294967040], + [3389972992, 4294966784], + [3389974272, 4294967040], + [3389975296, 4294967040], + [3389975552, 4294966784], + [3389976064, 4294967040], + [3389976320, 4294967040], + [3389978112, 4294967040], + [3389979392, 4294967040], + [3390325248, 4294967040], + [3390328576, 4294967040], + [3390330624, 4294967040], + [3390330880, 4294966784], + [3390331392, 4294967040], + [3390332416, 4294966784], + [3390337536, 4294967040], + [3390338304, 4294967040], + [3390339072, 4294967040], + [3390340352, 4294967040], + [3390340864, 4294967040], + [3390407424, 4294967040], + [3390407680, 4294967040], + [3390409984, 4294967040], + [3390410240, 4294967040], + [3390411520, 4294967040], + [3390411776, 4294967040], + [3390412288, 4294966784], + [3390412800, 4294966784], + [3390413312, 4294967040], + [3390413824, 4294967040], + [3390502912, 4294966272], + [3390503936, 4294966272], + [3390801920, 4294966784], + [3391488000, 4294966784], + [3391488512, 4294966784], + [3391490048, 4294965248], + [3391500288, 4294963200], + [3391504384, 4294959104], + [3391512576, 4294959104], + [3391520768, 4294966784], + [3391521280, 4294966784], + [3391521792, 4294966784], + [3391522304, 4294967040], + [3391522560, 4294967040], + [3391522816, 4294966784], + [3391523328, 4294967040], + [3391523840, 4294966784], + [3391524352, 4294966784], + [3391525376, 4294966784], + [3391526144, 4294967040], + [3391526400, 4294966784], + [3391526912, 4294966784], + [3391527424, 4294966784], + [3391527936, 4294967040], + [3391528448, 4294966784], + [3391528960, 4294966784], + [3391529984, 4294966272], + [3391531008, 4294966784], + [3391531520, 4294967040], + [3391531776, 4294967040], + [3391533056, 4294966784], + [3391535104, 4294965248], + [3391537152, 4294950912], + [3391620096, 4294966784], + [3391620864, 4294967040], + [3391622912, 4294967040], + [3391653632, 4294967040], + [3391653888, 4294967040], + [3391654912, 4294967040], + [3391655680, 4294967040], + [3391655936, 4294966784], + [3391657472, 4294967040], + [3391658752, 4294967040], + [3391659008, 4294967040], + [3391659520, 4294966784], + [3391660544, 4294967040], + [3391686656, 4294966784], + [3391687424, 4294967040], + [3391687680, 4294966784], + [3391717376, 4294967040], + [3391717888, 4294966784], + [3391723520, 4294965248], + [3391733760, 4294967040], + [3391746048, 4294963200], + [3391835136, 4294966272], + [3391852544, 4294963200], + [3391885312, 4294963200], + [3391898368, 4294967040], + [3391900160, 4294967040], + [3391914240, 4294967040], + [3391915008, 4294966784], + [3391918592, 4294966784], + [3391946752, 4294966784], + [3391947264, 4294967040], + [3391950592, 4294967040], + [3391950848, 4294963200], + [3392016384, 4294966784], + [3392016896, 4294967040], + [3392017408, 4294966784], + [3392020480, 4294959104], + [3392045056, 4294967040], + [3392069632, 4294963200], + [3392098816, 4294966784], + [3392110080, 4294967040], + [3392110592, 4294967040], + [3392111104, 4294966784], + [3392794624, 4294963200], + [3392798720, 4294967040], + [3392864256, 4294967040], + [3392918528, 4294966272], + [3392923648, 4294966784], + [3392924672, 4294967040], + [3392942080, 4294965248], + [3392954368, 4294965248], + [3392958464, 4294963200], + [3392963584, 4294966272], + [3392964608, 4294965248], + [3392966656, 4294963200], + [3393089536, 4294966272], + [3393124352, 4294966272], + [3393125376, 4294967040], + [3393126144, 4294967040], + [3393147136, 4294967040], + [3393147392, 4294966784], + [3393147904, 4294966272], + [3393148928, 4294965248], + [3393167360, 4294959104], + [3393189888, 4294966272], + [3393257472, 4294965248], + [3393259520, 4294966784], + [3393388544, 4294966272], + [3393520640, 4294966272], + [3393523712, 4294963200], + [3393585152, 4294959104], + [3393609728, 4294963200], + [3393634304, 4294963200], + [3393726464, 4294965248], + [3393736704, 4294963200], + [3393814528, 4294966272], + [3393849344, 4294965248], + [3393867776, 4294963200], + [3393912320, 4294966784], + [3393966080, 4294963200], + [3393977344, 4294966272], + [3394042880, 4294966272], + [3394064384, 4294965248], + [3394067456, 4294966272], + [3394111488, 4294965248], + [3394232320, 4294965248], + [3394238464, 4294966272], + [3394289664, 4294965248], + [3394291712, 4294965248], + [3394306048, 4294966272], + [3394501632, 4294966272], + [3394502656, 4294966272], + [3394503680, 4294966272], + [3394504704, 4294965248], + [3394506752, 4294966784], + [3394508800, 4294965248], + [3394621440, 4294963200], + [3394697472, 4294967040], + [3394698240, 4294966272], + [3394719744, 4294963200], + [3394832384, 4294965248], + [3394895872, 4294966272], + [3394924544, 4294963200], + [3394946048, 4294967040], + [3394953216, 4294963200], + [3394961408, 4294966272], + [3394985984, 4294963200], + [3394994176, 4294966272], + [3395006464, 4294963200], + [3395018752, 4294959104], + [3395026944, 4294966272], + [3395028992, 4294965248], + [3395039232, 4294963200], + [3395091456, 4294966272], + [3395092480, 4294966272], + [3395156992, 4294966272], + [3395181568, 4294966272], + [3395223552, 4294966272], + [3395224576, 4294966272], + [3395225600, 4294965248], + [3395227648, 4294963200], + [3395284992, 4294965248], + [3395288064, 4294966272], + [3395289088, 4294950912], + [3395305472, 4294965248], + [3395307520, 4294965248], + [3395309568, 4294963200], + [3395313664, 4294965248], + [3395315712, 4294965248], + [3395317760, 4294963200], + [3395321856, 4294965248], + [3395323904, 4294965248], + [3395325952, 4294963200], + [3395330048, 4294965248], + [3395332096, 4294965248], + [3395334144, 4294963200], + [3395338240, 4294965248], + [3395340288, 4294965248], + [3395342336, 4294963200], + [3395346432, 4294965248], + [3395348480, 4294965248], + [3395350528, 4294963200], + [3395354624, 4294965248], + [3395356672, 4294965248], + [3395358720, 4294963200], + [3395362816, 4294959104], + [3395371008, 4294959104], + [3395379200, 4294963200], + [3395383296, 4294963200], + [3395387392, 4294950912], + [3395403776, 4294959104], + [3395411968, 4294965248], + [3395414016, 4294965248], + [3395416064, 4294963200], + [3395420160, 4294965248], + [3395422208, 4294965248], + [3395424256, 4294963200], + [3395428352, 4294965248], + [3395430400, 4294965248], + [3395432448, 4294963200], + [3395436544, 4294959104], + [3395444736, 4294965248], + [3395446784, 4294965248], + [3395448832, 4294963200], + [3395452928, 4294959104], + [3395461120, 4294965248], + [3395463168, 4294965248], + [3395465216, 4294963200], + [3395469312, 4294965248], + [3395471360, 4294965248], + [3395473408, 4294963200], + [3395477504, 4294965248], + [3395479552, 4294965248], + [3395481600, 4294963200], + [3395485696, 4294950912], + [3395502080, 4294959104], + [3395510272, 4294965248], + [3395512320, 4294965248], + [3395514368, 4294963200], + [3395518464, 4294959104], + [3395526656, 4294965248], + [3395528704, 4294965248], + [3395530752, 4294963200], + [3395534848, 4294965248], + [3395536896, 4294965248], + [3395538944, 4294963200], + [3395543040, 4294965248], + [3395545088, 4294965248], + [3395547136, 4294963200], + [3395551232, 4294965248], + [3395553280, 4294965248], + [3395555328, 4294963200], + [3395559424, 4294959104], + [3395567616, 4294965248], + [3395569664, 4294965248], + [3395571712, 4294963200], + [3395575808, 4294965248], + [3395577856, 4294965248], + [3395579904, 4294963200], + [3395584000, 4294965248], + [3395586048, 4294965248], + [3395588096, 4294963200], + [3395592192, 4294965248], + [3395594240, 4294965248], + [3395596288, 4294963200], + [3395600384, 4294965248], + [3395602432, 4294965248], + [3395604480, 4294963200], + [3395608576, 4294959104], + [3395616768, 4294950912], + [3395633152, 4294959104], + [3395641344, 4294959104], + [3395649536, 4294950912], + [3395665920, 4294959104], + [3395674112, 4294965248], + [3395676160, 4294965248], + [3395678208, 4294963200], + [3395682304, 4294959104], + [3395690496, 4294959104], + [3395698688, 4294950912], + [3395715072, 4294965248], + [3395717120, 4294965248], + [3395719168, 4294963200], + [3395723264, 4294959104], + [3395731456, 4294965248], + [3395733504, 4294965248], + [3395735552, 4294963200], + [3395739648, 4294965248], + [3395741696, 4294965248], + [3395743744, 4294963200], + [3395747840, 4294965248], + [3395749888, 4294965248], + [3395751936, 4294963200], + [3395756032, 4294959104], + [3395764224, 4294959104], + [3395772416, 4294965248], + [3395774464, 4294965248], + [3395776512, 4294963200], + [3395780608, 4294950912], + [3395796992, 4294959104], + [3395805184, 4294965248], + [3395807232, 4294965248], + [3395809280, 4294963200], + [3395813376, 4294836224], + [3395944448, 4294901760], + [3396009984, 4294934528], + [3396042752, 4294934528], + [3396075520, 4294901760], + [3396141056, 4294901760], + [3396206592, 4294950912], + [3396222976, 4294950912], + [3396239360, 4294950912], + [3396255744, 4294950912], + [3396272128, 4294934528], + [3396304896, 4294959104], + [3396313088, 4294959104], + [3396321280, 4294950912], + [3396337664, 4294901760], + [3396403200, 4294963200], + [3396407296, 4294963200], + [3396411392, 4294959104], + [3396419584, 4294950912], + [3396435968, 4294950912], + [3396452352, 4294959104], + [3396460544, 4294963200], + [3396464640, 4294963200], + [3396468736, 4294959104], + [3396476928, 4294959104], + [3396485120, 4294950912], + [3396501504, 4294934528], + [3396534272, 4294959104], + [3396542464, 4294959104], + [3396550656, 4294950912], + [3396567040, 4294934528], + [3396599808, 4294959104], + [3396608000, 4294963200], + [3396612096, 4294963200], + [3396616192, 4294959104], + [3396624384, 4294959104], + [3396632576, 4294934528], + [3396665344, 4294950912], + [3396681728, 4294950912], + [3396698112, 4294934528], + [3396730880, 4294959104], + [3396739072, 4294959104], + [3396747264, 4294950912], + [3396763648, 4294934528], + [3396796416, 4294959104], + [3396804608, 4294959104], + [3396812800, 4294963200], + [3396816896, 4294963200], + [3396820992, 4294959104], + [3396829184, 4294934528], + [3396861952, 4294950912], + [3396878336, 4294950912], + [3396894720, 4294934528], + [3396927488, 4294901760], + [3396993024, 4294965248], + [3397001216, 4294965248], + [3397009408, 4294959104], + [3397021696, 4294965248], + [3397023744, 4294965248], + [3397025792, 4294967040], + [3397026816, 4294967040], + [3397083136, 4294963200], + [3397128192, 4294965248], + [3397130240, 4294966272], + [3397218304, 4294963200], + [3397234688, 4294963200], + [3397320704, 4294966784], + [3397321216, 4294967040], + [3397321472, 4294967040], + [3397321728, 4294967040], + [3397321984, 4294967040], + [3397322240, 4294966784], + [3397323776, 4294966272], + [3397324800, 4294963200], + [3397330944, 4294965248], + [3397332992, 4294963200], + [3397349376, 4294963200], + [3397353472, 4294963200], + [3397357568, 4294963200], + [3397361664, 4294965248], + [3397369856, 4294966784], + [3397370368, 4294966784], + [3397370880, 4294966272], + [3397371904, 4294965248], + [3397373952, 4294967040], + [3397374208, 4294967040], + [3397374976, 4294966272], + [3397376000, 4294965248], + [3397378048, 4294959104], + [3397517312, 4294959104], + [3397574656, 4294959104], + [3397586944, 4294965248], + [3397595136, 4294963200], + [3397636096, 4294963200], + [3397722112, 4294963200], + [3397794304, 4294967040], + [3397812224, 4294963200], + [3397922816, 4294963200], + [3397963776, 4294963200], + [3397967872, 4294963200], + [3398035200, 4294967040], + [3398279168, 4294959104], + [3398307840, 4294963200], + [3398370304, 4294966272], + [3398373376, 4294963200], + [3398377472, 4294963200], + [3398383616, 4294965248], + [3398606848, 4294963200], + [3398614016, 4294966272], + [3398616064, 4294966272], + [3398617088, 4294965248], + [3398668288, 4294963200], + [3398705152, 4294963200], + [3398713344, 4294959104], + [3398721536, 4294959104], + [3398770688, 4294959104], + [3398803456, 4294959104], + [3398819840, 4294959104], + [3398832128, 4294963200], + [3398836224, 4294963200], + [3398842368, 4294966272], + [3398877184, 4294963200], + [3398885376, 4294959104], + [3398893568, 4294966272], + [3398926336, 4294959104], + [3399004160, 4294963200], + [3399024640, 4294966272], + [3399036928, 4294963200], + [3399335936, 4294959104], + [3399393280, 4294959104], + [3399528448, 4294963200], + [3399631616, 4294967040], + [3399633664, 4294967040], + [3399745536, 4294963200], + [3399770112, 4294959104], + [3399835648, 4294963200], + [3399856128, 4294963200], + [3399864320, 4294963200], + [3399872256, 4294967040], + [3399872512, 4294966784], + [3399873280, 4294967040], + [3399873792, 4294967040], + [3399875328, 4294967040], + [3399875584, 4294966272], + [3399933952, 4294959104], + [3400048640, 4294963200], + [3400052736, 4294963200], + [3400171520, 4294959104], + [3400194048, 4294965248], + [3400196096, 4294959104], + [3400259584, 4294965248], + [3400264448, 4294967040], + [3400269824, 4294966272], + [3400335360, 4294966272], + [3400337408, 4294965248], + [3400392704, 4294959104], + [3400417280, 4294963200], + [3400589312, 4294959104], + [3400790016, 4294963200], + [3400826880, 4294959104], + [3400847360, 4294965248], + [3400888320, 4294963200], + [3400933376, 4294963200], + [3400974336, 4294959104], + [3401383936, 4294950912], + [3401404416, 4294963200], + [3401431040, 4294965248], + [3401515008, 4294967040], + [3401532416, 4294966272], + [3401533440, 4294965248], + [3401535488, 4294963200], + [3401580544, 4294443008], + [3402104832, 4294705152], + [3402366976, 4294705152] + ], + [ + [3405775872, 4294966272], + [3405777408, 4294966784], + [3405779456, 4294967040], + [3405780992, 4294967040], + [3405785600, 4294966784], + [3405786368, 4294967040], + [3405786624, 4294966784], + [3405795584, 4294967040], + [3405795840, 4294966784], + [3405797888, 4294966784], + [3405799424, 4294966784], + [3405801472, 4294965248], + [3405804032, 4294966784], + [3405806080, 4294967040], + [3405807616, 4294967040], + [3405808128, 4294966784], + [3405808640, 4294966272], + [3405809920, 4294967040], + [3405811200, 4294967040], + [3405811712, 4294967040], + [3405812224, 4294967040], + [3405812736, 4294967040], + [3405813248, 4294966784], + [3405813760, 4294967040], + [3405820160, 4294967040], + [3405832192, 4294967040], + [3405841408, 4294966272], + [3405844992, 4294967040], + [3405847040, 4294966784], + [3405857024, 4294967040], + [3405857280, 4294966784], + [3405858304, 4294966784], + [3405859840, 4294966784], + [3405863424, 4294967040], + [3405865216, 4294967040], + [3405865472, 4294966784], + [3405865984, 4294966272], + [3405868032, 4294967040], + [3405905152, 4294967040], + [3405905408, 4294967040], + [3405922304, 4294965248], + [3405924608, 4294967040], + [3405934592, 4294965248], + [3405938176, 4294966784], + [3405941760, 4294967040], + [3405944320, 4294967040], + [3405944832, 4294966272], + [3405945856, 4294966784], + [3405946880, 4294965248], + [3405952000, 4294966784], + [3405956096, 4294966784], + [3405959424, 4294967040], + [3405960704, 4294966784], + [3405963776, 4294966784], + [3405964544, 4294967040], + [3405966336, 4294966784], + [3405988864, 4294967040], + [3405989888, 4294966784], + [3405990656, 4294967040], + [3405991936, 4294965248], + [3405996032, 4294966272], + [3405998336, 4294967040], + [3406000128, 4294965248], + [3406002176, 4294967040], + [3406002944, 4294967040], + [3406006016, 4294967040], + [3406007040, 4294967040], + [3406008064, 4294967040], + [3406070784, 4294966784], + [3406071296, 4294967040], + [3406075648, 4294967040], + [3406075904, 4294966272], + [3406081536, 4294966784], + [3406083072, 4294967040], + [3406084608, 4294967040], + [3406089472, 4294967040], + [3406090240, 4294966272], + [3406095104, 4294967040], + [3406095872, 4294966784], + [3406103552, 4294966784], + [3406104320, 4294967040], + [3406104576, 4294966784], + [3406105344, 4294967040], + [3406107904, 4294967040], + [3406108160, 4294967040], + [3406113792, 4294967040], + [3406114304, 4294966784], + [3406115840, 4294966272], + [3406116864, 4294966784], + [3406117888, 4294966784], + [3406131712, 4294966784], + [3406132736, 4294967040], + [3406133248, 4294967040], + [3406146560, 4294967040], + [3406148608, 4294966784], + [3406149120, 4294967040], + [3406149888, 4294967040], + [3406150144, 4294967040], + [3406150656, 4294966784], + [3406151168, 4294967040], + [3406152448, 4294967040], + [3406157312, 4294966784], + [3406158336, 4294966784], + [3406201600, 4294967040], + [3406202880, 4294967040], + [3406203392, 4294966784], + [3406204416, 4294967040], + [3406206464, 4294966784], + [3406208256, 4294967040], + [3406208768, 4294967040], + [3406225408, 4294963200], + [3406231552, 4294966784], + [3406266624, 4294967040], + [3406268928, 4294966784], + [3406271232, 4294967040], + [3406272000, 4294966784], + [3406274048, 4294967040], + [3406282752, 4294966784], + [3406284800, 4294967040], + [3406299136, 4294967040], + [3406301184, 4294967040], + [3406305024, 4294967040], + [3406305280, 4294965248], + [3406317056, 4294967040], + [3406320128, 4294967040], + [3406321152, 4294966784], + [3406322432, 4294967040], + [3406327296, 4294966784], + [3406328576, 4294967040], + [3406341632, 4294966784], + [3406342400, 4294967040], + [3406343424, 4294967040], + [3406346240, 4294967040], + [3406346752, 4294966784], + [3406347776, 4294966784], + [3406348288, 4294967040], + [3406349568, 4294967040], + [3406349824, 4294966784], + [3406351104, 4294967040], + [3406352640, 4294967040], + [3406352896, 4294966784], + [3406353408, 4294966272], + [3406354688, 4294967040], + [3406355456, 4294967040], + [3406372864, 4294967040], + [3406373888, 4294966784], + [3406379264, 4294967040], + [3406380800, 4294967040], + [3406381312, 4294967040], + [3406382592, 4294966784], + [3406383104, 4294967040], + [3406383872, 4294967040], + [3406384128, 4294966784], + [3406389248, 4294966272], + [3406390272, 4294966784], + [3406392320, 4294967040], + [3406405120, 4294967040], + [3406438912, 4294967040], + [3406444544, 4294967040], + [3406449152, 4294966784], + [3406451712, 4294966272], + [3406452736, 4294967040], + [3406454528, 4294967040], + [3406462208, 4294967040], + [3406513664, 4294967040], + [3406515200, 4294966272], + [3406516736, 4294967040], + [3406517248, 4294966272], + [3406521344, 4294966272], + [3406523648, 4294967040], + [3406525696, 4294967040], + [3406526976, 4294967040], + [3406528000, 4294967040], + [3406530560, 4294966272], + [3406531840, 4294967040], + [3406532096, 4294966784], + [3406541824, 4294966272], + [3406548992, 4294966272], + [3406565376, 4294967040], + [3406566144, 4294967040], + [3406567424, 4294967040], + [3406575872, 4294967040], + [3406577920, 4294967040], + [3406578176, 4294967040], + [3406579200, 4294966784], + [3406583552, 4294967040], + [3406583808, 4294965248], + [3406586880, 4294966784], + [3406587648, 4294967040], + [3406590464, 4294967040], + [3406591488, 4294967040], + [3406594560, 4294967040], + [3406596352, 4294967040], + [3406611456, 4294966272], + [3406612480, 4294965248], + [3406615296, 4294967040], + [3406617344, 4294967040], + [3406619136, 4294967040], + [3406622720, 4294966272], + [3406631424, 4294967040], + [3406632960, 4294967040], + [3406638080, 4294966784], + [3406647296, 4294965248], + [3406649344, 4294966784], + [3406650368, 4294966272], + [3406671104, 4294967040], + [3406684160, 4294966784], + [3406684928, 4294967040], + [3406686464, 4294967040], + [3406698496, 4294966272], + [3406700800, 4294967040], + [3406706688, 4294967040], + [3406707968, 4294967040], + [3406708224, 4294967040], + [3406718976, 4294967040], + [3406721536, 4294966784], + [3406722560, 4294967040], + [3406733824, 4294967040], + [3406739456, 4294965248], + [3406741504, 4294967040], + [3406742016, 4294966784], + [3406747136, 4294967040], + [3406751488, 4294967040], + [3406755328, 4294967040], + [3406757888, 4294963200], + [3406763008, 4294966784], + [3406763520, 4294967040], + [3406780160, 4294967040], + [3406780416, 4294966784], + [3406784768, 4294967040], + [3406786560, 4294965248], + [3406791168, 4294966784], + [3406796032, 4294967040], + [3406796544, 4294967040], + [3406797824, 4294966272], + [3406802432, 4294967040], + [3406816000, 4294967040], + [3406817280, 4294965248], + [3406819328, 4294966784], + [3406820864, 4294967040], + [3406825984, 4294967040], + [3406826496, 4294966784], + [3406827520, 4294965248], + [3406830336, 4294967040], + [3406833152, 4294967040], + [3406835968, 4294967040], + [3406836224, 4294966784], + [3406838272, 4294967040], + [3406857472, 4294967040], + [3406864640, 4294967040], + [3406864896, 4294967040], + [3406871040, 4294966784], + [3406881792, 4294967040], + [3406884352, 4294967040], + [3406884864, 4294967040], + [3406886144, 4294967040], + [3406889472, 4294967040], + [3406893568, 4294967040], + [3406896128, 4294967040], + [3406898944, 4294967040], + [3406903296, 4294967040], + [3406907904, 4294966784], + [3406911488, 4294966784], + [3406923776, 4294967040], + [3406930944, 4294967040], + [3406936832, 4294967040], + [3406937600, 4294966784], + [3406948096, 4294967040], + [3406948608, 4294967040], + [3406952448, 4294967040], + [3406954240, 4294967040], + [3406955008, 4294966784], + [3406955520, 4294967040], + [3406956288, 4294967040], + [3406962432, 4294967040], + [3406963968, 4294967040], + [3406966784, 4294966784], + [3406967296, 4294967040], + [3406967808, 4294967040], + [3406972928, 4294966272], + [3406974976, 4294966784], + [3406976768, 4294967040], + [3406980096, 4294966784], + [3406981376, 4294967040], + [3406981888, 4294967040], + [3406982656, 4294967040], + [3406987520, 4294967040], + [3406988032, 4294967040], + [3406988288, 4294966784], + [3406991360, 4294967040], + [3406993664, 4294967040], + [3407005440, 4294967040], + [3407007744, 4294967040], + [3407008512, 4294967040], + [3407009536, 4294967040], + [3407024640, 4294967040], + [3407026176, 4294967040], + [3407027712, 4294967040], + [3407028224, 4294965248], + [3407030528, 4294967040], + [3407031296, 4294966784], + [3407031808, 4294967040], + [3407034880, 4294967040], + [3407035392, 4294966784], + [3407036416, 4294967040], + [3407037440, 4294967040], + [3407038464, 4294967040], + [3407045888, 4294967040], + [3407048448, 4294967040], + [3407053568, 4294967040], + [3407054080, 4294967040], + [3407056896, 4294967040], + [3407058176, 4294967040], + [3407059968, 4294967040], + [3407065088, 4294967040], + [3407065600, 4294966784], + [3407073280, 4294967040], + [3407078400, 4294966272], + [3407079680, 4294967040], + [3407081984, 4294967040], + [3407083520, 4294966784], + [3407085312, 4294967040], + [3407089920, 4294967040], + [3407095808, 4294966784], + [3407097856, 4294967040], + [3407101184, 4294967040], + [3407102208, 4294967040], + [3407107072, 4294966784], + [3407108352, 4294967040], + [3407112704, 4294966784], + [3407115008, 4294967040], + [3407115520, 4294967040], + [3407115776, 4294966784], + [3407116800, 4294967040], + [3407117824, 4294966784], + [3407120128, 4294967040], + [3407120384, 4294965248], + [3407123968, 4294967040], + [3407144448, 4294967040], + [3407144960, 4294967040], + [3407145984, 4294967040], + [3407151104, 4294966784], + [3407151616, 4294967040], + [3407153152, 4294967040], + [3407153664, 4294967040], + [3407155712, 4294967040], + [3407159552, 4294967040], + [3407159808, 4294967040], + [3407161600, 4294967040], + [3407162368, 4294967040], + [3407168512, 4294967040], + [3407172096, 4294967040], + [3407175680, 4294966272], + [3407182848, 4294967040], + [3407185920, 4294966784], + [3407188224, 4294967040], + [3407203840, 4294967040], + [3407222784, 4294967040], + [3407223808, 4294966784], + [3407224576, 4294967040], + [3407234048, 4294967040], + [3407236096, 4294967040], + [3407236608, 4294967040], + [3407238144, 4294967040], + [3407238912, 4294967040], + [3407240192, 4294966272], + [3407241984, 4294967040], + [3407243776, 4294967040], + [3407247872, 4294966784], + [3407250176, 4294967040], + [3407258368, 4294967040], + [3407259136, 4294967040], + [3407260160, 4294967040], + [3407261696, 4294965248], + [3407266304, 4294967040], + [3407278592, 4294966784], + [3407279360, 4294967040], + [3407279616, 4294967040], + [3407281152, 4294966784], + [3407282176, 4294967040], + [3407294208, 4294967040], + [3407297792, 4294967040], + [3407298048, 4294966784], + [3407300864, 4294967040], + [3407303936, 4294967040], + [3407305728, 4294966272], + [3407307264, 4294967040], + [3407309568, 4294967040], + [3407310848, 4294967040], + [3407315456, 4294967040], + [3407318016, 4294966784], + [3407326208, 4294967040], + [3407328768, 4294967040], + [3407329792, 4294966784], + [3407331328, 4294967040], + [3407332608, 4294967040], + [3407332864, 4294967040], + [3407334400, 4294966272], + [3407339520, 4294967040], + [3407340032, 4294966784], + [3407340544, 4294966272], + [3407345920, 4294967040], + [3407346432, 4294967040], + [3407351040, 4294967040], + [3407352320, 4294967040], + [3407354624, 4294967040], + [3407358720, 4294967040], + [3407362048, 4294967040], + [3407362560, 4294967040], + [3407364864, 4294967040], + [3407366656, 4294967040], + [3407367936, 4294967040], + [3407368192, 4294966784], + [3407369216, 4294966784], + [3407369728, 4294967040], + [3407370752, 4294967040], + [3407376128, 4294967040], + [3407376384, 4294967040], + [3407377408, 4294967040], + [3407378944, 4294966784], + [3407384832, 4294967040], + [3407386624, 4294966784], + [3407387904, 4294967040], + [3407388928, 4294967040], + [3407390464, 4294967040], + [3407395328, 4294966784], + [3407398656, 4294967040], + [3407399424, 4294967040], + [3407401984, 4294966784], + [3407403264, 4294967040], + [3407403776, 4294967040], + [3407410176, 4294967040], + [3407418112, 4294967040], + [3407418368, 4294966784], + [3407425024, 4294967040], + [3407425536, 4294965248], + [3407429632, 4294966784], + [3407436544, 4294967040], + [3407438592, 4294967040], + [3407438848, 4294967040], + [3407440384, 4294967040], + [3407446784, 4294967040], + [3407447808, 4294967040], + [3407448576, 4294967040], + [3407450880, 4294967040], + [3407452416, 4294967040], + [3407452672, 4294966784], + [3407455232, 4294967040], + [3407455744, 4294967040], + [3407457792, 4294966784], + [3407459328, 4294967040], + [3407459840, 4294967040], + [3407462144, 4294967040], + [3407464192, 4294967040], + [3407464448, 4294967040], + [3407464960, 4294966784], + [3407466496, 4294963200], + [3407471872, 4294967040], + [3407473408, 4294967040], + [3407473664, 4294967040], + [3407475200, 4294967040], + [3407481856, 4294967040], + [3407487488, 4294967040], + [3407491328, 4294967040], + [3407491584, 4294967040], + [3407492864, 4294967040], + [3407493120, 4294966784], + [3407494144, 4294967040], + [3407495424, 4294967040], + [3407496192, 4294967040], + [3407498240, 4294967040], + [3407499264, 4294967040], + [3407500288, 4294967040], + [3407503616, 4294967040], + [3407504896, 4294966784], + [3407508224, 4294967040], + [3407508480, 4294967040], + [3407511808, 4294967040], + [3407515392, 4294967040], + [3407515648, 4294967040], + [3407516672, 4294966784], + [3407518208, 4294967040], + [3407519232, 4294966784], + [3407522304, 4294967040], + [3407523072, 4294967040], + [3407523840, 4294967040], + [3407526144, 4294967040], + [3407530496, 4294966784], + [3407532544, 4294967040], + [3407533568, 4294967040], + [3407535616, 4294967040], + [3407536128, 4294967040], + [3407537152, 4294967040], + [3407538176, 4294967040], + [3407544320, 4294967040], + [3407546880, 4294967040], + [3407548160, 4294967040], + [3407548416, 4294967040], + [3407549440, 4294967040], + [3407549952, 4294966784], + [3407554560, 4294967040], + [3407555840, 4294967040], + [3407557888, 4294967040], + [3407560960, 4294967040], + [3407561216, 4294967040], + [3407565056, 4294967040], + [3407566848, 4294967040], + [3407570432, 4294967040], + [3407572224, 4294967040], + [3407574272, 4294967040], + [3407575296, 4294967040], + [3407575552, 4294966784], + [3407576320, 4294967040], + [3407595520, 4294967040], + [3407596032, 4294967040], + [3407603968, 4294967040], + [3407606016, 4294967040], + [3407608320, 4294967040], + [3407612416, 4294967040], + [3407612928, 4294967040], + [3407618304, 4294967040], + [3407618560, 4294966784], + [3407620864, 4294967040], + [3407621120, 4294967040], + [3407623680, 4294967040], + [3407624192, 4294967040], + [3407628544, 4294967040], + [3407628800, 4294967040], + [3407629312, 4294967040], + [3407631872, 4294967040], + [3407632384, 4294967040], + [3407638528, 4294967040], + [3407643392, 4294967040], + [3407644672, 4294967040], + [3407645696, 4294967040], + [3407646976, 4294967040], + [3407652096, 4294967040], + [3407653120, 4294967040], + [3407653376, 4294967040], + [3407655424, 4294966784], + [3407657216, 4294967040], + [3407657728, 4294967040], + [3407660032, 4294967040], + [3407667712, 4294966784], + [3407671040, 4294967040], + [3407675904, 4294967040], + [3407677440, 4294966784], + [3407678720, 4294967040], + [3407678976, 4294967040], + [3407682560, 4294967040], + [3407687168, 4294967040], + [3407689984, 4294967040], + [3407691008, 4294967040], + [3407691520, 4294967040], + [3407693056, 4294967040], + [3407694080, 4294967040], + [3407696128, 4294967040], + [3407698432, 4294967040], + [3407699712, 4294967040], + [3407700992, 4294967040], + [3407701760, 4294967040], + [3407704064, 4294967040], + [3407706112, 4294966272], + [3407721984, 4294966784], + [3407723264, 4294967040], + [3407723776, 4294967040], + [3407724032, 4294967040], + [3407727872, 4294967040], + [3407729152, 4294967040], + [3407730944, 4294967040], + [3407733504, 4294967040], + [3407734528, 4294967040], + [3407735040, 4294967040], + [3407735296, 4294967040], + [3407738880, 4294967040], + [3407740416, 4294966784], + [3407745024, 4294966784], + [3407747328, 4294967040], + [3407747840, 4294967040], + [3407748352, 4294967040], + [3407757824, 4294967040], + [3407761664, 4294967040], + [3407763200, 4294967040], + [3407769344, 4294967040], + [3407771904, 4294967040], + [3407772416, 4294967040], + [3407779840, 4294967040], + [3407780864, 4294967040], + [3407782400, 4294967040], + [3407785216, 4294967040], + [3407785728, 4294967040], + [3407788800, 4294967040], + [3407790592, 4294967040], + [3407796480, 4294967040], + [3407797248, 4294967040], + [3407797760, 4294967040], + [3407800320, 4294966784], + [3407801088, 4294967040], + [3407802368, 4294966784], + [3407803904, 4294967040], + [3407804928, 4294966784], + [3407817984, 4294967040], + [3407818240, 4294967040], + [3407819008, 4294967040], + [3407819520, 4294967040], + [3407820288, 4294966784], + [3407824128, 4294967040], + [3407824896, 4294967040], + [3407826944, 4294967040], + [3407828224, 4294967040], + [3407831296, 4294967040], + [3407833344, 4294967040], + [3407833600, 4294967040], + [3407834112, 4294966784], + [3407838208, 4294967040], + [3407847936, 4294967040], + [3407851008, 4294967040], + [3407851776, 4294967040], + [3407852800, 4294967040], + [3407854336, 4294967040], + [3407854848, 4294967040], + [3407858688, 4294967040], + [3407862784, 4294967040], + [3407863296, 4294966784], + [3407864064, 4294967040], + [3407865088, 4294967040], + [3407869952, 4294966784], + [3407871232, 4294967040], + [3407877120, 4294967040], + [3407884288, 4294966784], + [3407886336, 4294967040], + [3407887360, 4294967040], + [3407887872, 4294967040], + [3407889408, 4294966784], + [3407891456, 4294967040], + [3407892736, 4294967040], + [3407893504, 4294966784], + [3407896320, 4294967040], + [3407898112, 4294967040], + [3407898880, 4294967040], + [3407905280, 4294967040], + [3407906048, 4294967040], + [3407907840, 4294967040], + [3407910912, 4294967040], + [3407919616, 4294966784], + [3407921152, 4294967040], + [3407922176, 4294967040], + [3407923968, 4294967040], + [3407924224, 4294966784], + [3407926272, 4294967040], + [3407938560, 4294967040], + [3407939328, 4294967040], + [3407939584, 4294965248], + [3407942912, 4294967040], + [3407944192, 4294967040], + [3407945728, 4294967040], + [3407953664, 4294967040], + [3407953920, 4294967040], + [3407954688, 4294967040], + [3407954944, 4294967040], + [3407956224, 4294967040], + [3407957760, 4294967040], + [3407963136, 4294967040], + [3407968768, 4294967040], + [3407970560, 4294967040], + [3407971072, 4294967040], + [3407974656, 4294967040], + [3407977472, 4294967040], + [3407977984, 4294966784], + [3407982080, 4294967040], + [3407984896, 4294967040], + [3407988736, 4294967040], + [3407989248, 4294966784], + [3407989760, 4294967040], + [3407990272, 4294966784], + [3407992320, 4294966784], + [3407994880, 4294966784], + [3407995392, 4294967040], + [3407997184, 4294967040], + [3407999744, 4294967040], + [3408001536, 4294967040], + [3408004096, 4294967040], + [3408008448, 4294967040], + [3408009984, 4294967040], + [3408013056, 4294967040], + [3408015360, 4294966784], + [3408016896, 4294967040], + [3408017408, 4294966784], + [3408020224, 4294967040], + [3408020736, 4294967040], + [3408022528, 4294967040], + [3408026624, 4294967040], + [3408030208, 4294967040], + [3408032000, 4294967040], + [3408040704, 4294967040], + [3408041472, 4294967040], + [3408041984, 4294966784], + [3408044288, 4294967040], + [3408044544, 4294967040], + [3408050944, 4294967040], + [3408052224, 4294965248], + [3408055296, 4294966272], + [3408062464, 4294967040], + [3408064512, 4294967040], + [3408065024, 4294967040], + [3408065792, 4294967040], + [3408067328, 4294967040], + [3409379840, 4294966784], + [3409380352, 4294967040], + [3409381888, 4294967040], + [3409382656, 4294967040], + [3409384960, 4294967040], + [3409387008, 4294967040], + [3409403136, 4294967040], + [3409405184, 4294967040], + [3409407232, 4294967040], + [3409407488, 4294967040], + [3409409024, 4294966784], + [3409409792, 4294967040], + [3409412096, 4294966784], + [3409416704, 4294966784], + [3409428480, 4294967040], + [3409429504, 4294967040], + [3409435136, 4294966784], + [3409435904, 4294967040], + [3409436672, 4294967040], + [3409445120, 4294967040], + [3409445888, 4294967040], + [3409447936, 4294967040], + [3409451008, 4294967040], + [3409454592, 4294967040], + [3409455104, 4294967040], + [3409456640, 4294967040], + [3409457152, 4294965248], + [3409462272, 4294966784], + [3409465856, 4294966784], + [3409466368, 4294966784], + [3409469184, 4294967040], + [3409473024, 4294967040], + [3409475840, 4294967040], + [3409486080, 4294967040], + [3409488128, 4294967040], + [3409488896, 4294966784], + [3409489664, 4294967040], + [3409491712, 4294967040], + [3409492224, 4294967040], + [3409492736, 4294967040], + [3409494016, 4294967040], + [3409495552, 4294967040], + [3409496320, 4294967040], + [3409498112, 4294966784], + [3409498624, 4294967040], + [3409499648, 4294967040], + [3409500160, 4294967040], + [3409502976, 4294967040], + [3409503232, 4294967040], + [3409504256, 4294967040], + [3409506304, 4294967040], + [3409509376, 4294967040], + [3409509888, 4294967040], + [3409511680, 4294967040], + [3409511936, 4294967040], + [3409513472, 4294966784], + [3409517568, 4294967040], + [3409520384, 4294967040], + [3409522176, 4294967040], + [3409525248, 4294967040], + [3409526016, 4294967040], + [3409527296, 4294967040], + [3409528064, 4294967040], + [3409528320, 4294966784], + [3409529088, 4294967040], + [3409533440, 4294967040], + [3409536256, 4294967040], + [3409538304, 4294967040], + [3409541888, 4294967040], + [3409550592, 4294967040], + [3409561600, 4294967040], + [3409562112, 4294967040], + [3409563136, 4294967040], + [3409567232, 4294967040], + [3409567744, 4294963200], + [3409573376, 4294966784], + [3409574144, 4294967040], + [3409575168, 4294967040], + [3409575424, 4294966784], + [3409838592, 4294967040], + [3409871616, 4294967040], + [3409873664, 4294967040], + [3409879296, 4294967040], + [3409888512, 4294967040], + [3409896448, 4294966272], + [3409897984, 4294967040], + [3409901056, 4294967040], + [3410796544, 4294966272], + [3410798592, 4294966272], + [3410867200, 4294966272], + [3410898944, 4294963200], + [3410952192, 4294963200], + [3410960384, 4294963200], + [3411018752, 4294966784], + [3411025920, 4294963200], + [3411032320, 4294967040], + [3411051520, 4294966272], + [3411052544, 4294965248], + [3411054592, 4294963200], + [3411083264, 4294965248], + [3411087360, 4294963200], + [3411148800, 4294966784], + [3411152896, 4294965248], + [3411214336, 4294966272], + [3411228672, 4294965248], + [3411271680, 4294963200], + [3411410944, 4294959104], + [3411419136, 4294959104], + [3411427328, 4294963200], + [3411431424, 4294963200], + [3411435520, 4294959104], + [3411475968, 4294966784], + [3411550208, 4294959104], + [3411591168, 4294959104], + [3411607552, 4294966272], + [3411609600, 4294965248], + [3411642368, 4294966272], + [3411673088, 4294966272], + [3411675136, 4294966272], + [3411705856, 4294959104], + [3411714048, 4294959104], + [3411722240, 4294959104], + [3411746816, 4294959104], + [3411763200, 4294963200], + [3411769344, 4294965248], + [3411804160, 4294966272], + [3411845120, 4294959104], + [3411869696, 4294966272], + [3411870720, 4294966272], + [3411871744, 4294967040], + [3411872000, 4294967040], + [3411872256, 4294966784], + [3411872768, 4294966272], + [3411873792, 4294963200], + [3411877888, 4294959104], + [3411886080, 4294950912], + [3411902464, 4294965248], + [3411904512, 4294966272], + [3411905536, 4294967040], + [3411905792, 4294967040], + [3411906048, 4294966784], + [3411906560, 4294963200], + [3411910656, 4294959104], + [3411918848, 4294950912], + [3411935232, 4294966272], + [3411936256, 4294966272], + [3411937280, 4294965248], + [3411939328, 4294963200], + [3412000768, 4294965248], + [3412025344, 4294963200], + [3412029440, 4294963200], + [3412033536, 4294950912], + [3412058112, 4294959104], + [3412264960, 4294965248], + [3412267008, 4294963200], + [3412283392, 4294963200], + [3412336640, 4294963200], + [3412340736, 4294965248], + [3412344576, 4294967040], + [3412348928, 4294963200], + [3412353024, 4294959104], + [3412377600, 4294963200], + [3412598784, 4294963200], + [3412680704, 4294959104], + [3412688896, 4294959104], + [3412787200, 4294934528], + [3413024768, 4294959104], + [3413037056, 4294963200], + [3413043200, 4294966784], + [3413043712, 4294967040], + [3413308416, 4294966272], + [3413557248, 4294959104], + [3413569792, 4294967040], + [3413571584, 4294966272], + [3413579776, 4294965248], + [3413581824, 4294966272], + [3413594112, 4294966272], + [3413595392, 4294967040], + [3413602560, 4294967040], + [3413602816, 4294966784], + [3413603328, 4294966272], + [3413604352, 4294965248], + [3413606400, 4294934528], + [3414171648, 4294959104], + [3414188032, 4294959104], + [3414220800, 4294965248], + [3414231040, 4294965248], + [3414302720, 4294959104], + [3414433792, 4294959104], + [3414618112, 4294965248], + [3414646784, 4294963200], + [3414650880, 4294963200], + [3414663168, 4294963200], + [3415138304, 4294959104], + [3415236608, 4294959104], + [3415277568, 4294959104], + [3415474176, 4294950912], + [3415490560, 4294963200], + [3415494656, 4294966272], + [3415496192, 4294966784], + [3415563264, 4294966272], + [3415752704, 4294959104], + [3415769088, 4294959104], + [3415801856, 4294966272], + [3416047616, 4294950912], + [3416133632, 4294965248], + [3416287232, 4294965248], + [3416293632, 4294967040], + [3416309760, 4294959104], + [3416326144, 4294966272], + [3416372224, 4294967040], + [3416375296, 4294959104], + [3416694784, 4294959104], + [3416784896, 4294959104], + [3416930816, 4294966784], + [3416981504, 4294966272], + [3417038848, 4294963200], + [3417179136, 4294967040], + [3417179904, 4294967040], + [3417202688, 4294959104], + [3417276416, 4294959104], + [3417292800, 4294950912], + [3417309184, 4294950912], + [3417325568, 4294959104], + [3417352192, 4294965248], + [3417853952, 4294963200], + [3418071040, 4294959104], + [3418161152, 4294966784], + [3418162688, 4294966784], + [3418189824, 4294966272], + [3418210304, 4294959104], + [3418251264, 4294963200], + [3418290432, 4294967040], + [3418292224, 4294966784], + [3418296320, 4294963200], + [3418308608, 4294950912], + [3418329088, 4294965248], + [3418331136, 4294965248], + [3418357760, 4294959104], + [3418480640, 4294959104], + [3418519552, 4294965248], + [3418570752, 4294959104], + [3418583040, 4294965248], + [3418587136, 4294934528], + [3418619904, 4294965248], + [3418621952, 4294965248], + [3419073536, 4294966272], + [3419226112, 4294959104], + [3419242496, 4294934528], + [3419357184, 4294950912], + [3419373568, 4294934528], + [3419406336, 4294963200], + [3419410432, 4294966272], + [3419414528, 4294959104], + [3419529216, 4294959104], + [3419668480, 4294963200], + [3419688960, 4294963200], + [3419924480, 4294965248], + [3420372992, 4294963200], + [3420389376, 4294963200], + [3420393472, 4294965248] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [3523346432, 4294963200], + [3523350528, 4294963200], + [3523543040, 4294959104], + [3523557376, 4294965248], + [3523575808, 4294963200], + [3523579904, 4294963200], + [3524001792, 4294950912], + [3524018176, 4294950912], + [3524034560, 4294950912], + [3524050944, 4294950912], + [3524067328, 4294950912], + [3524083712, 4294950912], + [3524100096, 4294934528], + [3524149248, 4294959104], + [3524161536, 4294963200], + [3524165632, 4294959104], + [3524173824, 4294959104], + [3524182016, 4294959104], + [3524190208, 4294959104], + [3524198400, 4294959104], + [3524206592, 4294959104], + [3524214784, 4294959104], + [3524222976, 4294959104], + [3524231168, 4294950912], + [3524296704, 4294950912], + [3524591616, 4294934528], + [3524624384, 4294934528], + [3524657152, 4294901760], + [3524730880, 4294959104], + [3524853760, 4294901760], + [3524919296, 4294836224], + [3525050368, 4294705152], + [3525312512, 4294705152], + [3525574656, 4294705152], + [3525836800, 4294443008], + [3526395904, 4294965248], + [3526557696, 4294901760], + [3526623232, 4294950912], + [3526639616, 4294950912], + [3526656000, 4294934528], + [3526688768, 4294934528], + [3526721536, 4294934528], + [3526934528, 4294959104], + [3527933952, 4294934528], + [3527966720, 4294959104], + [3527974912, 4294959104], + [3527983104, 4294950912], + [3527999488, 4294959104], + [3528007680, 4294959104], + [3528015872, 4294950912], + [3528032256, 4294934528], + [3528065024, 4294959104], + [3528073216, 4294959104], + [3528081408, 4294959104], + [3528089600, 4294959104], + [3528097792, 4294959104], + [3528105984, 4294959104], + [3528114176, 4294950912], + [3528130560, 4294901760], + [3528196096, 4294959104], + [3528204288, 4294959104], + [3528212480, 4294950912], + [3528228864, 4294934528], + [3528261632, 4294901760], + [3528327168, 4294959104], + [3528335360, 4294959104], + [3528343552, 4294950912], + [3528359936, 4294959104], + [3528368128, 4294959104], + [3528376320, 4294950912], + [3528409088, 4294950912], + [3528450048, 4294959104], + [3528589312, 4294836224], + [3528949760, 4294963200], + [3528953856, 4294963200], + [3528957952, 4294959104], + [3535388672, 4294950912], + [3535822848, 4294959104] + ], + [ + [3544186880, 4294705152], + [3544449024, 4294836224], + [3544580096, 4294836224], + [3545235456, 4294901760], + [3545300992, 4294901760], + [3545366528, 4294901760], + [3545432064, 4294901760], + [3545497600, 4294836224], + [3545628672, 4294836224], + [3545759744, 4294901760], + [3545825280, 4294901760], + [3545890816, 4294836224], + [3546021888, 4294836224], + [3546152960, 4294836224], + [3546284032, 4294836224], + [3546415104, 4294901760], + [3546480640, 4294950912], + [3546497024, 4294959104], + [3546505216, 4294959104], + [3546513408, 4294934528], + [3546546176, 4294901760], + [3546611712, 4294950912], + [3546628096, 4294950912], + [3546644480, 4294934528], + [3546677248, 4294901760], + [3546742784, 4294934528], + [3546775552, 4294934528], + [3548905472, 4294705152], + [3549167616, 4294836224], + [3549298688, 4294934528], + [3549331456, 4294934528], + [3549364224, 4294901760], + [3549429760, 4294836224], + [3549560832, 4294901760], + [3549626368, 4294901760], + [3549691904, 4294705152], + [3549954048, 4294836224], + [3550085120, 4294901760], + [3550150656, 4294950912], + [3550167040, 4294959104], + [3550175232, 4294959104], + [3550183424, 4294934528], + [3550216192, 4294705152], + [3550478336, 4294705152], + [3550740480, 4294705152] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + [3657433088, 4294901760], + [3657498624, 4294901760], + [3657564160, 4294836224], + [3657695232, 4294836224], + [3657826304, 4294901760], + [3657891840, 4294901760], + [3657957376, 4294836224], + [3658088448, 4294901760], + [3658153984, 4294901760], + [3658219520, 4294901760], + [3658285056, 4294901760], + [3658350592, 4294836224], + [3658481664, 4294705152], + [3658743808, 4294901760], + [3658809344, 4294934528], + [3658842112, 4294934528], + [3658874880, 4294836224], + [3659005952, 4294836224], + [3659137024, 4294901760], + [3659202560, 4294901760], + [3659268096, 4294836224], + [3659399168, 4294836224], + [3661103104, 4294705152], + [3661365248, 4294836224], + [3661496320, 4294934528], + [3661529088, 4294934528], + [3661561856, 4294901760], + [3661627392, 4294836224], + [3661758464, 4294901760], + [3661824000, 4294934528], + [3661856768, 4294934528], + [3661889536, 4294836224], + [3662020608, 4294836224], + [3662151680, 4294705152], + [3662413824, 4294836224], + [3662544896, 4294836224], + [3662675968, 4294705152], + [3662938112, 4294705152], + [3663200256, 4294443008], + [3663724544, 4294836224], + [3663855616, 4294934528], + [3663888384, 4294950912], + [3663904768, 4294959104], + [3663912960, 4294959104], + [3663921152, 4294901760], + [3664009216, 4294965248], + [3664011264, 4294959104], + [3664019456, 4294934528], + [3664248832, 4294934528], + [3664281600, 4294959104], + [3664289792, 4294959104], + [3664297984, 4294965248], + [3664300032, 4294965248], + [3664302080, 4294963200], + [3664306176, 4294959104], + [3664314368, 4294901760], + [3664379904, 4294836224], + [3664510976, 4294901760], + [3664576512, 4294901760], + [3669606400, 4294959104], + [3669618688, 4294965248], + [3670016000, 4294901760], + [3670081536, 4294901760], + [3670147072, 4294901760], + [3670212608, 4294901760], + [3670278144, 4294705152], + [3670540288, 4294705152], + [3670802432, 4294836224], + [3670933504, 4294836224], + [3673161728, 4294705152], + [3673423872, 4294836224], + [3673554944, 4294836224], + [3673751552, 4294901760] + ], + [ + [3678928896, 4294901760], + [3679584256, 4294901760], + [3679682560, 4294934528], + [3682598912, 4293918720], + [3683647488, 4294705152], + [3683909632, 4294901760], + [3683975168, 4294934528], + [3684007936, 4294950912], + [3684024320, 4294950912], + [3684040704, 4294959104], + [3684048896, 4294959104], + [3684057088, 4294959104], + [3684065280, 4294963200], + [3684069376, 4294963200], + [3684073472, 4294934528], + [3684106240, 4294959104], + [3684114432, 4294959104], + [3684122624, 4294950912], + [3684139008, 4294934528], + [3684171776, 4294836224], + [3684302848, 4294836224], + [3684433920, 4294836224], + [3684564992, 4294934528], + [3684597760, 4294934528], + [3684630528, 4294950912], + [3684646912, 4294950912], + [3684663296, 4294934528], + [3688366080, 4294836224], + [3688497152, 4294836224], + [3688628224, 4294901760], + [3688693760, 4294901760], + [3688759296, 4294836224], + [3688890368, 4294836224], + [3689021440, 4294901760], + [3689086976, 4294901760], + [3689152512, 4294836224], + [3689283584, 4294836224], + [3689414656, 4294705152], + [3689676800, 4294836224], + [3689807872, 4294836224], + [3690070016, 4294836224], + [3690201088, 4294705152] + ], + [ + [3697655808, 4294950912], + [3698327552, 4294705152], + [3700981760, 4294934528], + [3701080064, 4294836224], + [3701473280, 4292870144], + [3703570432, 4294836224], + [3703701504, 4294836224], + [3703832576, 4294705152], + [3704094720, 4294443008], + [3706126336, 4294950912], + [3706159104, 4294934528], + [3706208256, 4294950912], + [3706322944, 4294901760], + [3706847232, 4294836224], + [3707209728, 4294965248], + [3707240448, 4294705152], + [3707502592, 4294901760] + ], + [ + [3707764736, 4294836224], + [3707895808, 4294901760], + [3707961344, 4294934528], + [3707994112, 4294934528], + [3708026880, 4294901760], + [3708092416, 4294934528], + [3708125184, 4294934528], + [3708157952, 4294901760], + [3708223488, 4294959104], + [3708231680, 4294959104], + [3708239872, 4294959104], + [3708248064, 4294959104], + [3708256256, 4294934528], + [3708289024, 4294836224], + [3708420096, 4294901760], + [3708485632, 4294934528], + [3708518400, 4294950912], + [3708534784, 4294959104], + [3708542976, 4294959104], + [3708551168, 4294934528], + [3708583936, 4294950912], + [3708616704, 4294950912], + [3708633088, 4294959104], + [3708641280, 4294959104], + [3708649472, 4294934528], + [3708682240, 4294836224], + [3715760128, 4294836224], + [3716186112, 4294934528], + [3716218880, 4294901760], + [3716284416, 4294836224], + [3716538368, 4294959104], + [3716677632, 4294901760], + [3716743168, 4294901760], + [3719036928, 4294705152], + [3719299072, 4294443008], + [3720347648, 4294836224], + [3720478720, 4294901760], + [3720544256, 4294901760], + [3720609792, 4294836224], + [3720740864, 4294901760], + [3720806400, 4294959104], + [3720814592, 4294963200], + [3720818688, 4294963200], + [3720822784, 4294950912], + [3720839168, 4294950912], + [3720855552, 4294963200], + [3720863744, 4294959104], + [3720871936, 4294705152], + [3721134080, 4294836224], + [3721265152, 4294901760], + [3721330688, 4294950912], + [3721347072, 4294950912], + [3721363456, 4294934528], + [3721396224, 4294705152], + [3721658368, 4294901760], + [3721723904, 4294901760], + [3721789440, 4294836224], + [3721920512, 4294443008], + [3722444800, 4294443008], + [3722969088, 4294705152], + [3723231232, 4294836224], + [3723362304, 4294901760], + [3723427840, 4294934528], + [3723460608, 4294934528] + ], + [ + [3725590528, 4294836224], + [3725721600, 4294836224], + [3725852672, 4294836224], + [3725983744, 4294901760], + [3726049280, 4294901760], + [3726114816, 4294836224], + [3726245888, 4294836224], + [3726376960, 4294705152], + [3726639104, 4292870144], + [3728736256, 4294443008], + [3729260544, 4294836224], + [3729391616, 4294901760], + [3729457152, 4294901760], + [3729522688, 4294705152], + [3729784832, 4294836224], + [3729915904, 4294901760], + [3729981440, 4294934528], + [3730014208, 4294934528], + [3730046976, 4294901760], + [3730112512, 4294934528], + [3730145280, 4294934528], + [3730178048, 4294836224], + [3730309120, 4294836224], + [3730440192, 4294836224], + [3730571264, 4294705152], + [3732733952, 4294901760], + [3732832256, 4294934528], + [3732930560, 4294705152], + [3733192704, 4294705152], + [3733454848, 4294443008], + [3735027712, 4294836224], + [3735158784, 4294901760], + [3735224320, 4294959104], + [3735232512, 4294959104], + [3735240704, 4294950912], + [3735257088, 4294934528], + [3735552000, 4294836224], + [3735683072, 4294836224], + [3735814144, 4294934528], + [3735846912, 4294934528], + [3735879680, 4294901760], + [3735945216, 4294836224], + [3736076288, 4294443008], + [3736600576, 4294443008], + [3737124864, 4294705152], + [3737387008, 4294836224], + [3737518080, 4294901760], + [3737583616, 4294901760], + [3737649152, 4294705152], + [3737911296, 4294836224], + [3738042368, 4294836224], + [3738173440, 4294443008], + [3738697728, 4294836224], + [3738828800, 4294901760], + [3738894336, 4294901760], + [3738959872, 4294836224], + [3739090944, 4294836224], + [3740270592, 4294443008], + [3740794880, 4294901760], + [3740860416, 4294934528], + [3740893184, 4294959104], + [3740901376, 4294963200], + [3740905472, 4294963200], + [3740909568, 4294950912] + ], + [ + [3741319168, 4294836224], + [3741450240, 4294836224], + [3741581312, 4294705152], + [3741843456, 4294443008], + [3742629888, 4294836224], + [3743135744, 4294966272], + [3745513472, 4292870144], + [3747610624, 4293918720], + [3748659200, 4294705152], + [3748921344, 4294836224], + [3749183488, 4294443008], + [3749707776, 4294836224], + [3750756352, 4293918720], + [3751804928, 4294705152], + [3752198144, 4294836224], + [3753902080, 4294836224], + [3754295296, 4294836224], + [3754491904, 4294901760], + [3754557440, 4294836224], + [3754950656, 4294705152], + [3755212800, 4294836224], + [3755343872, 4294836224], + [3755737088, 4294836224], + [3755978752, 4294963200], + [3755982848, 4294963200], + [3757047808, 4294443008], + [3757572096, 4294705152], + [3757867008, 4294934528], + [3757965312, 4294901760], + [3758030848, 4294934528], + [3758091264, 4294966272], + [3758095360, 4294966784] + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ], + [ + ] + ]; + var fake_ip_list = [ + [ + [624768670, 4294967295], + [777170500, 4294967295], + [1208929640, 4294967295], + [1249716070, 4294967295], + [3473692770, 4294967295] + ], + [ + [1075927201, 4294967295], + [1249716081, 4294967295], + [1563297881, 4294967295], + [2674555211, 4294967295], + [3508816161, 4294967295] + ], + [ + [3638410422, 4294967295] + ], + [ + [134727213, 4294967295], + [1075929903, 4294967295], + [1309683983, 4294967295], + [3412199233, 4294967295], + [3493338923, 4294967295], + [3546170003, 4294967295], + [3584686883, 4294967295] + ], + [ + [69485234, 4294967295] + ], + [ + [1110310125, 4294967295], + [1208929635, 4294967295], + [3400861525, 4294967295], + [3416385195, 4294967295] + ], + [ + [1249745766, 4294967295], + [3395944706, 4294967295], + [3512067466, 4294967295] + ], + [ + [1101060977, 4294967295], + [2844003687, 4294967295], + [3639259917, 4294967295] + ], + [ + [1097386748, 4294967295], + [1249738598, 4294967295], + [3225667078, 4294967295], + [3515954738, 4294967295], + [3520863918, 4294967295] + ], + [ + [991429549, 4294967295], + [1078109179, 4294967295], + [2155445899, 4294967295], + [4089035559, 4294967295] + ] + ]; + var safeDomains = { + "10010.com": 1, + "115.com": 1, + "123u.com": 1, + "126.com": 1, + "126.net": 1, + "163.com": 1, + "17173.com": 1, + "178.com": 1, + "17cdn.com": 1, + "21cn.com": 1, + "2288.org": 1, + "3322.org": 1, + "360buy.com": 1, + "360buyimg.com": 1, + "360doc.com": 1, + "360safe.com": 1, + "36kr.com": 1, + "400gb.com": 1, + "4399.com": 1, + "51.la": 1, + "51buy.com": 1, + "51cto.com": 1, + "51job.com": 1, + "51jobcdn.com": 1, + "5d6d.com": 1, + "5d6d.net": 1, + "61.com": 1, + "6600.org": 1, + "6rooms.com": 1, + "7766.org": 1, + "7k7k.com": 1, + "8800.org": 1, + "8866.org": 1, + "90g.org": 1, + "91.com": 1, + "9966.org": 1, + "acfun.tv": 1, + "aicdn.com": 1, + "ali213.net": 1, + "alibaba.com": 1, + "alicdn.com": 1, + "aliexpress.com": 1, + "aliimg.com": 1, + "alikunlun.com": 1, + "alimama.com": 1, + "alipay.com": 1, + "alipayobjects.com": 1, + "alisoft.com": 1, + "aliyun.com": 1, + "aliyuncdn.com": 1, + "aliyuncs.com": 1, + "anzhi.com": 1, + "appinn.com": 1, + "apple.com": 1, + "appsina.com": 1, + "archlinuxcn.org": 1, + "atpanel.com": 1, + "baidu.com": 1, + "baidupcs.com": 1, + "baidustatic.com": 1, + "baifendian.com": 1, + "baihe.com": 1, + "baixing.com": 1, + "bdimg.com": 1, + "bdstatic.com": 1, + "bilibili.tv": 1, + "blogbus.com": 1, + "blueidea.com": 1, + "ccb.com": 1, + "cctv.com": 1, + "cctvpic.com": 1, + "cdn20.com": 1, + "china.com": 1, + "chinabyte.com": 1, + "chinacache.com": 1, + "chinacache.net": 1, + "chinamobile.com": 1, + "chinanews.com": 1, + "chinaren.com": 1, + "chinaunix.net": 1, + "chinaz.com": 1, + "cloudcdn.net": 1, + "cn.bing.com": 1, + "cn.debian.org": 1, + "cnbeta.com": 1, + "cnbetacdn.com": 1, + "cnblogs.com": 1, + "cnepub.com": 1, + "cnzz.com": 1, + "comsenz.com": 1, + "csdn.net": 1, + "ct10000.com": 1, + "ctdisk.com": 1, + "dangdang.com": 1, + "dbank.com": 1, + "dedecms.com": 1, + "diandian.com": 1, + "dianping.com": 1, + "discuz.com": 1, + "discuz.net": 1, + "dl.google.com": 1, + "docin.com": 1, + "donews.com": 1, + "dospy.com": 1, + "douban.com": 1, + "douban.fm": 1, + "duapp.com": 1, + "duba.net": 1, + "duomi.com": 1, + "duote.com": 1, + "duowan.com": 1, + "egou.com": 1, + "et8.org": 1, + "etao.com": 1, + "f3322.org": 1, + "fantong.com": 1, + "fenzhi.com": 1, + "fhldns.com": 1, + "ganji.com": 1, + "gaopeng.com": 1, + "geekpark.net": 1, + "gfan.com": 1, + "gtimg.com": 1, + "hacdn.net": 1, + "hadns.net": 1, + "hao123.com": 1, + "hao123img.com": 1, + "hc360.com": 1, + "hdslb.com": 1, + "hexun.com": 1, + "hiapk.com": 1, + "hichina.com": 1, + "hoopchina.com": 1, + "huanqiu.com": 1, + "hudong.com": 1, + "huochepiao.com": 1, + "hupu.com": 1, + "iask.com": 1, + "iciba.com": 1, + "idqqimg.com": 1, + "ifanr.com": 1, + "ifeng.com": 1, + "ifengimg.com": 1, + "ijinshan.com": 1, + "iqiyi.com": 1, + "it168.com": 1, + "itcpn.net": 1, + "iteye.com": 1, + "itouzi.com": 1, + "jandan.net": 1, + "jd.com": 1, + "jiashule.com": 1, + "jiasule.com": 1, + "jiathis.com": 1, + "jiayuan.com": 1, + "jiepang.com": 1, + "jing.fm": 1, + "jobbole.com": 1, + "jstv.com": 1, + "jumei.com": 1, + "kaixin001.com": 1, + "kandian.com": 1, + "kandian.net": 1, + "kanimg.com": 1, + "kankanews.com": 1, + "kdnet.net": 1, + "koudai8.com": 1, + "ku6.com": 1, + "ku6cdn.com": 1, + "ku6img.com": 1, + "kuaidi100.com": 1, + "kugou.com": 1, + "lashou.com": 1, + "letao.com": 1, + "letv.com": 1, + "lietou.com": 1, + "linezing.com": 1, + "loli.mg": 1, + "loli.vg": 1, + "lvping.com": 1, + "lxdns.com": 1, + "mangocity.com": 1, + "mapbar.com": 1, + "mcbbs.net": 1, + "mediav.com": 1, + "meilishuo.com": 1, + "meituan.com": 1, + "meituan.net": 1, + "meizu.com": 1, + "microsoft.com": 1, + "miui.com": 1, + "moe123.com": 1, + "moegirl.org": 1, + "mop.com": 1, + "mtime.com": 1, + "my-card.in": 1, + "mydrivers.com": 1, + "mzstatic.com": 1, + "netease.com": 1, + "newsmth.net": 1, + "ngacn.cc": 1, + "nuomi.com": 1, + "okbuy.com": 1, + "optaim.com": 1, + "oschina.net": 1, + "paipai.com": 1, + "pcbeta.com": 1, + "pchome.net": 1, + "pcpop.com": 1, + "pengyou.com": 1, + "phoenixlzx.com": 1, + "phpwind.net": 1, + "pingan.com": 1, + "pool.ntp.org": 1, + "pplive.com": 1, + "pps.tv": 1, + "ppstream.com": 1, + "pptv.com": 1, + "pubyun.com": 1, + "qhimg.com": 1, + "qianlong.com": 1, + "qidian.com": 1, + "qingdaonews.com": 1, + "qiniu.com": 1, + "qiniudn.com": 1, + "qiushibaike.com": 1, + "qiyi.com": 1, + "qiyipic.com": 1, + "qq.com": 1, + "qqmail.com": 1, + "qstatic.com": 1, + "qunar.com": 1, + "qunarzz.com": 1, + "qvbuy.com": 1, + "renren.com": 1, + "renrendai.com": 1, + "rrfmn.com": 1, + "rrimg.com": 1, + "sanguosha.com": 1, + "sdo.com": 1, + "sina.com": 1, + "sinaapp.com": 1, + "sinaedge.com": 1, + "sinaimg.com": 1, + "sinaimg.cn": 1, + "sinajs.com": 1, + "skycn.com": 1, + "smzdm.com": 1, + "sogou.com": 1, + "sohu.com": 1, + "soku.com": 1, + "solidot.org": 1, + "soso.com": 1, + "soufun.com": 1, + "soufunimg.com": 1, + "staticfile.org": 1, + "staticsdo.com": 1, + "steamcn.com": 1, + "suning.com": 1, + "szzfgjj.com": 1, + "tanx.com": 1, + "taobao.com": 1, + "taobaocdn.com": 1, + "tbcache.com": 1, + "tdimg.com": 1, + "tencent.com": 1, + "tenpay.com": 1, + "tgbus.com": 1, + "thawte.com": 1, + "tiancity.com": 1, + "tianyaui.com": 1, + "tiexue.net": 1, + "tmall.com": 1, + "tmcdn.net": 1, + "tom.com": 1, + "tomonline-inc.com": 1, + "tuan800.com": 1, + "tuan800.net": 1, + "tuanimg.com": 1, + "tudou.com": 1, + "tudouui.com": 1, + "tuniu.com": 1, + "u148.net": 1, + "u17.com": 1, + "ubuntu.com": 1, + "ucjoy.com": 1, + "uni-marketers.com": 1, + "unionpay.com": 1, + "unionpaysecure.com": 1, + "upaiyun.com": 1, + "upyun.com": 1, + "uusee.com": 1, + "uuu9.com": 1, + "vaikan.com": 1, + "vancl.com": 1, + "vcimg.com": 1, + "verycd.com": 1, + "wandoujia.com": 1, + "wdjimg.com": 1, + "weibo.com": 1, + "weiphone.com": 1, + "weiyun.com": 1, + "west263.com": 1, + "wrating.com": 1, + "wscdns.com": 1, + "wumii.com": 1, + "xdcdn.net": 1, + "xiachufang.com": 1, + "xiami.com": 1, + "xiami.net": 1, + "xiaomi.com": 1, + "xiaonei.com": 1, + "xiazaiba.com": 1, + "xici.net": 1, + "xilu.com": 1, + "xinhuanet.com": 1, + "xinnet.com": 1, + "xlpan.com": 1, + "xn--fiqs8s": 1, + "xnpic.com": 1, + "xungou.com": 1, + "xunlei.com": 1, + "ydstatic.com": 1, + "yesky.com": 1, + "yeyou.com": 1, + "yihaodian.com": 1, + "yihaodianimg.com": 1, + "yingjiesheng.com": 1, + "yintai.com": 1, + "yinyuetai.com": 1, + "yiqifa.com": 1, + "yixun.com": 1, + "ykimg.com": 1, + "ynet.com": 1, + "youdao.com": 1, + "yougou.com": 1, + "youku.com": 1, + "yupoo.com": 1, + "yy.com": 1, + "yyets.com": 1, + "zbjimg.com": 1, + "zhaopin.com": 1, + "zhi.hu": 1, + "zhihu.com": 1, + "zhimg.com": 1, + "zhubajie.com": 1, + "zongheng.com": 1, + "v2ex.com": 1, + "v2root.com": 1, + "gwdang.com": 1, + "yinxiang.com": 1, + "icloud.com": 1, + "geotrust.com": 1, + "verisign.com": 1, + "feng.com": 1, + "scorecardresearch.com": 1, + "evernote.com": 1 + }; + + var dangerDomains = { + "gimpshop.com": 1, + "directcreative.com": 1, + "speedpluss.org": 1, + "mingpaovan.com": 1, + "wikinews.org": 1, + "joachims.org": 1, + "maiio.net": 1, + "idv.tw": 1, + "mail-archive.com": 1, + "surfeasy.com.au": 1, + "hihistory.net": 1, + "alexlur.org": 1, + "finalion.jp": 1, + "nrk.no": 1, + "laogai.org": 1, + "cmule.com": 1, + "gappp.org": 1, + "givemesomethingtoread.com": 1, + "yahoo.com.tw": 1, + "robtex.com": 1, + "thelifeyoucansave.com": 1, + "perfspot.com": 1, + "ugo.com": 1, + "army.mil": 1, + "amoiist.com": 1, + "uderzo.it": 1, + "zillionk.com": 1, + "placemix.com": 1, + "twitstat.com": 1, + "erabaru.net": 1, + "zhongmeng.org": 1, + "tinypaste.com": 1, + "wo.tc": 1, + "youtu.be": 1, + "prozz.net": 1, + "freemorenews.com": 1, + "penchinese.net": 1, + "mesotw.com": 1, + "favotter.net": 1, + "privacybox.de": 1, + "liaowangxizang.net": 1, + "firstfivefollowers.com": 1, + "rfamobile.org": 1, + "xanga.com": 1, + "godfootsteps.org": 1, + "dalailama.com": 1, + "bigsound.org": 1, + "retweetist.com": 1, + "fizzik.com": 1, + "bbg.gov": 1, + "imagezilla.net": 1, + "myforum.com.hk": 1, + "imlive.com": 1, + "webshots.com": 1, + "ptt.cc": 1, + "lsforum.net": 1, + "bigfools.com": 1, + "ziplib.com": 1, + "makemymood.com": 1, + "foxdie.us": 1, + "juliereyc.com": 1, + "5i01.com": 1, + "beijingspring.com": 1, + "drewolanoff.com": 1, + "twiffo.com": 1, + "blinkx.com": 1, + "michaelmarketl.com": 1, + "views.fm": 1, + "kcome.org": 1, + "acgkj.com": 1, + "branch.com": 1, + "soupofmedia.com": 1, + "autoproxy-gfwlist.googlecode.com": 1, + "po2b.com": 1, + "slideshare.net": 1, + "wikileaks.lu": 1, + "sohcradio.com": 1, + "allgirlsallowed.org": 1, + "pts.org.tw": 1, + "twitonmsn.com": 1, + "5maodang.com": 1, + "idouga.com": 1, + "whyx.org": 1, + "peacehall.com": 1, + "instapaper.com": 1, + "pure18.com": 1, + "greatfirewallofchina.org": 1, + "lagranepoca.com": 1, + "sstatic.net": 1, + "rfa.org": 1, + "sokamonline.com": 1, + "im.tv": 1, + "hulu.com": 1, + "twiyia.com": 1, + "sethwklein.net": 1, + "dupola.com": 1, + "dupola.net": 1, + "coolaler.com": 1, + "ngensis.com": 1, + "googlepages.com": 1, + "mp": 1, + "freeweibo.com": 1, + "novelasia.com": 1, + "v70.us": 1, + "zfreet.com": 1, + "fgmtv.org": 1, + "rssmeme.com": 1, + "futuremessage.org": 1, + "wsj.com": 1, + "ieasynews.net": 1, + "openleaks.org": 1, + "benjaminste.in": 1, + "asahichinese.com": 1, + "twicsy.com": 1, + "sweux.com": 1, + "chrispederick.com": 1, + "amzs.me": 1, + "lkcn.net": 1, + "woxinghuiguo.com": 1, + "wefong.com": 1, + "savemedia.com": 1, + "livingstream.com": 1, + "shangfang.org": 1, + "hkzone.org": 1, + "samsoff.es": 1, + "kcsoftwares.com": 1, + "twip.me": 1, + "zannel.com": 1, + "gaopi.net": 1, + "emacsblog.org": 1, + "tokyocn.com": 1, + "robustnessiskey.com": 1, + "wangruowang.org": 1, + "internetfreedom.org": 1, + "linpie.com": 1, + "fc2.com": 1, + "ghostery.com": 1, + "taolun.info": 1, + "bestforchina.org": 1, + "m-team.cc": 1, + "cna.com.tw": 1, + "setty.com.tw": 1, + "wikipedia.org": 1, + "sorting-algorithms.com": 1, + "kusocity.com": 1, + "twttr.com": 1, + "post.ly": 1, + "backchina.com": 1, + "thespeeder.com": 1, + "tuidang.net": 1, + "sinopitt.info": 1, + "mongodb.org": 1, + "orzistic.org": 1, + "golang.org": 1, + "betfair.com": 1, + "oursogo.com": 1, + "art-or-porn.com": 1, + "omy.sg": 1, + "middle-way.net": 1, + "ap.org": 1, + "dajiyuan.com": 1, + "laqingdan.net": 1, + "youmaker.com": 1, + "anonymizer.com": 1, + "cnavista.com.tw": 1, + "nuvid.com": 1, + "syx86.com": 1, + "engadget.com": 1, + "typepad.com": 1, + "matsushimakaede.com": 1, + "kickstarter.com": 1, + "plm.org.hk": 1, + "falsefire.com": 1, + "fuckgfw.com": 1, + "topnews.in": 1, + "ihakka.net": 1, + "hkatvnews.com": 1, + "dfas.mil": 1, + "pullfolio.com": 1, + "yousendit.com": 1, + "lupm.org": 1, + "tweetdeck.com": 1, + "t35.com": 1, + "plunder.com": 1, + "pbworks.com": 1, + "tpi.org.tw": 1, + "freerk.com": 1, + "networkedblogs.com": 1, + "hahlo.com": 1, + "theampfactory.com": 1, + "gvm.com.tw": 1, + "coolder.com": 1, + "civilhrfront.org": 1, + "rnw.nl": 1, + "apiary.io": 1, + "e-gold.com": 1, + "jitouch.com": 1, + "youtubecn.com": 1, + "livingonline.us": 1, + "your-freedom.net": 1, + "pct.org.tw": 1, + "fringenetwork.com": 1, + "epochtimes.jp": 1, + "deck.ly": 1, + "spinejs.com": 1, + "tvants.com": 1, + "kagyuoffice.org.tw": 1, + "ventureswell.com": 1, + "tiney.com": 1, + "smhric.org": 1, + "6-4.net": 1, + "mash.to": 1, + "ifanqiang.com": 1, + "quadedge.com": 1, + "openid.net": 1, + "rangzen.org": 1, + "fbcdn.net": 1, + "page2rss.com": 1, + "morbell.com": 1, + "boxcar.io": 1, + "freedomhouse.org": 1, + "footwiball.com": 1, + "shixiao.org": 1, + "ecstart.com": 1, + "desc.se": 1, + "sod.co.jp": 1, + "usa.gov": 1, + "twbbs.tw": 1, + "chromeadblock.com": 1, + "rocmp.org": 1, + "gardennetworks.org": 1, + "njuice.com": 1, + "dailyme.com": 1, + "search.com": 1, + "hkhkhk.com": 1, + "puffstore.com": 1, + "advanscene.com": 1, + "onlylady.cn": 1, + "miroguide.com": 1, + "centurys.net": 1, + "planetsuzy.org": 1, + "cdpwu.org": 1, + "myav.com.tw": 1, + "dw-world.com": 1, + "noobbox.com": 1, + "xuchao.org": 1, + "usfk.mil": 1, + "brandonhutchinson.com": 1, + "rapidsharedata.com": 1, + "qmzdd.com": 1, + "foxbusiness.com": 1, + "diigo.com": 1, + "xml-training-guide.com": 1, + "freeoz.org": 1, + "blogimg.jp": 1, + "twitterkr.com": 1, + "anontext.com": 1, + "twurl.nl": 1, + "pilotmoon.com": 1, + "fulue.com": 1, + "turningtorso.com": 1, + "sytes.net": 1, + "mk5000.com": 1, + "americangreencard.com": 1, + "zhenghui.org": 1, + "cao.im": 1, + "50webs.com": 1, + "vtunnel.com": 1, + "nintendium.com": 1, + "xiezhua.com": 1, + "sex8.cc": 1, + "thedw.us": 1, + "markmail.org": 1, + "radioaustralia.net.au": 1, + "seevpn.com": 1, + "rileyguide.com": 1, + "908taiwan.org": 1, + "lerosua.org": 1, + "twitgoo.com": 1, + "livestream.com": 1, + "facesofnyfw.com": 1, + "echofon.com": 1, + "pdetails.com": 1, + "natado.com": 1, + "fourthinternational.org": 1, + "globalrescue.net": 1, + "slinkset.com": 1, + "chinaxchina.com": 1, + "chinasocialdemocraticparty.com": 1, + "marines.mil": 1, + "chinese-hermit.net": 1, + "nextmedia.com": 1, + "jiruan.net": 1, + "calameo.com": 1, + "tweetboner.biz": 1, + "vimperator.org": 1, + "furl.net": 1, + "wordsandturds.com": 1, + "cnn.com": 1, + "dvorak.org": 1, + "suoluo.org": 1, + "fly4ever.me": 1, + "ntdtv.org": 1, + "lsm.org": 1, + "nytimes.com": 1, + "summify.com": 1, + "geohot.com": 1, + "heqinglian.net": 1, + "xinmiao.com.hk": 1, + "skype.com": 1, + "gtricks.com": 1, + "uniteddaily.com.my": 1, + "westkit.net": 1, + "bill2-software.com": 1, + "gstatic.com": 1, + "nydus.ca": 1, + "brizzly.com": 1, + "wallpapercasa.com": 1, + "bonbonme.com": 1, + "mypopescu.com": 1, + "ezpc.tk": 1, + "justfreevpn.com": 1, + "taipei.gov.tw": 1, + "fxnetworks.com": 1, + "cl.ly": 1, + "csdparty.com": 1, + "labiennale.org": 1, + "cpj.org": 1, + "fw.cm": 1, + "sogclub.com": 1, + "weeewooo.net": 1, + "iset.com.tw": 1, + "pornrapidshare.com": 1, + "qtweeter.com": 1, + "fuckcnnic.net": 1, + "92ccav.com": 1, + "yimg.com": 1, + "eriversoft.com": 1, + "hrcir.com": 1, + "emule-ed2k.com": 1, + "twhirl.org": 1, + "vevo.com": 1, + "huaxia-news.com": 1, + "giga-web.jp": 1, + "broadbook.com": 1, + "goldwave.com": 1, + "dok-forum.net": 1, + "ied2k.net": 1, + "chinesen.de": 1, + "myactimes.com": 1, + "skykiwi.com": 1, + "hugoroy.eu": 1, + "conoyo.com": 1, + "izaobao.us": 1, + "alwaysdata.net": 1, + "xvideos.com": 1, + "iicns.com": 1, + "foolsmountain.com": 1, + "torrentcrazy.com": 1, + "so-net.net.tw": 1, + "xinsheng.net": 1, + "scmp.com": 1, + "zozotown.com": 1, + "shopping.com": 1, + "xjp.cc": 1, + "matainja.com": 1, + "supertweet.net": 1, + "geometrictools.com": 1, + "ibros.org": 1, + "fangeming.com": 1, + "shellmix.com": 1, + "gov.tw": 1, + "icl-fi.org": 1, + "a-normal-day.com": 1, + "a5.com.ru": 1, + "apetube.com": 1, + "biantailajiao.com": 1, + "chosun.com": 1, + "baidu.jp": 1, + "philly.com": 1, + "apple.com": 1, + "tweete.net": 1, + "nyt.com": 1, + "mingpaonews.com": 1, + "gopetition.com": 1, + "longtermly.net": 1, + "realraptalk.com": 1, + "gongwt.com": 1, + "fooooo.com": 1, + "gamebase.com.tw": 1, + "in.com": 1, + "vidoemo.com": 1, + "xrea.com": 1, + "morningsun.org": 1, + "tibetalk.com": 1, + "blogtd.org": 1, + "helpzhuling.org": 1, + "htmldog.com": 1, + "mimivip.com": 1, + "htl.li": 1, + "tap11.com": 1, + "yilubbs.com": 1, + "zuola.com": 1, + "pengyulong.com": 1, + "provideocoalition.com": 1, + "fan-qiang.com": 1, + "twt.tl": 1, + "ithome.com.tw": 1, + "dy24k.info": 1, + "chinainperspective.com": 1, + "cms.gov": 1, + "lookpic.com": 1, + "ultravpn.fr": 1, + "webs-tv.net": 1, + "hakkatv.org.tw": 1, + "wretch.cc": 1, + "urbanoutfitters.com": 1, + "mobileways.de": 1, + "c-est-simple.com": 1, + "myfreshnet.com": 1, + "plays.com.tw": 1, + "journalofdemocracy.org": 1, + "cookingtothegoodlife.com": 1, + "taiwandaily.net": 1, + "bloomberg.de": 1, + "catcatbox.com": 1, + "thevivekspot.com": 1, + "mingpaomonthly.com": 1, + "plus28.com": 1, + "tunnelbear.com": 1, + "twt.fm": 1, + "twipple.jp": 1, + "premeforwindows7.com": 1, + "ladbrokes.com": 1, + "bookshelfporn.com": 1, + "wikimapia.org": 1, + "catfightpayperview.xxx": 1, + "dw.de": 1, + "bloodshed.net": 1, + "catholic.org.hk": 1, + "chuizi.net": 1, + "uygur.org": 1, + "googlesile.com": 1, + "ka-wai.com": 1, + "wujie.net": 1, + "hkepc.com": 1, + "bjzc.org": 1, + "nexton-net.jp": 1, + "entermap.com": 1, + "brightkite.com": 1, + "bwsj.hk": 1, + "pdproxy.com": 1, + "ustream.tv": 1, + "lyricsquote.com": 1, + "psblog.name": 1, + "flightcaster.com": 1, + "mad-ar.ch": 1, + "gdzf.org": 1, + "reuters.com": 1, + "unblock.cn.com": 1, + "whereiswerner.com": 1, + "cdpweb.org": 1, + "sugarsync.com": 1, + "nuzcom.com": 1, + "want-daily.com": 1, + "helloqueer.com": 1, + "cuiweiping.net": 1, + "baby-kingdom.com": 1, + "dotplane.com": 1, + "ccdtr.org": 1, + "wikileaks.pl": 1, + "bot.nu": 1, + "dalianmeng.org": 1, + "vansky.com": 1, + "latimes.com": 1, + "google.co.jp": 1, + "tvunetworks.com": 1, + "futurechinaforum.org": 1, + "hikinggfw.org": 1, + "qoos.com": 1, + "target.com": 1, + "waqn.com": 1, + "osfoora.com": 1, + "guomin.us": 1, + "cyberghostvpn.com": 1, + "billywr.com": 1, + "twittertim.es": 1, + "felixcat.net": 1, + "toodoc.com": 1, + "yam.com": 1, + "porn.com": 1, + "stoptibetcrisis.net": 1, + "xuchao.net": 1, + "generesis.com": 1, + "minimalmac.com": 1, + "yidio.com": 1, + "aolnews.com": 1, + "newcenturymc.com": 1, + "newcenturynews.com": 1, + "shaunthesheep.com": 1, + "newsminer.com": 1, + "jwmusic.org": 1, + "socialwhale.com": 1, + "drtuber.com": 1, + "devio.us": 1, + "wikilivres.info": 1, + "gmbd.cn": 1, + "hkgreenradio.org": 1, + "mtw.tl": 1, + "ziddu.com": 1, + "slavasoft.com": 1, + "internationalrivers.org": 1, + "ttv.com.tw": 1, + "tv.com": 1, + "securitykiss.com": 1, + "akiba-online.com": 1, + "wikimedia.org": 1, + "aculo.us": 1, + "bitly.com": 1, + "breakingtweets.com": 1, + "sinomontreal.ca": 1, + "secretchina.com": 1, + "gradconnection.com": 1, + "scmpchinese.com": 1, + "rfi.my": 1, + "voagd.com": 1, + "showtime.jp": 1, + "mobatek.net": 1, + "atgfw.org": 1, + "weiboleak.com": 1, + "support": 1, + "hrichina.org": 1, + "tibetwrites.org": 1, + "mingpaony.com": 1, + "chinatweeps.com": 1, + "topify.com": 1, + "transgressionism.org": 1, + "slickvpn.com": 1, + "stuffimreading.com": 1, + "mizzmona.com": 1, + "lester850.info": 1, + "stackfile.com": 1, + "uyghurcongress.org": 1, + "bullog.org": 1, + "24smile.org": 1, + "megurineluka.com": 1, + "friendfeed.com": 1, + "liudejun.com": 1, + "fanswong.com": 1, + "sexinsex.net": 1, + "boxun.com": 1, + "tiandixing.org": 1, + "oizoblog.com": 1, + "exploader.net": 1, + "roodo.com": 1, + "tbpic.info": 1, + "putlocker.com": 1, + "eevpn.com": 1, + "dafagood.com": 1, + "sinocast.com": 1, + "opera.com": 1, + "mpfinance.com": 1, + "pornvisit.com": 1, + "taiwannation.com.tw": 1, + "ifjc.org": 1, + "if-not-true-then-false.com": 1, + "upload4u.info": 1, + "prosiben.de": 1, + "bayvoice.net": 1, + "sina.com.tw": 1, + "referer.us": 1, + "trendsmap.com": 1, + "fgmtv.net": 1, + "readingtimes.com.tw": 1, + "1pondo.tv": 1, + "xfm.pp.ru": 1, + "xfiles.to": 1, + "newtaiwan.com.tw": 1, + "epochtimes-romania.com": 1, + "4chan.org": 1, + "bbc.in": 1, + "romanandreg.com": 1, + "urlparser.com": 1, + "peopo.org": 1, + "ipicture.ru": 1, + "dotsub.com": 1, + "mathiew-badimon.com": 1, + "rockmelt.com": 1, + "twittbot.net": 1, + "sockslist.net": 1, + "keepandshare.com": 1, + "avoision.com": 1, + "coveringweb.com": 1, + "unix100.com": 1, + "sogoo.org": 1, + "goldenmelody.com.tw": 1, + "wanderinghorse.net": 1, + "vot.org": 1, + "chinacomments.org": 1, + "wikileaks.ch": 1, + "ronjoneswriter.com": 1, + "bbsfeed.com": 1, + "facebook.net": 1, + "mymaji.com": 1, + "iask.bz": 1, + "tubecao.com": 1, + "dontmovetochina.com": 1, + "hidemyass.com": 1, + "myparagliding.com": 1, + "pandora.com": 1, + "getcloudapp.com": 1, + "klip.me": 1, + "imagevenue.com": 1, + "chinafreepress.org": 1, + "streetvoice.com": 1, + "zhe.la": 1, + "hsjp.net": 1, + "xh4n.cn": 1, + "botanwang.com": 1, + "dropbox.com": 1, + "hellouk.org": 1, + "animecrazy.net": 1, + "12vpn.com": 1, + "s8forum.com": 1, + "picturesocial.com": 1, + "bullogger.com": 1, + "888.com": 1, + "offbeatchina.com": 1, + "seezone.net": 1, + "frontlinedefenders.org": 1, + "theblemish.com": 1, + "internet.org": 1, + "anthonycalzadilla.com": 1, + "feelssh.com": 1, + "rsf.org": 1, + "lvhai.org": 1, + "boardreader.com": 1, + "owl.li": 1, + "geocities.com": 1, + "nobelprize.org": 1, + "pornmm.net": 1, + "wuerkaixi.com": 1, + "sina.com.hk": 1, + "heiyo.info": 1, + "foxtang.com": 1, + "tnaflix.com": 1, + "tuidang.org": 1, + "paperb.us": 1, + "billypan.com": 1, + "zvereff.com": 1, + "openvpn.net": 1, + "pastebin.com": 1, + "kaiyuan.de": 1, + "ameblo.jp": 1, + "findbook.tw": 1, + "ccthere.com": 1, + "markmilian.com": 1, + "cdpusa.org": 1, + "newgrounds.com": 1, + "xpdo.net": 1, + "rapbull.net": 1, + "innermongolia.org": 1, + "feedbooks.mobi": 1, + "tumblweed.org": 1, + "feedzshare.com": 1, + "blogcatalog.com": 1, + "xcritic.com": 1, + "lsmchinese.org": 1, + "davidziegler.net": 1, + "sneakme.net": 1, + "hwinfo.com": 1, + "vpnfire.com": 1, + "law.com": 1, + "tsemtulku.com": 1, + "spb.com": 1, + "i1.hk": 1, + "iconpaper.org": 1, + "vimeo.com": 1, + "grandtrial.org": 1, + "holyspiritspeaks.org": 1, + "2008xianzhang.info": 1, + "archive.is": 1, + "zaobao.com": 1, + "tmi.me": 1, + "nobodycanstop.us": 1, + "whylover.com": 1, + "starp2p.com": 1, + "dalailamaworld.com": 1, + "lastfm.es": 1, + "hkfront.org": 1, + "pbxes.com": 1, + "getfreedur.com": 1, + "bobulate.com": 1, + "sevenload.com": 1, + "lockdown.com": 1, + "idsam.com": 1, + "twitter4j.org": 1, + "liansi.org": 1, + "metacafe.com": 1, + "twistory.net": 1, + "zaozon.com": 1, + "peeasian.com": 1, + "mixero.com": 1, + "thepiratebay.org": 1, + "toutfr.com": 1, + "tokyo-247.com": 1, + "twreg.info": 1, + "twitzap.com": 1, + "bignews.org": 1, + "tora.to": 1, + "fileserve.com": 1, + "muzu.tv": 1, + "shitaotv.org": 1, + "wengewang.org": 1, + "geek-art.net": 1, + "gongmeng.info": 1, + "china21.com": 1, + "wenhui.ch": 1, + "uni.cc": 1, + "feedburner.com": 1, + "webfee.tk": 1, + "sharecool.org": 1, + "sex-11.com": 1, + "vanemu.cn": 1, + "marc.info": 1, + "fapdu.com": 1, + "coolloud.org.tw": 1, + "verizon.net": 1, + "sacom.hk": 1, + "imdb.com": 1, + "wikiwiki.jp": 1, + "wufi.org.tw": 1, + "bt95.com": 1, + "hackthatphone.net": 1, + "neverforget8964.org": 1, + "yong.hu": 1, + "israbox.com": 1, + "iask.ca": 1, + "riku.me": 1, + "prestige-av.com": 1, + "alwaysdata.com": 1, + "ogaoga.org": 1, + "williamhill.com": 1, + "expatshield.com": 1, + "secureserver.net": 1, + "gardennetworks.com": 1, + "ntdtv.co": 1, + "actimes.com.au": 1, + "tjholowaychuk.com": 1, + "huanghuagang.org": 1, + "vanilla-jp.com": 1, + "nsc.gov.tw": 1, + "ntdtv.ca": 1, + "wwitv.com": 1, + "chinaaffairs.org": 1, + "privatetunnel.com": 1, + "kinghost.com": 1, + "cdig.info": 1, + "usgs.gov": 1, + "hkreporter.com": 1, + "newscn.org": 1, + "simpleproductivityblog.com": 1, + "box.net": 1, + "freexinwen.com": 1, + "scriptspot.com": 1, + "chenguangcheng.com": 1, + "karayou.com": 1, + "saiq.me": 1, + "heungkongdiscuss.com": 1, + "ggssl.com": 1, + "zhuichaguoji.org": 1, + "china101.com": 1, + "hideipvpn.com": 1, + "sina.com": 1, + "orn.jp": 1, + "gartlive.com": 1, + "clientsfromhell.net": 1, + "allinfa.com": 1, + "ccavtop10.com": 1, + "twittergadget.com": 1, + "cecc.gov": 1, + "opendemocracy.net": 1, + "clipfish.de": 1, + "xskywalker.com": 1, + "paint.net": 1, + "vcfbuilder.org": 1, + "procopytips.com": 1, + "internetdefenseleague.org": 1, + "pidown.com": 1, + "openinkpot.org": 1, + "mobypicture.com": 1, + "cdnews.com.tw": 1, + "lovequicksilver.com": 1, + "singtao.ca": 1, + "soc.mil": 1, + "woeser.com": 1, + "weijingsheng.org": 1, + "doubleaf.com": 1, + "hanunyi.com": 1, + "tinychat.com": 1, + "mp3ye.eu": 1, + "9bis.com": 1, + "qkshare.com": 1, + "time.com": 1, + "bebo.com": 1, + "newspeak.cc": 1, + "tripod.com": 1, + "chevronwp7.com": 1, + "spencertipping.com": 1, + "jackjia.com": 1, + "c-spanvideo.org": 1, + "zonaeuropa.com": 1, + "minghui-school.org": 1, + "stupidvideos.com": 1, + "mingpaosf.com": 1, + "tiscali.it": 1, + "hongzhi.li": 1, + "hihiforum.com": 1, + "moztw.org": 1, + "slheng.com": 1, + "flnet.org": 1, + "chinayouth.org.hk": 1, + "twitiq.com": 1, + "chinaaid.org": 1, + "vaayoo.com": 1, + "userdefined2.com": 1, + "bloglines.com": 1, + "whydidyoubuymethat.com": 1, + "pixnet.net": 1, + "photofocus.com": 1, + "laomiu.com": 1, + "songjianjun.com": 1, + "monitorchina.org": 1, + "t66y.com": 1, + "files2me.com": 1, + "wforum.com": 1, + "gaeproxy.googlecode.com": 1, + "bestvpnservice.com": 1, + "killwall.com": 1, + "tchrd.org": 1, + "chinamz.org": 1, + "feministteacher.com": 1, + "shadowsocks.org": 1, + "wattpad.com": 1, + "wow-life.net": 1, + "twitvid.com": 1, + "twitter.jp": 1, + "kzeng.info": 1, + "thebodyshop-usa.com": 1, + "youxu.info": 1, + "lianyue.net": 1, + "youtube.com": 1, + "zhreader.com": 1, + "tcno.net": 1, + "ncn.org": 1, + "12bet.com": 1, + "tweeplike.me": 1, + "analyze-v.com": 1, + "edubridge.com": 1, + "cari.com.my": 1, + "ezpeer.com": 1, + "2000fun.com": 1, + "bnrmetal.com": 1, + "nf.id.au": 1, + "sowers.org.hk": 1, + "yzzk.com": 1, + "tampabay.com": 1, + "danke4china.net": 1, + "epochtimes.co.kr": 1, + "nowtorrents.com": 1, + "atlaspost.com": 1, + "chinaway.org": 1, + "stickam.com": 1, + "dotheyfolloweachother.com": 1, + "asianews.it": 1, + "fmnnow.com": 1, + "9001700.com": 1, + "thepiratebay.se": 1, + "thetrotskymovie.com": 1, + "vimgolf.com": 1, + "kendincos.net": 1, + "kurtmunger.com": 1, + "maruta.be": 1, + "xtube.com": 1, + "qusi8.net": 1, + "hk-pub.com": 1, + "nurgo-software.com": 1, + "byethost8.com": 1, + "freebearblog.org": 1, + "touch99.com": 1, + "graphis.ne.jp": 1, + "myeclipseide.com": 1, + "linux-engineer.net": 1, + "great-roc.org": 1, + "rthk.hk": 1, + "chinainperspective.net": 1, + "ozchinese.com": 1, + "twilio.com": 1, + "istockphoto.com": 1, + "sinoants.com": 1, + "goodreaders.com": 1, + "asiaharvest.org": 1, + "lidecheng.com": 1, + "t.co": 1, + "twstar.net": 1, + "epochtimes.com": 1, + "ilove80.be": 1, + "new-akiba.com": 1, + "xmusic.fm": 1, + "ntdtv.ru": 1, + "tvboxnow.com": 1, + "wisevid.com": 1, + "hku.hk": 1, + "zsrhao.com": 1, + "bet365.com": 1, + "power.com": 1, + "ernestmandel.org": 1, + "boxunblog.com": 1, + "geocities.jp": 1, + "tibetonline.tv": 1, + "fanqianghou.com": 1, + "modfetish.com": 1, + "jobso.tv": 1, + "ait.org.tw": 1, + "ow.ly": 1, + "ignitedetroit.net": 1, + "topshare.us": 1, + "unholyknight.com": 1, + "cctongbao.com": 1, + "neighborhoodr.com": 1, + "sinocism.com": 1, + "twitthat.com": 1, + "ranyunfei.com": 1, + "sharpdaily.com.hk": 1, + "porn2.com": 1, + "hyperrate.com": 1, + "minzhuhua.net": 1, + "ganges.com": 1, + "tweepmag.com": 1, + "ipvanish.com": 1, + "idiomconnection.com": 1, + "bitshare.com": 1, + "fuckgfw.org": 1, + "mcfog.com": 1, + "dajiyuan.eu": 1, + "over-blog.com": 1, + "tynsoe.org": 1, + "khmusic.com.tw": 1, + "dabr.me": 1, + "hiitch.com": 1, + "tmagazine.com": 1, + "zuo.la": 1, + "kissbbao.cn": 1, + "tycool.com": 1, + "skyhighpremium.com": 1, + "kui.name": 1, + "eyevio.jp": 1, + "yyii.org": 1, + "proxy.org": 1, + "thomasbernhard.org": 1, + "itweet.net": 1, + "futureme.org": 1, + "greatzhonghua.org": 1, + "muzi.net": 1, + "alvinalexander.com": 1, + "fqrouter.com": 1, + "hua-yue.net": 1, + "skimtube.com": 1, + "duckmylife.com": 1, + "twitter.com": 1, + "lenwhite.com": 1, + "epochtimes.se": 1, + "tokyo-hot.com": 1, + "asdfg.jp": 1, + "cnd.org": 1, + "imageshack.us": 1, + "getjetso.com": 1, + "freewallpaper4.me": 1, + "seesmic.com": 1, + "videomo.com": 1, + "hotpotato.com": 1, + "retweeteffect.com": 1, + "warehouse333.com": 1, + "sproutcore.com": 1, + "getsmartlinks.com": 1, + "heix.pp.ru": 1, + "sadpanda.us": 1, + "aboluowang.com": 1, + "jayparkinsonmd.com": 1, + "wangafu.net": 1, + "bralio.com": 1, + "sourceforge.net": 1, + "pornstarclub.com": 1, + "wordboner.com": 1, + "jqueryui.com": 1, + "mcadforums.com": 1, + "freegao.com": 1, + "twibs.com": 1, + "ccue.com": 1, + "wanglixiong.com": 1, + "zhanbin.net": 1, + "aol.com": 1, + "kompozer.net": 1, + "plusbb.com": 1, + "tweetymail.com": 1, + "simplecd.org": 1, + "jbtalks.cc": 1, + "privatepaste.com": 1, + "lalulalu.com": 1, + "fastly.net": 1, + "freetibet.org": 1, + "nuexpo.com": 1, + "businessweek.com": 1, + "ssh91.com": 1, + "isgreat.org": 1, + "666kb.com": 1, + "hrw.org": 1, + "tidyread.com": 1, + "speckleapp.com": 1, + "userdefined.com": 1, + "caobian.info": 1, + "keso.cn": 1, + "incredibox.fr": 1, + "twibbon.com": 1, + "isuntv.com": 1, + "tvider.com": 1, + "helpeachpeople.com": 1, + "hutianyi.net": 1, + "amnesty.org": 1, + "xys.org": 1, + "namsisi.com": 1, + "redtube.com": 1, + "teamseesmic.com": 1, + "utom.us": 1, + "tibet.org.tw": 1, + "md-t.org": 1, + "zhongguotese.net": 1, + "msguancha.com": 1, + "perlhowto.com": 1, + "multiproxy.org": 1, + "wengewang.com": 1, + "sexhu.com": 1, + "0rz.tw": 1, + "zonble.net": 1, + "jkforum.net": 1, + "sis001.us": 1, + "whatblocked.com": 1, + "cotweet.com": 1, + "xuite.net": 1, + "citizenlab.org": 1, + "faststone.org": 1, + "vapurl.com": 1, + "value-domain.com": 1, + "erights.net": 1, + "anobii.com": 1, + "pign.net": 1, + "mog.com": 1, + "fsurf.com": 1, + "fredwilson.vc": 1, + "zacebook.com": 1, + "hechaji.com": 1, + "x-berry.com": 1, + "tkforum.tk": 1, + "pagodabox.com": 1, + "dl-laby.jp": 1, + "thesartorialist.com": 1, + "soup.io": 1, + "youporn.com": 1, + "dayabook.com": 1, + "dailidaili.com": 1, + "mx981.com": 1, + "fangong.org": 1, + "chinaaid.us": 1, + "powercx.com": 1, + "9bis.net": 1, + "duplicati.com": 1, + "141hongkong.com": 1, + "bonjourlesgeeks.com": 1, + "interestinglaugh.com": 1, + "ippotv.com": 1, + "peerpong.com": 1, + "7capture.com": 1, + "uhrp.org": 1, + "yymaya.com": 1, + "marco.org": 1, + "trtc.com.tw": 1, + "here4news.com": 1, + "mixpod.com": 1, + "fengzhenghu.com": 1, + "taiwan-sex.com": 1, + "xiaod.in": 1, + "packetix.net": 1, + "im88.tw": 1, + "epochtimes.ru": 1, + "chinatimes.com": 1, + "j.mp": 1, + "voachinese.com": 1, + "laoyang.info": 1, + "codeshare.io": 1, + "dailymotion.com": 1, + "new-3lunch.net": 1, + "bcc.com.tw": 1, + "news100.com.tw": 1, + "voachineseblog.com": 1, + "eamonnbrennan.com": 1, + "topstyle4.com": 1, + "wpoforum.com": 1, + "freealim.com": 1, + "vpngate.net": 1, + "x1949x.com": 1, + "twitterfeed.com": 1, + "palacemoon.com": 1, + "mhradio.org": 1, + "webworkerdaily.com": 1, + "fillthesquare.org": 1, + "dadazim.com": 1, + "thehousenews.com": 1, + "yvesgeleyn.com": 1, + "loved.hk": 1, + "dontfilter.us": 1, + "catholic.org.tw": 1, + "civicparty.hk": 1, + "on.cc": 1, + "zarias.com": 1, + "ccue.ca": 1, + "pastie.org": 1, + "web2project.net": 1, + "aisex.com": 1, + "curvefish.com": 1, + "slime.com.tw": 1, + "marxists.org": 1, + "chubun.com": 1, + "liuhanyu.com": 1, + "boxun.tv": 1, + "xuzhiyong.net": 1, + "joeedelman.com": 1, + "dynawebinc.com": 1, + "jbtalks.com": 1, + "iu45.com": 1, + "w3.org": 1, + "davidslog.com": 1, + "tv-intros.com": 1, + "dafahao.com": 1, + "mingpaotor.com": 1, + "nekoslovakia.net": 1, + "epochtimes.de": 1, + "zhong.pp.ru": 1, + "chinalawtranslate.com": 1, + "freessh.us": 1, + "cuhkacs.org": 1, + "fanglizhi.info": 1, + "fdbox.com": 1, + "ozyoyo.com": 1, + "panluan.net": 1, + "shenzhoufilm.com": 1, + "cafepress.com": 1, + "debian.org": 1, + "worldcat.org": 1, + "dtiserv2.com": 1, + "mgstage.com": 1, + "xnxx.com": 1, + "co.hk": 1, + "twitpic.com": 1, + "path.com": 1, + "nicovideo.jp": 1, + "zeutch.com": 1, + "newchen.com": 1, + "lrfz.com": 1, + "freeopenvpn.com": 1, + "pbs.org": 1, + "myspace.com": 1, + "idaiwan.com": 1, + "foxsub.com": 1, + "tiffanyarment.com": 1, + "get-digital-help.com": 1, + "secretgarden.no": 1, + "mixx.com": 1, + "twibase.com": 1, + "uploaded.to": 1, + "ialmostlaugh.com": 1, + "tzangms.com": 1, + "thechinabeat.org": 1, + "co.tv": 1, + "jingpin.org": 1, + "facebook.com": 1, + "space-scape.com": 1, + "dadi360.com": 1, + "tomsc.com": 1, + "4sq.com": 1, + "myaudiocast.com": 1, + "friendfeed-media.com": 1, + "nodesnoop.com": 1, + "newyorktimes.com": 1, + "rxhj.net": 1, + "qienkuen.org": 1, + "uwants.net": 1, + "culture.tw": 1, + "identi.ca": 1, + "list.ly": 1, + "duckload.com": 1, + "videobam.com": 1, + "stoweboyd.com": 1, + "zkaip.com": 1, + "vpnpronet.com": 1, + "nps.gov": 1, + "wqyd.org": 1, + "togetter.com": 1, + "taipeisociety.org": 1, + "torproject.org": 1, + "tw": 1, + "gclooney.com": 1, + "hkej.com": 1, + "blog.de": 1, + "koolsolutions.com": 1, + "mmmca.com": 1, + "great-firewall.com": 1, + "chrlcg-hk.org": 1, + "movabletype.com": 1, + "immigration.gov.tw": 1, + "dw-world.de": 1, + "anchorfree.com": 1, + "gospelherald.com": 1, + "purevpn.com": 1, + "voacantonese.com": 1, + "djangosnippets.org": 1, + "hasaowall.com": 1, + "tweetwally.com": 1, + "pokerstrategy.com": 1, + "xing.com": 1, + "podictionary.com": 1, + "stickeraction.com": 1, + "derekhsu.homeip.net": 1, + "sis.xxx": 1, + "wzyboy.im": 1, + "buzzurl.jp": 1, + "twistar.cc": 1, + "taa-usa.org": 1, + "appledaily.com": 1, + "nysingtao.com": 1, + "tuxtraining.com": 1, + "cz.cc": 1, + "xbookcn.com": 1, + "witopia.net": 1, + "wenyunchao.com": 1, + "travelinlocal.com": 1, + "thetibetpost.com": 1, + "szbbs.net": 1, + "canadameet.com": 1, + "backpackers.com.tw": 1, + "uncyclopedia.info": 1, + "helloandroid.com": 1, + "greatfirewallofchina.net": 1, + "tibetanyouthcongress.org": 1, + "alexdong.com": 1, + "alabout.com": 1, + "sexandsubmission.com": 1, + "pbxes.org": 1, + "hutong9.net": 1, + "verybs.com": 1, + "blogspot.jp": 1, + "avidemux.org": 1, + "alkasir.com": 1, + "shinychan.com": 1, + "yasukuni.or.jp": 1, + "shenshou.org": 1, + "tube.com": 1, + "xizang-zhiye.org": 1, + "galenwu.com": 1, + "areca-backup.org": 1, + "bao.li": 1, + "multiupload.com": 1, + "greenvpn.net": 1, + "thedieline.com": 1, + "berlintwitterwall.com": 1, + "dfanning.com": 1, + "molihua.org": 1, + "hungerstrikeforaids.org": 1, + "npa.go.jp": 1, + "10musume.com": 1, + "wet123.com": 1, + "newlandmagazine.com.au": 1, + "gather.com": 1, + "bcchinese.net": 1, + "sesawe.net": 1, + "usejump.com": 1, + "funp.com": 1, + "mh4u.org": 1, + "wukangrui.net": 1, + "jeanyim.com": 1, + "chinaworker.info": 1, + "maxgif.com": 1, + "pixelqi.com": 1, + "sjum.cn": 1, + "mgoon.com": 1, + "cbsnews.com": 1, + "chengmingmag.com": 1, + "all-that-is-interesting.com": 1, + "soumo.info": 1, + "xpud.org": 1, + "naacoalition.org": 1, + "anyu.org": 1, + "latelinenews.com": 1, + "s1heng.com": 1, + "e-info.org.tw": 1, + "wenku.com": 1, + "mitbbs.com": 1, + "wiredbytes.com": 1, + "qxbbs.org": 1, + "yx51.net": 1, + "popyard.org": 1, + "state.gov": 1, + "yunchao.net": 1, + "dolc.de": 1, + "ironpython.net": 1, + "alasbarricadas.org": 1, + "parislemon.com": 1, + "oxid.it": 1, + "tweetmeme.com": 1, + "rerouted.org": 1, + "disp.cc": 1, + "aiweiweiblog.com": 1, + "123rf.com": 1, + "macrovpn.com": 1, + "badoo.com": 1, + "ukchinese.com": 1, + "mycould.com": 1, + "mixedmedialabs.com": 1, + "frommel.net": 1, + "mininova.org": 1, + "yegle.net": 1, + "teck.in": 1, + "bbsland.com": 1, + "blogtd.net": 1, + "sshtunnel.googlecode.com": 1, + "popularpages.net": 1, + "savevid.com": 1, + "pornoxo.com": 1, + "lsmkorean.org": 1, + "womensrightsofchina.org": 1, + "netme.cc": 1, + "squarespace.com": 1, + "hkgolden.com": 1, + "voatibetan.com": 1, + "ajaxplorer.info": 1, + "newtalk.tw": 1, + "shkspr.mobi": 1, + "politicalchina.org": 1, + "ddc.com.tw": 1, + "linuxreviews.org": 1, + "twisternow.com": 1, + "881903.com": 1, + "moby.to": 1, + "woopie.tv": 1, + "zdnet.com.tw": 1, + "nch.com.tw": 1, + "dojin.com": 1, + "ned.org": 1, + "ibiblio.org": 1, + "fakku.net": 1, + "wuala.com": 1, + "daxa.cn": 1, + "lightbox.com": 1, + "yhcw.net": 1, + "iphonix.fr": 1, + "twit2d.com": 1, + "netflix.com": 1, + "gutteruncensored.com": 1, + "hdtvb.net": 1, + "shapeservices.com": 1, + "westernwolves.com": 1, + "psiphon.ca": 1, + "rthk.org.hk": 1, + "washeng.net": 1, + "purepdf.com": 1, + "larsgeorge.com": 1, + "hloli.net": 1, + "twbbs.net.tw": 1, + "zgzcjj.net": 1, + "linkideo.com": 1, + "softether.co.jp": 1, + "phuquocservices.com": 1, + "drgan.net": 1, + "pcdiscuss.com": 1, + "sitemaps.org": 1, + "abc.pp.ru": 1, + "linuxtoy.org": 1, + "thedailywh.at": 1, + "addictedtocoffee.de": 1, + "getchu.com": 1, + "geekerhome.com": 1, + "greatroc.org": 1, + "alternate-tools.com": 1, + "marxist.com": 1, + "kanzhongguo.com": 1, + "greatroc.tw": 1, + "pk.com": 1, + "palmislife.com": 1, + "dlsite.com": 1, + "qooza.hk": 1, + "crossthewall.net": 1, + "twbbs.org": 1, + "xinshijue.com": 1, + "shvoong.com": 1, + "woopie.jp": 1, + "hqcdp.org": 1, + "freenewscn.com": 1, + "hkjp.org": 1, + "stoneip.info": 1, + "googleusercontent.com": 1, + "amazon.com": 1, + "old-cat.net": 1, + "shadow.ma": 1, + "instagram.com": 1, + "ht.ly": 1, + "sydneytoday.com": 1, + "olympicwatch.org": 1, + "whippedass.com": 1, + "tafaward.com": 1, + "falunart.org": 1, + "unknownspace.org": 1, + "tweetrans.com": 1, + "jyxf.net": 1, + "vmixcore.com": 1, + "uushare.com": 1, + "wikileaks.de": 1, + "flickrhivemind.net": 1, + "sis001.com": 1, + "workatruna.com": 1, + "memedia.cn": 1, + "gpass1.com": 1, + "megarotic.com": 1, + "pikchur.com": 1, + "dev102.com": 1, + "zengjinyan.org": 1, + "centralnation.com": 1, + "puffinbrowser.com": 1, + "pandora.tv": 1, + "amiblockedornot.com": 1, + "zhinengluyou.com": 1, + "bannedbook.org": 1, + "chinesenewsnet.com": 1, + "nokogiri.org": 1, + "wolfax.com": 1, + "ifcss.org": 1, + "pwned.com": 1, + "thumbzilla.com": 1, + "icerocket.com": 1, + "koornk.com": 1, + "leecheukyan.org": 1, + "theqii.info": 1, + "blip.tv": 1, + "tweetbackup.com": 1, + "updatestar.com": 1, + "gzone-anime.info": 1, + "1984bbs.org": 1, + "penthouse.com": 1, + "ff.im": 1, + "uploadstation.com": 1, + "expofutures.com": 1, + "alliance.org.hk": 1, + "wearn.com": 1, + "efcc.org.hk": 1, + "zattoo.com": 1, + "askynz.net": 1, + "zaobao.com.sg": 1, + "heartyit.com": 1, + "qixianglu.cn": 1, + "bettween.com": 1, + "gun-world.net": 1, + "kenengba.com": 1, + "iphone-dev.org": 1, + "crackle.com": 1, + "twftp.org": 1, + "zlib.net": 1, + "multiply.com": 1, + "lipuman.com": 1, + "monlamit.org": 1, + "porntube.com": 1, + "tunein.com": 1, + "uwants.com": 1, + "gotw.ca": 1, + "tumutanzi.com": 1, + "opera-mini.net": 1, + "dizhidizhi.com": 1, + "pbwiki.com": 1, + "ruyiseek.com": 1, + "docstoc.com": 1, + "navigeaters.com": 1, + "eltondisney.com": 1, + "free.fr": 1, + "1bao.org": 1, + "extremetube.com": 1, + "yeelou.com": 1, + "corumcollege.com": 1, + "merit-times.com.tw": 1, + "exblog.co.jp": 1, + "hkheadline.com": 1, + "uocn.org": 1, + "wikileaks.org": 1, + "taiwanyes.com": 1, + "chinesepen.org": 1, + "itaboo.info": 1, + "thisiswhyyouarefat.com": 1, + "martincartoons.com": 1, + "theinternetwishlist.com": 1, + "twitgether.com": 1, + "hecaitou.net": 1, + "collateralmurder.com": 1, + "baixing.me": 1, + "lesscss.org": 1, + "uk.to": 1, + "wikisource.org": 1, + "nanyang.com": 1, + "wikia.com": 1, + "michaelanti.com": 1, + "2shared.com": 1, + "chinagreenparty.org": 1, + "fireofliberty.org": 1, + "isohunt.com": 1, + "ibtimes.com": 1, + "meirixiaochao.com": 1, + "rutube.ru": 1, + "erepublik.com": 1, + "briefdream.com": 1, + "vocn.tv": 1, + "ironicsoftware.com": 1, + "htxt.it": 1, + "mayimayi.com": 1, + "businesstimes.com.cn": 1, + "dayoneapp.com": 1, + "beijing1989.com": 1, + "kingdomsalvation.org": 1, + "vpnbook.com": 1, + "ping.fm": 1, + "pentalogic.net": 1, + "wan-press.org": 1, + "hudatoriq.web.id": 1, + "url.com.tw": 1, + "duihua.org": 1, + "bowenpress.com": 1, + "fotop.net": 1, + "liveleak.com": 1, + "tvb.com": 1, + "ulike.net": 1, + "365singles.com.ar": 1, + "calebelston.com": 1, + "turbobit.net": 1, + "liujianshu.com": 1, + "daylife.com": 1, + "tuitui.info": 1, + "allinfo.com": 1, + "lsd.org.hk": 1, + "mingjinglishi.com": 1, + "qx.net": 1, + "wepn.info": 1, + "tenacy.com": 1, + "parade.com": 1, + "mobile01.com": 1, + "cynscribe.com": 1, + "lockestek.com": 1, + "dtic.mil": 1, + "jinhai.de": 1, + "x-art.com": 1, + "atchinese.com": 1, + "gazotube.com": 1, + "nownews.com": 1, + "64wiki.com": 1, + "bloglovin.com": 1, + "v-state.org": 1, + "popyard.com": 1, + "easyweb.hk": 1, + "oiktv.com": 1, + "ytht.net": 1, + "willw.net": 1, + "voy.com": 1, + "chinahush.com": 1, + "eyespirit.info": 1, + "wangjinbo.org": 1, + "dowei.org": 1, + "tianhuayuan.com": 1, + "ncol.com": 1, + "goagent.googlecode.com": 1, + "orzdream.com": 1, + "fangbinxing.com": 1, + "gongminliliang.com": 1, + "heywire.com": 1, + "cdjp.org": 1, + "code1984.com": 1, + "gzm.tv": 1, + "sharebee.com": 1, + "youthbao.com": 1, + "chinadigitaltimes.net": 1, + "tagwalk.com": 1, + "chinagfw.org": 1, + "wenxuecity.com": 1, + "veoh.com": 1, + "dongyangjing.com": 1, + "lizhizhuangbi.com": 1, + "tangben.com": 1, + "logbot.net": 1, + "fc2blog.net": 1, + "techlifeweb.com": 1, + "junefourth-20.net": 1, + "seapuff.com": 1, + "blogspot.hk": 1, + "waikeung.org": 1, + "jinbushe.org": 1, + "my-proxy.com": 1, + "kun.im": 1, + "shodanhq.com": 1, + "kimy.com.tw": 1, + "fflick.com": 1, + "sino-monthly.com": 1, + "slutload.com": 1, + "postadult.com": 1, + "falundafa.org": 1, + "ifttt.com": 1, + "yi.org": 1, + "tube8.com": 1, + "epochtimes.ie": 1, + "opnir.com": 1, + "marguerite.su": 1, + "chenpokong.com": 1, + "2-hand.info": 1, + "dit-inc.us": 1, + "wikibooks.org": 1, + "longhair.hk": 1, + "dxiong.com": 1, + "plixi.com": 1, + "ntu.edu.tw": 1, + "weekmag.info": 1, + "img.ly": 1, + "tuanzt.com": 1, + "bit.ly": 1, + "pornhub.com": 1, + "mihua.org": 1, + "ck101.com": 1, + "wikileaks.eu": 1, + "wallornot.org": 1, + "softether.org": 1, + "joeyrobert.org": 1, + "twapperkeeper.com": 1, + "rushbee.com": 1, + "zoho.com": 1, + "sendspace.com": 1, + "proxomitron.info": 1, + "allmovie.com": 1, + "google.com": 1, + "badassjs.com": 1, + "howtoforge.com": 1, + "fanqiangyakexi.net": 1, + "googlevideo.com": 1, + "torvpn.com": 1, + "qvodzy.org": 1, + "hacken.cc": 1, + "ismprofessional.net": 1, + "presentationzen.com": 1, + "huping.net": 1, + "velkaepocha.sk": 1, + "chinamule.com": 1, + "trulyergonomic.com": 1, + "atnext.com": 1, + "nccwatch.org.tw": 1, + "globalmuseumoncommunism.org": 1, + "streamingthe.net": 1, + "qanote.com": 1, + "falunhr.org": 1, + "thehungrydudes.com": 1, + "wordpress.com": 1, + "nexttv.com.tw": 1, + "discuss.com.hk": 1, + "usmc.mil": 1, + "basetimesheightdividedby2.com": 1, + "oauth.net": 1, + "wetpussygames.com": 1, + "zshare.net": 1, + "89-64.org": 1, + "linglingfa.com": 1, + "juziyue.com": 1, + "ruanyifeng.com": 1, + "cnyes.com": 1, + "aiph.net": 1, + "skybet.com": 1, + "vatn.org": 1, + "hypeshell.com": 1, + "megavideo.com": 1, + "rojo.com": 1, + "tibetfund.org": 1, + "awardwinningfjords.com": 1, + "falundafamuseum.org": 1, + "jiepang.com": 1, + "eulam.com": 1, + "pchome.com.tw": 1, + "thehun.net": 1, + "tistory.com": 1, + "blingblingsquad.net": 1, + "nakido.com": 1, + "fzh999.net": 1, + "creaders.net": 1, + "hkbf.org": 1, + "wqlhw.com": 1, + "overlapr.com": 1, + "us.to": 1, + "tl.gd": 1, + "ourdearamy.com": 1, + "epochtimes.fr": 1, + "google.com.hk": 1, + "wapedia.mobi": 1, + "allaboutalpha.com": 1, + "graylog2.org": 1, + "metrolife.ca": 1, + "gigporno.ru": 1, + "moviefap.com": 1, + "twtkr.com": 1, + "rferl.org": 1, + "shwchurch3.com": 1, + "sysadmin1138.net": 1, + "electionsmeter.com": 1, + "cyberctm.com": 1, + "rsf-chinese.org": 1, + "sparrowmailapp.com": 1, + "sex.com": 1, + "xuzhuoer.com": 1, + "xmovies.com": 1, + "duoweitimes.com": 1, + "rapidshare8.com": 1, + "chingcheong.com": 1, + "xhamster.com": 1, + "moegirl.org": 1, + "freemoren.com": 1, + "pornbase.org": 1, + "danwei.org": 1, + "greenparty.org.tw": 1, + "van698.com": 1, + "mlcool.com": 1, + "uighurbiz.net": 1, + "omgili.com": 1, + "blogspot.in": 1, + "sharpdaily.hk": 1, + "jiehua.cz": 1, + "livevideo.com": 1, + "weblagu.com": 1, + "nlfreevpn.com": 1, + "zyzc9.com": 1, + "wiredpen.com": 1, + "chinasoul.org": 1, + "sopcast.org": 1, + "mysinablog.com": 1, + "sogrady.me": 1, + "teashark.com": 1, + "etizer.org": 1, + "westca.com": 1, + "forums-free.com": 1, + "oikos.com.tw": 1, + "315lz.com": 1, + "letscorp.net": 1, + "powerapple.com": 1, + "hk32168.com": 1, + "51.ca": 1, + "salvation.org.hk": 1, + "rfi.fr": 1, + "getiton.com": 1, + "awflasher.com": 1, + "getlantern.org": 1, + "i2runner.com": 1, + "hidecloud.com": 1, + "gcpnews.com": 1, + "marxist.net": 1, + "vegorpedersen.com": 1, + "twifan.com": 1, + "tweetphoto.com": 1, + "ovi.com": 1, + "cubicle17.com": 1, + "greatfire.org": 1, + "gabocorp.com": 1, + "tibetonline.com": 1, + "change.org": 1, + "turbotwitter.com": 1, + "chinaaid.me": 1, + "thisav.com": 1, + "free-ssh.com": 1, + "tubewolf.com": 1, + "gfw.org.ua": 1, + "chinesedailynews.com": 1, + "viki.com": 1, + "ecministry.net": 1, + "mooo.com": 1, + "sinoquebec.com": 1, + "yahoo.co.jp": 1, + "slandr.net": 1, + "favorious.com": 1, + "rhcloud.com": 1, + "sthoo.com": 1, + "softwarebychuck.com": 1, + "illusionfactory.com": 1, + "efksoft.com": 1, + "staticflickr.com": 1, + "freenet-china.org": 1, + "cams.com": 1, + "21andy.com": 1, + "megabyet.net": 1, + "greatfirewall.biz": 1, + "islam.org.hk": 1, + "tiananmenmother.org": 1, + "mirrorbooks.com": 1, + "chinageeks.org": 1, + "dongtaiwang.com": 1, + "twimg.com": 1, + "hardsextube.com": 1, + "soundcloud.com": 1, + "4bluestones.biz": 1, + "tweepguide.com": 1, + "twitlonger.com": 1, + "revleft.com": 1, + "october-review.org": 1, + "isunaffairs.com": 1, + "codeboxapp.com": 1, + "zinio.com": 1, + "snaptu.com": 1, + "fc2china.com": 1, + "sendoid.com": 1, + "giganews.com": 1, + "huaglad.com": 1, + "youthwant.com.tw": 1, + "eventful.com": 1, + "yeeyi.com": 1, + "istef.info": 1, + "playboy.com": 1, + "youjizz.com": 1, + "thelius.org": 1, + "imkev.com": 1, + "websitepulse.com": 1, + "listorious.com": 1, + "open.com.hk": 1, + "youversion.com": 1, + "rlwlw.com": 1, + "twitcause.com": 1, + "flickr.com": 1, + "ajsands.com": 1, + "waiwaier.com": 1, + "site90.net": 1, + "hootsuite.com": 1, + "dongtaiwang.net": 1, + "telecomspace.com": 1, + "delcamp.net": 1, + "dalailama.ru": 1, + "vpnpop.com": 1, + "301works.org": 1, + "chinaeweekly.com": 1, + "youpai.org": 1, + "mpettis.com": 1, + "nokola.com": 1, + "tsctv.net": 1, + "aol.ca": 1, + "tsunagarumon.com": 1, + "hinet.net": 1, + "cherrysave.com": 1, + "mondex.org": 1, + "dwnews.com": 1, + "hjclub.info": 1, + "h1n1china.org": 1, + "raidcall.com.tw": 1, + "goofind.com": 1, + "weiming.info": 1, + "hotspotshield.com": 1, + "sopcast.com": 1, + "aobo.com.au": 1, + "fangongheike.com": 1, + "i2p2.de": 1, + "kingstone.com.tw": 1, + "proxifier.com": 1, + "twilog.org": 1, + "oursteps.com.au": 1, + "twittermail.com": 1, + "reflectivecode.com": 1, + "freechal.com": 1, + "fail.hk": 1, + "tt1069.com": 1, + "6park.com": 1, + "piring.com": 1, + "internetpopculture.com": 1, + "tuite.googlecode.com": 1, + "ub0.cc": 1, + "zootool.com": 1, + "huaxin.ph": 1, + "melon-peach.com": 1, + "d0z.net": 1, + "cenci.tk": 1, + "tianzhu.org": 1, + "hkptu.org": 1, + "gamer.com.tw": 1, + "wellplacedpixels.com": 1, + "recordhistory.org": 1, + "exblog.jp": 1, + "tsquare.tv": 1, + "renminbao.com": 1, + "brucewang.net": 1, + "sesawe.org": 1, + "vincnd.com": 1, + "edoors.com": 1, + "southnews.com.tw": 1, + "etaiwannews.com": 1, + "malaysiakini.com": 1, + "udn.com": 1, + "am730.com.hk": 1, + "wexiaobo.org": 1, + "unicode.org": 1, + "soifind.com": 1, + "favstar.fm": 1, + "zomobo.net": 1, + "braumeister.org": 1, + "sammyjs.org": 1, + "wujieliulan.com": 1, + "revver.com": 1, + "twitturly.com": 1, + "getsocialscope.com": 1, + "compython.net": 1, + "webbang.net": 1, + "citizensradio.org": 1, + "gowalla.com": 1, + "paper.li": 1, + "dtiblog.com": 1, + "sejie.com": 1, + "meteorshowersonline.com": 1, + "faydao.com": 1, + "trialofccp.org": 1, + "comedycentral.com": 1, + "linksalpha.com": 1, + "zmw.cn": 1, + "panoramio.com": 1, + "tweetmylast.fm": 1, + "blogspot.fr": 1, + "6v6dota.com": 1, + "omnitalk.com": 1, + "idlcoyote.com": 1, + "ning.com": 1, + "libertytimes.com.tw": 1, + "democrats.org": 1, + "orchidbbs.com": 1, + "china21.org": 1, + "bbcchinese.com": 1, + "af.mil": 1, + "pin6.com": 1, + "sankaizok.com": 1, + "feer.com": 1, + "avaaz.org": 1, + "bloomfortune.com": 1, + "sfileydy.com": 1, + "nanyangpost.com": 1, + "python.com": 1, + "sandnoble.com": 1, + "read100.com": 1, + "classicalguitarblog.net": 1, + "buugaa.com": 1, + "amnestyusa.org": 1, + "thereallove.kr": 1, + "antiwave.net": 1, + "fawanghuihui.org": 1, + "x-wall.org": 1, + "daolan.net": 1, + "gfwinterceptor.googlecode.com": 1, + "taiwanus.net": 1, + "seraph.me": 1, + "szetowah.org.hk": 1, + "yuanming.net": 1, + "geekmanuals.com": 1, + "guancha.org": 1, + "chinayuanmin.org": 1, + "nga.mil": 1, + "my903.com": 1, + "archive.org": 1, + "tamiaode.tk": 1, + "netlog.com": 1, + "onmoon.com": 1, + "jiaoyou8.com": 1, + "twibble.de": 1, + "gaymap.cc": 1, + "xinhuanet.org": 1, + "yorkbbs.ca": 1, + "scribd.com": 1, + "blogspot.com": 1, + "taragana.com": 1, + "kl.am": 1, + "rti.org.tw": 1, + "relaxbbs.com": 1, + "cellulo.info": 1, + "owind.com": 1, + "ucam.org": 1, + "phonegap.com": 1, + "navy.mil": 1, + "tibet.net": 1, + "uncyclomedia.org": 1, + "vpncup.com": 1, + "oopsforum.com": 1, + "orientaldaily.com.my": 1, + "hkbc.net": 1, + "youtube-nocookie.com": 1, + "winwhispers.info": 1, + "savetibet.org": 1, + "sohfrance.org": 1, + "thegatesnotes.com": 1, + "netcolony.com": 1, + "kechara.com": 1, + "break.com": 1, + "cenews.eu": 1, + "xxxx.com.au": 1, + "muouju.com": 1, + "h-china.org": 1, + "voanews.com": 1, + "proxyroad.com": 1, + "tttan.com": 1, + "dpp.org.tw": 1, + "gdbt.net": 1, + "hnjhj.com": 1, + "thkphoto.com": 1, + "la-forum.org": 1, + "weiquanwang.org": 1, + "nabble.com": 1, + "tweetedtimes.com": 1, + "okayfreedom.com": 1, + "twimbow.com": 1, + "cclife.org": 1, + "zhenlibu.info": 1, + "hkday.net": 1, + "1984bbs.com": 1, + "iphonehacks.com": 1, + "atebits.com": 1, + "solozorro.tk": 1, + "justtristan.com": 1, + "pmates.com": 1, + "waigaobu.com": 1, + "naol.ca": 1, + "adultfriendfinder.com": 1, + "collateralmurder.org": 1, + "twitbrowser.net": 1, + "jbtalks.my": 1, + "mediafire.com": 1, + "theatrum-belli.com": 1, + "geocities.co.jp": 1, + "listentoyoutube.com": 1, + "somee.com": 1, + "yahoo.com.hk": 1, + "sexhuang.com": 1, + "stonegames.net": 1, + "dzze.com": 1, + "python.com.tw": 1, + "throughnightsfire.com": 1, + "liuxiaotong.com": 1, + "blogs.com": 1, + "artsy.net": 1, + "mashable.com": 1, + "axureformac.com": 1, + "64tianwang.com": 1, + "domain.club.tw": 1, + "imageflea.com": 1, + "wangruoshui.net": 1, + "dougscripts.com": 1, + "yogichen.org": 1, + "bewww.net": 1, + "gongm.in": 1, + "shenyunperformingarts.org": 1, + "pekingduck.org": 1, + "radiotime.com": 1, + "cdp1998.org": 1, + "kwongwah.com.my": 1, + "blinw.com": 1, + "atj.org.tw": 1, + "aenhancers.com": 1, + "ytimg.com": 1, + "freevpn.nl": 1, + "netfirms.com": 1, + "windowsphoneme.com": 1, + "xiaochuncnjp.com": 1, + "chinainterimgov.org": 1, + "xysblogs.org": 1, + "epochtimes-bg.com": 1, + "samair.ru": 1, + "taiwankiss.com": 1, + "hotpot.hk": 1, + "books.com.tw": 1, + "proxlet.com": 1, + "gyalwarinpoche.com": 1, + "focusvpn.com": 1, + "dphk.org": 1, + "oulove.org": 1, + "filefactory.com": 1, + "ifanr.com": 1, + "urlborg.com": 1, + "minzhuzhongguo.org": 1, + "fb.me": 1, + "icij.org": 1, + "twindexx.com": 1, + "twitreferral.com": 1, + "linuxconfig.org": 1, + "cts.com.tw": 1, + "sanmin.com.tw": 1, + "logmike.com": 1, + "ultraxs.com": 1, + "highrockmedia.com": 1, + "theappleblog.com": 1, + "taiwannews.com.tw": 1, + "twa.sh": 1, + "tacem.org": 1, + "percy.in": 1, + "apigee.com": 1, + "itshidden.com": 1, + "birdhouseapp.com": 1, + "dongde.com": 1, + "mefeedia.com": 1, + "embr.in": 1, + "clb.org.hk": 1, + "chaturbate.com": 1, + "strongvpn.com": 1, + "asianwomensfilm.de": 1, + "bugclub.org": 1, + "xvedios.com": 1, + "mpinews.com": 1, + "x365x.com": 1, + "arctosia.com": 1, + "tiantibooks.org": 1, + "worstthingieverate.com": 1, + "kodingen.com": 1, + "twyac.org": 1, + "shizhao.org": 1, + "budaedu.org": 1, + "rcinet.ca": 1, + "soh.tw": 1, + "date.fm": 1, + "izihost.org": 1, + "threatchaos.com": 1, + "paper-replika.com": 1, + "mychat.to": 1, + "farwestchina.com": 1, + "inxian.com": 1, + "xxbbx.com": 1, + "taiwantt.org.tw": 1, + "voa.mobi": 1, + "huaren.us": 1, + "twblogger.com": 1, + "penchinese.com": 1, + "everyday-carry.com": 1, + "hotfile.com": 1, + "sitetag.us": 1, + "twaud.io": 1, + "singtao.com": 1, + "chinainperspective.org": 1, + "soundofhope.org": 1, + "toonel.net": 1, + "city9x.com": 1, + "ufreevpn.com": 1, + "sufeng.org": 1, + "veempiire.com": 1, + "delicious.com": 1, + "thebcomplex.com": 1, + "noypf.com": 1, + "radiovaticana.org": 1, + "igfw.net": 1, + "chandoo.org": 1, + "tomayko.com": 1, + "tonyyan.net": 1, + "ucdc1998.org": 1, + "hkjc.com": 1, + "xiaoma.org": 1, + "so-ga.net": 1, + "sapikachu.net": 1, + "pacificpoker.com": 1, + "unpo.org": 1, + "sitebro.tw": 1, + "blockcn.com": 1, + "prayforchina.net": 1, + "gmhz.org": 1, + "spotify.com": 1, + "gunsamerica.com": 1, + "openwebster.com": 1, + "liu.lu": 1, + "muselinks.co.jp": 1, + "36rain.com": 1, + "peacefire.org": 1, + "cytode.us": 1, + "yahoo.com": 1, + "hongmeimei.com": 1, + "waffle1999.com": 1, + "globalvoicesonline.org": 1, + "vft.com.tw": 1, + "huluim.com": 1, + "livestation.com": 1, + "onmoon.net": 1, + "pixnet.in": 1, + "nanzao.com": 1, + "sinica.edu.tw": 1, + "wezone.net": 1, + "cochina.org": 1, + "astonmartinnews.com": 1, + "baywords.com": 1, + "twitoaster.com": 1, + "s135.com": 1, + "iredmail.org": 1, + "fring.com": 1, + "spankwire.com": 1, + "nytco.com": 1, + "fofg.org": 1, + "qtrac.eu": 1, + "proxypy.net": 1, + "tweepml.org": 1, + "izles.net": 1, + "cactusvpn.com": 1, + "blogger.com": 1, + "have8.com": 1, + "retweetrank.com": 1, + "mychinamyhome.com": 1, + "hellotxt.com": 1, + "chrispederick.net": 1, + "goodreads.com": 1, + "cjb.net": 1, + "andfaraway.net": 1, + "cdp2006.org": 1, + "youthnetradio.org": 1, + "forum4hk.com": 1, + "chinalawandpolicy.com": 1, + "civisec.org": 1, + "junauza.com": 1, + "mihk.hk": 1, + "palm.com": 1, + "student.tw": 1, + "svwind.com": 1, + "chrlawyers.hk": 1, + "pinoy-n.com": 1, + "girlbanker.com": 1, + "!--isaacmao.com": 1, + "usacn.com": 1, + "privateinternetaccess.com": 1, + "hgseav.com": 1, + "advertfan.com": 1, + "xiaohexie.com": 1, + "lazarsearlymusic.com": 1, + "chinesetalks.net": 1, + "bloomberg.com": 1, + "fleshbot.com": 1, + "higfw.com": 1, + "vinniev.com": 1, + "justin.tv": 1, + "adultkeep.net": 1, + "jieshibaobao.com": 1, + "bfsh.hk": 1, + "loiclemeur.com": 1, + "bfnn.org": 1, + "faiththedog.info": 1, + "gtap.googlecode.com": 1, + "picidae.net": 1, + "epochweekly.com": 1, + "free-gate.org": 1, + "freelotto.com": 1, + "himemix.com": 1, + "tweetree.com": 1, + "rfachina.com": 1, + "truthcn.com": 1, + "xcity.jp": 1, + "newsancai.com": 1, + "caochangqing.com": 1, + "liberal.org.hk": 1, + "mrtweet.com": 1, + "gamez.com.tw": 1, + "qi-gong.me": 1, + "steel-storm.com": 1, + "turntable.fm": 1, + "couchdbwiki.com": 1, + "flecheinthepeche.fr": 1, + "swift-tools.net": 1, + "mmaaxx.com": 1, + "fdc89.jp": 1, + "emory.edu": 1, + "eic-av.com": 1, + "topsy.com": 1, + "kyohk.net": 1, + "pose.com": 1, + "neolee.cn": 1, + "edicypages.com": 1, + "designerol.com": 1, + "knowledgerush.com": 1, + "ebookee.com": 1, + "so-news.com": 1, + "mthruf.com": 1, + "getfoxyproxy.org": 1, + "pathtosharepoint.com": 1, + "logiqx.com": 1, + "doxygen.org": 1, + "say2.info": 1, + "deutsche-welle.de": 1, + "dabr.mobi": 1, + "catch22.net": 1, + "digitalnomadsproject.org": 1, + "github.com": 1, + "blogspot.de": 1, + "pcdvd.com.tw": 1, + "getyouram.com": 1, + "compileheart.com": 1, + "hidden-advent.org": 1, + "megaporn.com": 1, + "hougaige.com": 1, + "aboutgfw.com": 1, + "comefromchina.com": 1, + "e-spacy.com": 1, + "funf.tw": 1, + "worldjournal.com": 1, + "olumpo.com": 1, + "finler.net": 1, + "zoozle.net": 1, + "vcf-online.org": 1, + "wikimedia.org.mo": 1, + "de-sci.org": 1, + "stuffimreading.net": 1, + "state168.com": 1, + "cantonese.asia": 1, + "fzh999.com": 1, + "ipobar.com": 1, + "topshareware.com": 1, + "pokerstars.com": 1, + "bloomberg.cn": 1, + "qstatus.com": 1, + "muzi.com": 1, + "syx86.cn": 1, + "changp.com": 1, + "techparaiso.com": 1, + "posterous.com": 1, + "interfaceaddiction.com": 1, + "cnitter.com": 1, + "chinaaid.net": 1, + "fscked.org": 1, + "storagenewsletter.com": 1, + "guishan.org": 1, + "christusrex.org": 1, + "syncback.com": 1, + "tweetboard.com": 1, + "powerpointninja.com": 1, + "orient-doll.com": 1, + "navicat.com": 1, + "twittercounter.com": 1, + "git-scm.com": 1, + "martau.com": 1, + "inmediahk.net": 1, + "aliengu.com": 1, + "taweet.com": 1, + "0to255.com": 1, + "duping.net": 1, + "tkcs-collins.com": 1, + "trustedbi.com": 1, + "redren.com": 1, + "nighost.org": 1, + "babynet.com.hk": 1, + "mmdays.com": 1, + "appspot.com": 1, + "dollf.com": 1, + "hellonewyork.us": 1, + "1eew.com": 1, + "taiwannation.com": 1, + "wezhiyong.org": 1, + "csuchen.de": 1, + "wahas.com": 1, + "lookingglasstheatre.org": 1, + "furinkan.com": 1, + "observechina.net": 1, + "chinachannel.hk": 1, + "sysresccd.org": 1, + "meetup.com": 1, + "renyurenquan.org": 1, + "chinese-memorial.org": 1, + "canyu.org": 1, + "jgoodies.com": 1, + "china-week.com": 1, + "pureconcepts.net": 1, + "sowiki.net": 1, + "kangye.org": 1, + "br.st": 1, + "yfrog.com": 1, + "msn.com.tw": 1, + "mingpao.com": 1, + "crd-net.org": 1, + "hk": 1, + "googleapis.com": 1, + "ydy.com": 1, + "bipic.net": 1, + "tibet.com": 1, + "naitik.net": 1, + "cuihua.org": 1, + "gs-discuss.com": 1, + "diaoyuislands.org": 1, + "wozy.in": 1, + "xthost.info": 1, + "myopenid.com": 1, + "hkdailynews.com.hk": 1, + "glennhilton.com": 1, + "christianstudy.com": 1, + "freenetproject.org": 1, + "ebookbrowse.com": 1, + "gaoming.net": 1, + "madmenunbuttoned.com": 1, + "laptoplockdown.com": 1, + "freakshare.com": 1, + "e-traderland.net": 1, + "twtrland.com": 1, + "huhaitai.com": 1, + "askstudent.com": 1, + "yipub.com": 1, + "truveo.com": 1, + "tabtter.jp": 1, + "franklc.com": 1, + "weigegebyc.dreamhosters.com": 1, + "iblogserv-f.net": 1, + "kanzhongguo.eu": 1, + "freewebs.com": 1, + "ig.com.br": 1, + "dwheeler.com": 1, + "famunion.com": 1, + "173ng.com": 1, + "minghui.org": 1, + "isaacmao.com": 1, + "perfectvpn.net": 1, + "freeman2.com": 1, + "sinonet.ca": 1, + "jpopforum.net": 1, + "sobees.com": 1, + "epochtimestr.com": 1, + "oyax.com": 1, + "littlebigdetails.com": 1, + "mingjingnews.com": 1, + "sharkdolphin.com": 1, + "limiao.net": 1, + "jimoparty.com": 1, + "assembla.com": 1, + "dribbble.com": 1, + "njactb.org": 1, + "twiggit.org": 1, + "lookatgame.com": 1, + "darpa.mil": 1, + "wtfpeople.com": 1, + "1-apple.com.tw": 1 + }; + // safePorts must in order for matching + var safePorts = [ + 3478, + 3479, + 3480, + 3481, + 3482, + 3483, + 3484, + 3485, + 3486, + 3487, + 3488, + 3489, + 3490, + 3491, + 3492, + 3493, + 3494, + 3495, + 3496, + 3497, + 5223, + 16384, + 16385, + 16386, + 16387, + 16393, + 16394, + 16395, + 16396, + 16397, + 16398, + 16399, + 16400, + 16401, + 16402 + ]; + function convertAddress(ipchars) { + var bytes = ipchars.split('.'); + var result = ((bytes[0] & 0xff) << 24) | + ((bytes[1] & 0xff) << 16) | + ((bytes[2] & 0xff) << 8) | + (bytes[3] & 0xff); + return result >>> 0; + }; + + function match_port(port) { + var left = 0, right = safePorts.length; + do { + var mid = Math.floor((left + right) / 2), + m = safePorts[mid]; + if (port == m) { + return true; + } + else if (port > m) { + left = mid + 1; + } + else { + right = mid; + } + } while (left + 1 <= right) + return false; + }; + + function match(ip, list) { + if (list.length == 0) + return false; + var left = 0, right = list.length; + do { + var mid = Math.floor((left + right) / 2), + ip_f = (ip & list[mid][1]) >>> 0, + m = (list[mid][0] & list[mid][1]) >>> 0; + if (ip_f == m) { + return true; + } else if (ip_f > m) { + left = mid + 1; + } else { + right = mid; + } + } while (left + 1 <= right); + + return false; + }; + + function hostindomains(domains, host) { + var suffix; + var pos = host.lastIndexOf('.'); + pos = host.lastIndexOf('.', pos - 1); + while(1) { + if (pos == -1) { + if (hasOwnProperty.call(domains, host)) { + return true; + } else { + return false; + } + } + suffix = host.substring(pos + 1); + if (hasOwnProperty.call(domains, suffix)) { + return true; + } + pos = host.lastIndexOf('.', pos - 1); + } + }; + function FindProxyForURL(url, host) { + + if (shExpMatch(host, "*.cn")) { + return iproxy; // arg iproxy + } + + if (hostindomains(safeDomains, host)) + return iproxy; + + if (hostindomains(dangerDomains, host)) + return proxy; + + if (isPlainHostName(host) + || (host === '127.0.0.1') + || (host === 'localhost')) { + return 'DIRECT'; + }; + + + var strIp = dnsResolve(host); + if (!strIp) { + return proxy ; // arg proxy + } + + if (isInNet(strIp, "10.0.0.0", "255.0.0.0") || + isInNet(strIp, "172.16.0.0", "255.240.0.0") || + isInNet(strIp, "192.168.0.0", "255.255.0.0") || + isInNet(strIp, "127.0.0.0", "255.255.255.0")) { + return 'DIRECT'; + } + + var intPort = parseInt(host.split(':')[1]); + if (intPort) { + if (match_port(intPort)) { + return iproxy ; // arg iproxy + } + }; + + var intIp = convertAddress(strIp); + + var fakeindex = intIp % 10; + if (match(intIp, fake_ip_list[fakeindex])) { + return proxy; //arg proxy + } + + var index = ((intIp & 0xff000000) >>> 0 ) % 255; + if (match(intIp, list[index])) { + return iproxy; // arg iproxy + } + return proxy; // arg proxy +} diff --git a/pac_get.sh b/pac_get.sh new file mode 100644 index 0000000..7942feb --- /dev/null +++ b/pac_get.sh @@ -0,0 +1,872 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +PAC_URL="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt" +Output_URL="pac.txt" +prefix_suffix(){ +PAC_TAME="/* + * Last Updated:$(date '+%Y-%m-%d %H:%M:%S') + */ +" +PAC_prefix='var direct = "__DIRECT__"; +if (direct == "__DIR" + "ECT__") direct = "DIRECT;"; + +var wall_proxy = function(){ return "__PROXY__"; }; +var wall_v6_proxy = function(){ return "__PROXY__"; }; + +var nowall_proxy = function(){ return direct; }; +var ip_proxy = function(){ return nowall_proxy(); }; +var ipv6_proxy = function(){ return nowall_proxy(); }; + +/* + * Copyright (C) 2014 breakwa11 + * https://github.com/breakwa11/gfw_whitelist + */ + +/* + * Copyright (C) 2017-2018 Toyo + * https://softs.loan/Other/pac.txt + */ + +var rules = [ +' +PAC_suffix=' +]; + +/* +* This file is part of Adblock Plus <http://adblockplus.org/>, +* Copyright (C) 2006-2014 Eyeo GmbH +* +* Adblock Plus is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 3 as +* published by the Free Software Foundation. +* +* Adblock Plus is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. +*/ + +function createDict() +{ + var result = {}; + result.__proto__ = null; + return result; +} + +function getOwnPropertyDescriptor(obj, key) +{ + if (obj.hasOwnProperty(key)) + { + return obj[key]; + } + return null; +} + +function extend(subclass, superclass, definition) +{ + if (Object.__proto__) + { + definition.__proto__ = superclass.prototype; + subclass.prototype = definition; + } + else + { + var tmpclass = function(){}, ret; + tmpclass.prototype = superclass.prototype; + subclass.prototype = new tmpclass(); + subclass.prototype.constructor = superclass; + for (var i in definition) + { + if (definition.hasOwnProperty(i)) + { + subclass.prototype[i] = definition[i]; + } + } + } +} + +function Filter(text) +{ + this.text = text; + this.subscriptions = []; +} +Filter.prototype = { + text: null, + subscriptions: null, + toString: function() + { + return this.text; + } +}; +Filter.knownFilters = createDict(); +Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/; +Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/; +Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/; +Filter.fromText = function(text) +{ + if (text in Filter.knownFilters) + { + return Filter.knownFilters[text]; + } + var ret; + if (text.charAt(0) == "!") + { + ret = new CommentFilter(text); + } + else + { + ret = RegExpFilter.fromText(text); + } + Filter.knownFilters[ret.text] = ret; + return ret; +}; + +function InvalidFilter(text, reason) +{ + Filter.call(this, text); + this.reason = reason; +} +extend(InvalidFilter, Filter, { + reason: null +}); + +function CommentFilter(text) +{ + Filter.call(this, text); +} +extend(CommentFilter, Filter, { +}); + +function ActiveFilter(text, domains) +{ + Filter.call(this, text); + this.domainSource = domains; +} +extend(ActiveFilter, Filter, { + domainSource: null, + domainSeparator: null, + ignoreTrailingDot: true, + domainSourceIsUpperCase: false, + getDomains: function() + { + var prop = getOwnPropertyDescriptor(this, "domains"); + if (prop) + { + return prop; + } + var domains = null; + if (this.domainSource) + { + var source = this.domainSource; + if (!this.domainSourceIsUpperCase) + { + source = source.toUpperCase(); + } + var list = source.split(this.domainSeparator); + if (list.length == 1 && (list[0]).charAt(0) != "~") + { + domains = createDict(); + domains[""] = false; + if (this.ignoreTrailingDot) + { + list[0] = list[0].replace(/\.+$/, ""); + } + domains[list[0]] = true; + } + else + { + var hasIncludes = false; + for (var i = 0; i < list.length; i++) + { + var domain = list[i]; + if (this.ignoreTrailingDot) + { + domain = domain.replace(/\.+$/, ""); + } + if (domain == "") + { + continue; + } + var include; + if (domain.charAt(0) == "~") + { + include = false; + domain = domain.substr(1); + } + else + { + include = true; + hasIncludes = true; + } + if (!domains) + { + domains = createDict(); + } + domains[domain] = include; + } + domains[""] = !hasIncludes; + } + this.domainSource = null; + } + return this.domains; + }, + sitekeys: null, + isActiveOnDomain: function(docDomain, sitekey) + { + if (this.getSitekeys() && (!sitekey || this.getSitekeys().indexOf(sitekey.toUpperCase()) < 0)) + { + return false; + } + if (!this.getDomains()) + { + return true; + } + if (!docDomain) + { + return this.getDomains()[""]; + } + if (this.ignoreTrailingDot) + { + docDomain = docDomain.replace(/\.+$/, ""); + } + docDomain = docDomain.toUpperCase(); + while (true) + { + if (docDomain in this.getDomains()) + { + return this.domains[docDomain]; + } + var nextDot = docDomain.indexOf("."); + if (nextDot < 0) + { + break; + } + docDomain = docDomain.substr(nextDot + 1); + } + return this.domains[""]; + }, + isActiveOnlyOnDomain: function(docDomain) + { + if (!docDomain || !this.getDomains() || this.getDomains()[""]) + { + return false; + } + if (this.ignoreTrailingDot) + { + docDomain = docDomain.replace(/\.+$/, ""); + } + docDomain = docDomain.toUpperCase(); + for (var domain in this.getDomains()) + { + if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1)) + { + return false; + } + } + return true; + } +}); + +function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) +{ + ActiveFilter.call(this, text, domains, sitekeys); + if (contentType != null) + { + this.contentType = contentType; + } + if (matchCase) + { + this.matchCase = matchCase; + } + if (thirdParty != null) + { + this.thirdParty = thirdParty; + } + if (sitekeys != null) + { + this.sitekeySource = sitekeys; + } + if (regexpSource.length >= 2 && regexpSource.charAt(0) == "/" && regexpSource.charAt(regexpSource.length - 1) == "/") + { + var regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i"); + this.regexp = regexp; + } + else + { + this.regexpSource = regexpSource; + } +} +extend(RegExpFilter, ActiveFilter, { + domainSourceIsUpperCase: true, + length: 1, + domainSeparator: "|", + regexpSource: null, + getRegexp: function() + { + var prop = getOwnPropertyDescriptor(this, "regexp"); + if (prop) + { + return prop; + } + var source = this.regexpSource.replace(/\*+/g, "*").replace(/\^\|$/, "^").replace(/\W/g, "\\$&").replace(/\\\*/g, ".*").replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)").replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?").replace(/^\\\|/, "^").replace(/\\\|$/, "$").replace(/^(\.\*)/, "").replace(/(\.\*)$/, ""); + var regexp = new RegExp(source, this.matchCase ? "" : "i"); + this.regexp = regexp; + return regexp; + }, + contentType: 2147483647, + matchCase: false, + thirdParty: null, + sitekeySource: null, + getSitekeys: function() + { + var prop = getOwnPropertyDescriptor(this, "sitekeys"); + if (prop) + { + return prop; + } + var sitekeys = null; + if (this.sitekeySource) + { + sitekeys = this.sitekeySource.split("|"); + this.sitekeySource = null; + } + this.sitekeys = sitekeys; + return this.sitekeys; + }, + matches: function(location, contentType, docDomain, thirdParty, sitekey) + { + if (this.getRegexp().test(location) && this.isActiveOnDomain(docDomain, sitekey)) + { + return true; + } + return false; + } +}); +RegExpFilter.prototype["0"] = "#this"; +RegExpFilter.fromText = function(text) +{ + var blocking = true; + var origText = text; + if (text.indexOf("@@") == 0) + { + blocking = false; + text = text.substr(2); + } + var contentType = null; + var matchCase = null; + var domains = null; + var sitekeys = null; + var thirdParty = null; + var collapse = null; + var options; + var match = text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null; + if (match) + { + options = match[1].toUpperCase().split(","); + text = match.input.substr(0, match.index); + for (var _loopIndex6 = 0; _loopIndex6 < options.length; ++_loopIndex6) + { + var option = options[_loopIndex6]; + var value = null; + var separatorIndex = option.indexOf("="); + if (separatorIndex >= 0) + { + value = option.substr(separatorIndex + 1); + option = option.substr(0, separatorIndex); + } + option = option.replace(/-/, "_"); + if (option in RegExpFilter.typeMap) + { + if (contentType == null) + { + contentType = 0; + } + contentType |= RegExpFilter.typeMap[option]; + } + else if (option.charAt(0) == "~" && option.substr(1) in RegExpFilter.typeMap) + { + if (contentType == null) + { + contentType = RegExpFilter.prototype.contentType; + } + contentType &= ~RegExpFilter.typeMap[option.substr(1)]; + } + else if (option == "MATCH_CASE") + { + matchCase = true; + } + else if (option == "~MATCH_CASE") + { + matchCase = false; + } + else if (option == "DOMAIN" && typeof value != "undefined") + { + domains = value; + } + else if (option == "THIRD_PARTY") + { + thirdParty = true; + } + else if (option == "~THIRD_PARTY") + { + thirdParty = false; + } + else if (option == "COLLAPSE") + { + collapse = true; + } + else if (option == "~COLLAPSE") + { + collapse = false; + } + else if (option == "SITEKEY" && typeof value != "undefined") + { + sitekeys = value; + } + else + { + return new InvalidFilter(origText, "Unknown option " + option.toLowerCase()); + } + } + } + if (!blocking && (contentType == null || contentType & RegExpFilter.typeMap.DOCUMENT) && (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text)) + { + if (contentType == null) + { + contentType = RegExpFilter.prototype.contentType; + } + contentType &= ~RegExpFilter.typeMap.DOCUMENT; + } + try + { + if (blocking) + { + return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse); + } + else + { + return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys); + } + } + catch (e) + { + return new InvalidFilter(origText, e); + } +}; +RegExpFilter.typeMap = { + OTHER: 1, + SCRIPT: 2, + IMAGE: 4, + STYLESHEET: 8, + OBJECT: 16, + SUBDOCUMENT: 32, + DOCUMENT: 64, + XBL: 1, + PING: 1, + XMLHTTPREQUEST: 2048, + OBJECT_SUBREQUEST: 4096, + DTD: 1, + MEDIA: 16384, + FONT: 32768, + BACKGROUND: 4, + POPUP: 268435456, + ELEMHIDE: 1073741824 +}; +RegExpFilter.prototype.contentType &= ~ (RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP); + +function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys, collapse) +{ + RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); + this.collapse = collapse; +} +extend(BlockingFilter, RegExpFilter, { + collapse: null +}); + +function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) +{ + RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); +} +extend(WhitelistFilter, RegExpFilter, { +}); + +function Matcher() +{ + this.clear(); +} +Matcher.prototype = { + filterByKeyword: null, + keywordByFilter: null, + clear: function() + { + this.filterByKeyword = createDict(); + this.keywordByFilter = createDict(); + }, + add: function(filter) + { + if (filter.text in this.keywordByFilter) + { + return; + } + var keyword = this.findKeyword(filter); + var oldEntry = this.filterByKeyword[keyword]; + if (typeof oldEntry == "undefined") + { + this.filterByKeyword[keyword] = filter; + } + else if (oldEntry.length == 1) + { + this.filterByKeyword[keyword] = [oldEntry, filter]; + } + else + { + oldEntry.push(filter); + } + this.keywordByFilter[filter.text] = keyword; + }, + remove: function(filter) + { + if (!(filter.text in this.keywordByFilter)) + { + return; + } + var keyword = this.keywordByFilter[filter.text]; + var list = this.filterByKeyword[keyword]; + if (list.length <= 1) + { + delete this.filterByKeyword[keyword]; + } + else + { + var index = list.indexOf(filter); + if (index >= 0) + { + list.splice(index, 1); + if (list.length == 1) + { + this.filterByKeyword[keyword] = list[0]; + } + } + } + delete this.keywordByFilter[filter.text]; + }, + findKeyword: function(filter) + { + var result = ""; + var text = filter.text; + if (Filter.regexpRegExp.test(text)) + { + return result; + } + var match = Filter.optionsRegExp.exec(text); + if (match) + { + text = match.input.substr(0, match.index); + } + if (text.substr(0, 2) == "@@") + { + text = text.substr(2); + } + var candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g); + if (!candidates) + { + return result; + } + var hash = this.filterByKeyword; + var resultCount = 16777215; + var resultLength = 0; + for (var i = 0, l = candidates.length; i < l; i++) + { + var candidate = candidates[i].substr(1); + var count = candidate in hash ? hash[candidate].length : 0; + if (count < resultCount || count == resultCount && candidate.length > resultLength) + { + result = candidate; + resultCount = count; + resultLength = candidate.length; + } + } + return result; + }, + hasFilter: function(filter) + { + return filter.text in this.keywordByFilter; + }, + getKeywordForFilter: function(filter) + { + if (filter.text in this.keywordByFilter) + { + return this.keywordByFilter[filter.text]; + } + else + { + return null; + } + }, + _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty, sitekey) + { + var list = this.filterByKeyword[keyword]; + for (var i = 0; i < list.length; i++) + { + var filter = list[i]; + if (filter == "#this") + { + filter = list; + } + if (filter.matches(location, contentType, docDomain, thirdParty, sitekey)) + { + return filter; + } + } + return null; + }, + matchesAny: function(location, contentType, docDomain, thirdParty, sitekey) + { + var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); + if (candidates === null) + { + candidates = []; + } + candidates.push(""); + for (var i = 0, l = candidates.length; i < l; i++) + { + var substr = candidates[i]; + if (substr in this.filterByKeyword) + { + var result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + if (result) + { + return result; + } + } + } + return null; + } +}; + +function CombinedMatcher() +{ + this.blacklist = new Matcher(); + this.whitelist = new Matcher(); + this.resultCache = createDict(); +} +CombinedMatcher.maxCacheEntries = 1000; +CombinedMatcher.prototype = { + blacklist: null, + whitelist: null, + resultCache: null, + cacheEntries: 0, + clear: function() + { + this.blacklist.clear(); + this.whitelist.clear(); + this.resultCache = createDict(); + this.cacheEntries = 0; + }, + add: function(filter) + { + if (filter instanceof WhitelistFilter) + { + this.whitelist.add(filter); + } + else + { + this.blacklist.add(filter); + } + if (this.cacheEntries > 0) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + }, + remove: function(filter) + { + if (filter instanceof WhitelistFilter) + { + this.whitelist.remove(filter); + } + else + { + this.blacklist.remove(filter); + } + if (this.cacheEntries > 0) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + }, + findKeyword: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.findKeyword(filter); + } + else + { + return this.blacklist.findKeyword(filter); + } + }, + hasFilter: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.hasFilter(filter); + } + else + { + return this.blacklist.hasFilter(filter); + } + }, + getKeywordForFilter: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.getKeywordForFilter(filter); + } + else + { + return this.blacklist.getKeywordForFilter(filter); + } + }, + isSlowFilter: function(filter) + { + var matcher = filter instanceof WhitelistFilter ? this.whitelist : this.blacklist; + if (matcher.hasFilter(filter)) + { + return !matcher.getKeywordForFilter(filter); + } + else + { + return !matcher.findKeyword(filter); + } + }, + matchesAnyInternal: function(location, contentType, docDomain, thirdParty, sitekey) + { + var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); + if (candidates === null) + { + candidates = []; + } + candidates.push(""); + var blacklistHit = null; + for (var i = 0, l = candidates.length; i < l; i++) + { + var substr = candidates[i]; + if (substr in this.whitelist.filterByKeyword) + { + var result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + if (result) + { + return result; + } + } + if (substr in this.blacklist.filterByKeyword && blacklistHit === null) + { + blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + } + } + return blacklistHit; + }, + matchesAny: function(location, docDomain) + { + var key = location + " " + docDomain + " "; + if (key in this.resultCache) + { + return this.resultCache[key]; + } + var result = this.matchesAnyInternal(location, 0, docDomain, null, null); + if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + this.resultCache[key] = result; + this.cacheEntries++; + return result; + } +}; +var defaultMatcher = new CombinedMatcher(); + +for (var i = 0; i < rules.length; i++) { + defaultMatcher.add(Filter.fromText(rules[i])); +} + +var subnetIpRangeList = [ +0,1, +167772160,184549376, //10.0.0.0/8 +2886729728,2887778304, //172.16.0.0/12 +3232235520,3232301056, //192.168.0.0/16 +2130706432,2130706688 //127.0.0.0/24 +]; + +function convertAddress(ipchars) { + var bytes = ipchars.split('"'.'"'); + var result = (bytes[0] << 24) | + (bytes[1] << 16) | + (bytes[2] << 8) | + (bytes[3]); + return result >>> 0; +} + +function check_ipv4(host) { + var re_ipv4 = /^\d+\.\d+\.\d+\.\d+$/g; + if (re_ipv4.test(host)) { + return true; + } +} +function check_ipv6(host) { + var re_ipv6 = /^\[?([a-fA-F0-9]{0,4}\:){1,7}[a-fA-F0-9]{0,4}\]?$/g; + if (re_ipv6.test(host)) { + return true; + } +} +function check_ipv6_dns(dnsstr) { + var re_ipv6 = /([a-fA-F0-9]{0,4}\:){1,7}[a-fA-F0-9]{0,4}(%[0-9]+)?/g; + if (re_ipv6.test(dnsstr)) { + return true; + } +} +function isInSubnetRange(ipRange, intIp) { + for ( var i = 0; i < 10; i += 2 ) { + if ( ipRange[i] <= intIp && intIp < ipRange[i+1] ) + return true; + } +} +function getProxyFromIP(strIp) { + var intIp = convertAddress(strIp); + if ( isInSubnetRange(subnetIpRangeList, intIp) ) { + return direct; + } + return ip_proxy(); +} + +function FindProxyForURL(url, host) { + if ( isPlainHostName(host) === true ) { + return direct; + } + if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) { + return wall_proxy(); + } + if ( check_ipv4(host) === true ) { + return getProxyFromIP(host); + } + return direct; +} +' +} +prefix_suffix +urlsafe_base64_d(){ + date=$(echo -n "$1"|sed 's/-/+/g;s/_/\//g'|base64 -d) + echo -e "${date}" +} +PAC_TEXT=$(curl -m 10 -s "${PAC_URL}") +PAC_BASE64=$(urlsafe_base64_d "${PAC_TEXT}"|grep -v "!"|sed '1d;s/\\/\\\\/g;/^\s*$/d;s/^/ "&/g;s/$/&",/g;$s/.$//') +PAC_NUM=$(echo "${PAC_BASE64}"|wc -l) +echo "${PAC_TAME}${PAC_prefix}${PAC_BASE64}${PAC_suffix}" > "${Output_URL}" +sed -i 's/$/\r/' "${Output_URL}" +echo "${PAC_NUM}" \ No newline at end of file diff --git a/pipes.sh b/pipes.sh new file mode 100644 index 0000000..df82749 --- /dev/null +++ b/pipes.sh @@ -0,0 +1,319 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: PipeSocks +# Version: 1.0.5 +# Author: Toyo +# Blog: https://doub.io/pipesocks-jc1/ +# Github: https://github.com/pipesocks/install +#================================================= +pipes_file="/usr/local/pipesocks" +pipes_ver="/usr/local/pipesocks/ver.txt" +pipes_log="/usr/local/pipesocks/pipesocks.log" +pipes_config_file="/etc/pipesocks" +pipes_config="/etc/pipesocks/pipesocks.conf" +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" + +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${pipes_file} ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} PipeSocks 没有安装,请检查 !" && exit 1 +} +check_new_ver(){ + #pipes_new_ver=`curl -m 10 -s "https://pipesocks.github.io/js/index.js" | sed -n "15p" | awk -F ": " '{print $NF}' | sed 's/"//g;s/,//g'` + pipes_new_ver=`wget -qO- "https://pipesocks.github.io/dist.json" | sed -n "15p" | awk -F ": " '{print $NF}' | sed 's/"//g;s/,//g'` + [[ -z ${pipes_new_ver} ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} PipeSocks 最新版本获取失败 !" && exit 1 +} +check_ver_comparison(){ + pipes_now_ver=`cat ${pipes_ver}` + if [[ ${pipes_now_ver} != "" ]]; then + if [[ ${pipes_now_ver} != ${pipes_new_ver} ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} 发现 PipeSocks 已有新版本 [v${pipes_new_ver}] !" + read -e -p "是否更新 ? [Y/n] :" yn + [[ -z "${yn}" ]] && yn="y" + if [[ $yn == [Yy] ]]; then + PID=`ps -ef|grep "pipesocks"|grep -v "grep"|awk '{print $2}'` && [[ ! -z $PID ]] && kill -9 ${PID} + Download_pipes + Read_config + Start_pipes + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} 当前 PipeSocks 已是最新版本 [v${pipes_new_ver}] !" && exit 1 + fi + else + echo "${pipes_new_ver}" > ${pipes_ver} + echo -e "${Info_font_prefix}[信息]${Font_suffix} 当前 PipeSocks 已是最新版本 [v${pipes_new_ver}] !" && exit 1 + fi +} +Download_pipes(){ + cd "/usr/local" + if [[ ${bit} == "x86_64" ]]; then + #wget -O "pipesocks-linux.tar.xz" "https://coding.net/u/yvbbrjdr/p/pipesocks-release/git/raw/master/pipesocks-${pipes_new_ver}-linux.tar.xz" + wget --no-check-certificate -O "pipesocks-linux.tar.xz" "https://github.com/pipesocks/pipesocks/releases/download/${pipes_new_ver}/pipesocks-${pipes_new_ver}-linux.tar.xz" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} 不支持 ${bit} !" && exit 1 + fi + [[ ! -e "pipesocks-linux.tar.xz" ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} PipeSocks 下载失败 !" && exit 1 + [[ -e ${pipes_file} ]] && rm -rf ${pipes_file} + tar -xJf pipesocks-linux.tar.xz && rm -rf pipesocks-linux.tar.xz + [[ ! -e ${pipes_file} ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} PipeSocks 解压失败或压缩文件不完整 !" && exit 1 + mv pipesocks pipes + mkdir pipesocks/ + mv pipes pipesocks/pipesocks + cd ${pipes_file} + echo "${pipes_new_ver}" > ${pipes_ver} +} +Service_pipes(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/pipes_centos -O /etc/init.d/pipes; then + echo -e "${Error} ShadowsocksR服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/pipes + chkconfig --add pipes + chkconfig pipes on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/pipes_debian -O /etc/init.d/pipes; then + echo -e "${Error} ShadowsocksR服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/pipes + update-rc.d -f pipes defaults + fi + echo -e "${Info} ShadowsocksR服务 管理脚本下载完成 !" +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${pipes_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${pipes_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${pump_port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${pump_port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Write_config(){ + if [[ ! -e ${pipes_config} ]]; then + [[ ! -e ${pipes_config_file} ]] && mkdir ${pipes_config_file} + fi + cat > ${pipes_config}<<-EOF +pump_port=${pipes_port} +pump_passwd=${pipes_passwd} +EOF +} +Read_config(){ + [[ ! -e ${pipes_config} ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} PipeSocks 配置文件不存在 !" && exit 1 + pump_port=`cat ${pipes_config}|grep "pump_port"|awk -F "=" '{print $NF}'` + pump_passwd=`cat ${pipes_config}|grep "pump_passwd"|awk -F "=" '{print $NF}'` +} +Set_user_pipes(){ + while true + do + echo -e "请输入 PipeSocks 本地监听端口 [1-65535]" + read -e -p "(默认: 2333):" pipes_port + [[ -z "$pipes_port" ]] && pipes_port="2333" + echo $((${pipes_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${pipes_port} -ge 1 ]] && [[ ${pipes_port} -le 65535 ]]; then + echo && echo "————————————————————" + echo -e " 端口 : ${Info_font_prefix} ${pipes_port}${Font_suffix}" + echo "————————————————————" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done + echo "请输入 PipeSocks 密码" + read -e -p "(默认: doub.io):" pipes_passwd + [[ -z "${pipes_passwd}" ]] && pipes_passwd="doub.io" + echo && echo "————————————————————" + echo -e " 密码 : ${Info_font_prefix}${pipes_passwd}${Font_suffix}" + echo "————————————————————" && echo +} +Set_pipes(){ + check_installed_status + Set_user_pipes + Read_config + Del_iptables + Add_iptables + Save_iptables + Write_config + Restart_pipes +} +View_pipes(){ + check_installed_status + Read_config + ip=`wget -qO- -t1 -T2 ipinfo.io/ip` + [[ -z ${ip} ]] && ip="VPS_IP" + clear && echo "————————————————" && echo + echo -e " 你的 PipeSocks 账号信息 :" && echo + echo -e " I P\t: ${Info_font_prefix}${ip}${Font_suffix}" + echo -e " 端口\t: ${Info_font_prefix}${pump_port}${Font_suffix}" + echo -e " 密码\t: ${Info_font_prefix}${pump_passwd}${Font_suffix}" + echo && echo "————————————————" + PID=`ps -ef|grep "pipesocks"|grep -v "grep"|awk '{print $2}'` + if [[ ! -z $PID ]]; then + echo -e " 当前状态: ${Info_font_prefix}正在运行${Font_suffix}" + else + echo -e " 当前状态: ${Error_font_prefix}没有运行${Font_suffix}" + fi + echo +} +Install_pipes(){ + [[ -e ${pipes_file} ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} 检测到 PipeSocks 已安装,如需继续,请先卸载 !" && exit 1 + check_new_ver + Set_user_pipes + Download_pipes + Service_pipes + Write_config + Set_iptables + Add_iptables + Save_iptables + Start_pipes +} +Update_pipes(){ + check_installed_status + check_new_ver + check_ver_comparison +} +Start_pipes(){ + check_installed_status + PID=`ps -ef|grep "pipesocks"|grep -v "grep"|awk '{print $2}'` + [[ ! -z $PID ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} PipeSocks 进程正在运行,请检查 !" && exit 1 + /etc/init.d/pipes start +} +Stop_pipes(){ + check_installed_status + PID=`ps -ef|grep "pipesocks"|grep -v "grep"|awk '{print $2}'` + [[ -z $PID ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} 没有发现 PipeSocks 进程运行,请检查 !" && exit 1 + /etc/init.d/pipes stop +} +Restart_pipes(){ + check_installed_status + PID=`ps -ef|grep "pipesocks"|grep -v "grep"|awk '{print $2}'` + if [[ ! -z $PID ]]; then + /etc/init.d/pipes stop + fi + /etc/init.d/pipes start +} +Log_pipes(){ + check_installed_status + [[ ! -e ${pipes_log} ]] && echo -e "${Error_font_prefix}[错误]${Font_suffix} PipeSocks 日志文件不存在 !" && exit 1 + echo && echo -e "使用 ${Info_background_prefix} Ctrl+C ${Font_suffix} 键退出查看日志 !" && echo -e "如果需要查看完整日志内容,请用 ${Info_background_prefix}cat ${pipes_log}${Font_suffix} 命令。" && echo + tail -f ${pipes_log} +} +Uninstall_pipes(){ + check_installed_status + echo "确定要卸载 PipeSocks ? [y/N]" && echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + PID=`ps -ef|grep "pipesocks"|grep -v "grep"|awk '{print $2}'` + [[ ! -z $PID ]] && kill -9 ${PID} + Read_config + Del_iptables + Save_iptables + if [[ ${release} = "centos" ]]; then + chkconfig --del pipes + else + update-rc.d -f pipes remove + fi + rm -rf /etc/init.d/pipes + rm -rf ${pipes_file} && rm -rf ${pipes_config_file} + echo && echo "PipeSocks 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +check_sys +echo && echo "请输入一个数字来选择选项" && echo +echo -e " 1. 安装 PipeSocks" +echo -e " 2. 升级 PipeSocks" +echo -e " 3. 卸载 PipeSocks" +echo "————————————" +echo -e " 4. 启动 PipeSocks" +echo -e " 5. 停止 PipeSocks" +echo -e " 6. 重启 PipeSocks" +echo "————————————" +echo -e " 7. 设置 PipeSocks 账号" +echo -e " 8. 查看 PipeSocks 账号" +echo -e " 9. 查看 PipeSocks 日志" +echo "————————————" && echo +if [[ -e ${pipes_file} ]]; then + PID=`ps -ef|grep "pipesocks"|grep -v "grep"|awk '{print $2}'` + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Info_font_prefix}已安装${Font_suffix} 并 ${Info_font_prefix}已启动${Font_suffix}" + else + echo -e " 当前状态: ${Info_font_prefix}已安装${Font_suffix} 但 ${Error_font_prefix}未启动${Font_suffix}" + fi +else + echo -e " 当前状态: ${Error_font_prefix}未安装${Font_suffix}" +fi +echo +read -e -p " 请输入数字 [1-9]:" num +case "$num" in + 1) + Install_pipes + ;; + 2) + Update_pipes + ;; + 3) + Uninstall_pipes + ;; + 4) + Start_pipes + ;; + 5) + Stop_pipes + ;; + 6) + Restart_pipes + ;; + 7) + Set_pipes + ;; + 8) + View_pipes + ;; + 9) + Log_pipes + ;; + *) + echo "请输入正确数字 [1-9]" + ;; +esac \ No newline at end of file diff --git a/pserver.sh b/pserver.sh new file mode 100644 index 0000000..7295c9b --- /dev/null +++ b/pserver.sh @@ -0,0 +1,376 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: Peerflix Server +# Version: 1.1.0 +# Author: Toyo +# Blog: https://doub.io/wlzy-13/ +#================================================= + +sh_ver="1.1.0" +node_ver="v8.11.3" +node_file="/etc/node" +ps_file="/etc/node/lib/node_modules/peerflix-server" +conf_file="/etc/peerflix-server" +ps_conf="/etc/peerflix-server/peerflix-server.conf" +ps_log="/tmp/peerflix-server.log" +bt_port="6881" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=$(uname -m) +} +check_installed_status(){ + [[ ! -e ${ps_file} ]] && echo -e "${Error} Peerflix Server 没有安装,请检查 !" && exit 1 +} +check_pid(){ + PID=$(ps -ef | grep peerflix-server | grep -v grep |grep -v "init.d" |grep -v "service" |awk '{print $2}') +} +Download_ps(){ + echo -e "${Info} 开始安装 node-js ..." + if [[ ! -e ${node_file} ]]; then + cd /tmp + if [[ ${bit} == "x86_64" ]]; then + node_name="node-${node_ver}-linux-x64" + wget --no-check-certificate -O node.tar.xz "https://nodejs.org/dist/${node_ver}/node-${node_ver}-linux-x64.tar.xz" + else + node_name="node-${node_ver}-linux-x86" + wget --no-check-certificate -O node.tar.xz "https://nodejs.org/dist/${node_ver}/node-${node_ver}-linux-x86.tar.xz" + fi + [[ ! -e "node.tar.xz" ]] && echo -e "${Error} Peerflix Server 压缩包下载失败 !" && Download_shanhou 0 + xz -d node.tar.xz + [[ ! -e "node.tar" ]] && echo -e "${Error} Peerflix Server 解压失败(可能是 压缩包损坏 或者 没有安装 XZ) !" && Download_shanhou 1 + tar -xvf "node.tar" -C "/etc" + [[ ! -e "node.tar" ]] && echo -e "${Error} Peerflix Server 解压失败(可能是 压缩包损坏 或者 没有安装 Tar) !" && Download_shanhou 2 + mv "/etc/${node_name}" ${node_file} + [[ ! -e "${node_file}" ]] && echo -e "${Error} Peerflix Server 文件夹重命名失败!" && Download_shanhou 4 + rm -rf "/tmp/node.tar.xz" + rm -rf "/tmp/node.tar" + ln -s ${node_file}/bin/node /usr/local/bin/node + ln -s ${node_file}/bin/npm /usr/local/bin/npm + echo -e "${Info} node-js 安装完成,开始安装 peerflix-server ..." + else + echo -e "${Info} node-js 已安装,开始安装 peerflix-server ..." + fi + + npm install -g peerflix-server + if [[ ! -e ${ps_file} ]]; then + echo -e "${Error} Peerflix Server 安装失败,请检查 !" && exit 1 + else + echo -e "${Info} Peerflix Server 安装成功,继续..." + fi +} +Download_shanhou(){ + if [[ $1 == 0 ]]; then + rm -rf ${conf_file} + elif [[ $1 == 1 ]]; then + rm -rf ${conf_file} + rm -rf "/tmp/node.tar.xz" + elif [[ $1 == 2 ]]; then + rm -rf ${conf_file} + rm -rf "/tmp/node.tar.xz" + rm -rf "/tmp/node.tar" + elif [[ $1 == 3 ]]; then + rm -rf ${conf_file} + rm -rf "/tmp/node.tar.xz" + rm -rf "/tmp/node.tar" + rm -rf "/etc/node-${node_ver}-linux-x64" + elif [[ $1 == 4 ]]; then + rm -rf ${conf_file} + rm -rf "/tmp/node.tar.xz" + rm -rf "/tmp/node.tar" + rm -rf "/etc/node-${node_ver}-linux-x86" + fi + exit 1 +} +Service_ps(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/pserver_centos" -O /etc/init.d/pserver; then + echo -e "${Error} Peerflix Server服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/pserver + chkconfig --add pserver + chkconfig pserver on + else + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/pserver_debian" -O /etc/init.d/pserver; then + echo -e "${Error} Peerflix Server服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/pserver + update-rc.d -f pserver defaults + fi + echo -e "${Info} Peerflix Server服务 管理脚本下载完成 !" +} +Installation_dependency(){ + xz_ver=$(xz -V) + tar_ver=$(tar --version) + [[ -z ${xz_ver} ]] && pack_name="xz " + [[ -z ${tar_ver} ]] && pack_name="${pack_name}tar" + if [[ ! -z ${pack_name} ]]; then + if [[ ${release} == "centos" ]]; then + yum update + yum install -y ${pack_name} + else + apt-get update + apt-get install -y ${pack_name} + fi + fi + mkdir "${conf_file}" +} +Write_config(){ + echo -e "port = ${ps_port}" > ${ps_conf} +} +Read_config(){ + [[ ! -e ${ps_conf} ]] && echo -e "${Error} Peerflix Server 配置文件不存在 !" && exit 1 + port=`cat ${ps_conf}|grep "port = "|awk -F "port = " '{print $NF}'` +} +Set_port(){ + while true + do + echo -e "请输入 Peerflix Server 监听端口 [1-65535](如果是绑定的域名,那么建议80端口)" + read -e -p "(默认端口: 9000):" ps_port + [[ -z "${ps_port}" ]] && ps_port="9000" + echo $((${ps_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ps_port} -ge 1 ]] && [[ ${ps_port} -le 65535 ]]; then + echo && echo "========================" + echo -e " 端口 : ${Red_background_prefix} ${ps_port} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_ps(){ + check_installed_status + Set_port + Read_config + Del_iptables + Write_config + Add_iptables + Save_iptables + Restart_ps +} +Install_ps(){ + check_root + [[ -e ${ps_file} ]] && echo -e "${Error} 检测到 Peerflix Server 已安装 !" && exit 1 + check_sys + echo -e "${Info} 开始设置 用户配置..." + Set_port + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装..." + Download_ps + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_ps + echo -e "${Info} 开始写入 配置文件..." + Write_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_ps +} +Start_ps(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} Peerflix Server 正在运行,请检查 !" && exit 1 + /etc/init.d/pserver start +} +Stop_ps(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} Peerflix Server 没有运行,请检查 !" && exit 1 + /etc/init.d/pserver stop +} +Restart_ps(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/pserver stop + /etc/init.d/pserver start +} +Log_ps(){ + [[ ! -e "${ps_log}" ]] && echo -e "${Error} Peerflix Server 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${ps_log}${Font_color_suffix} 命令。" && echo + tail -f "${ps_log}" +} +Uninstall_ps(){ + check_installed_status + echo "确定要卸载 Peerflix Server ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + port=`cat ${ps_conf}|grep "port = "|awk -F "port = " '{print $NF}'` + Del_iptables + + rm -rf /usr/local/bin/node + rm -rf /usr/local/bin/npm + rm -rf ${node_file} + rm -rf ${conf_file} + rm -rf /etc/init.d/pserver + if [[ ${release} = "centos" ]]; then + chkconfig --del pserver + else + update-rc.d -f pserver remove + fi + echo && echo "Peerflix Server 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +View_ps(){ + check_installed_status + Read_config + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi + clear && echo "————————————————" && echo + echo -e " Peerflix Server 信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}http://${ip}:${port}${Font_color_suffix}" + echo && echo "————————————————" +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ps_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ps_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${bt_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${bt_port} -j ACCEPT + iptables -I OUTPUT -m state --state NEW -m tcp -p tcp --dport ${bt_port} -j ACCEPT + iptables -I OUTPUT -m state --state NEW -m udp -p udp --dport ${bt_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${bt_port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${bt_port} -j ACCEPT + iptables -D OUTPUT -m state --state NEW -m tcp -p tcp --dport ${bt_port} -j ACCEPT + iptables -D OUTPUT -m state --state NEW -m udp -p udp --dport ${bt_port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/pserver.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/pserver" ]]; then + rm -rf /etc/init.d/pserver + Service_ps + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/pserver.sh" && chmod +x pserver.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +echo && echo -e " Peerflix Server 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/wlzy-13/ ---- + + ${Green_font_prefix}0.${Font_color_suffix} 升级脚本 + + ${Green_font_prefix}1.${Font_color_suffix} 安装 Peerflix Server + ${Green_font_prefix}2.${Font_color_suffix} 卸载 Peerflix Server +———————————— + ${Green_font_prefix}3.${Font_color_suffix} 启动 Peerflix Server + ${Green_font_prefix}4.${Font_color_suffix} 停止 Peerflix Server + ${Green_font_prefix}5.${Font_color_suffix} 重启 Peerflix Server +———————————— + ${Green_font_prefix}6.${Font_color_suffix} 设置 Peerflix Server 端口 + ${Green_font_prefix}7.${Font_color_suffix} 查看 Peerflix Server 信息 + ${Green_font_prefix}8.${Font_color_suffix} 查看 Peerflix Server 日志 +————————————" && echo +if [[ -e ${ps_file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-8]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_ps + ;; + 2) + Uninstall_ps + ;; + 3) + Start_ps + ;; + 4) + Stop_ps + ;; + 5) + Restart_ps + ;; + 6) + Set_ps + ;; + 7) + View_ps + ;; + 8) + Log_ps + ;; + *) + echo "请输入正确数字 [0-8]" + ;; +esac \ No newline at end of file diff --git a/pythonhttp.sh b/pythonhttp.sh new file mode 100644 index 0000000..3e88f57 --- /dev/null +++ b/pythonhttp.sh @@ -0,0 +1,108 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: All +# Description: Python HTTP Server +# Version: 1.0.2 +# Author: Toyo +# Blog: https://doub.io/wlzy-8/ +#================================================= + +sethttp(){ +#设置端口 + while true + do + echo -e "请输入要开放的HTTP服务端口 [1-65535]" + read -e -p "(默认端口: 8000):" httpport + [[ -z "$httpport" ]] && httpport="8000" + expr ${httpport} + 0 &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${httpport} -ge 1 ]] && [[ ${httpport} -le 65535 ]]; then + echo + echo -e " 端口 : \033[41;37m ${httpport} \033[0m" + echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done + #设置目录 + echo "请输入要开放的目录(绝对路径)" + read -e -p "(直接回车, 默认当前文件夹):" httpfile + if [[ ! -z $httpfile ]]; then + [[ ! -e $httpfile ]] && echo -e "\033[41;37m [错误] \033[0m 输入的目录不存在 或 当前用户无权限访问, 请检查!" && exit 1 + else + httpfile=`echo $PWD` + fi + #最后确认 + echo + echo "========================" + echo " 请检查配置是否正确 !" + echo + echo -e " 端口 : \033[41;37m ${httpport} \033[0m" + echo -e " 目录 : \033[41;37m ${httpfile} \033[0m" + echo "========================" + echo + read -e -p "按任意键继续,如有错误,请使用 Ctrl + C 退出." var +} +iptables_add(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${httpport} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${httpport} -j ACCEPT +} +iptables_del(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT +} +starthttp(){ + PID=`ps -ef | grep SimpleHTTPServer | grep -v grep | awk '{print $2}'` + [[ ! -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m SimpleHTTPServer 正着运行,请检查 !" && exit 1 + sethttp + iptables_add + cd ${httpfile} + nohup python -m SimpleHTTPServer $httpport >> httpserver.log 2>&1 & + sleep 2s + PID=`ps -ef | grep SimpleHTTPServer | grep -v grep | awk '{print $2}'` + if [[ -z $PID ]]; then + echo -e "\033[41;37m [错误] \033[0m SimpleHTTPServer 启动失败 !" && exit 1 + else + ip=`curl -m 10 -s http://members.3322.org/dyndns/getip` + [[ -z "$ip" ]] && ip="VPS_IP" + echo + echo "HTTP服务 已启动 !" + echo -e "浏览器访问,地址: \033[41;37m http://${ip}:${httpport} \033[0m " + echo + fi +} +stophttp(){ + PID=`ps -ef | grep SimpleHTTPServer | grep -v grep | awk '{print $2}'` + [[ -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m 没有发现 SimpleHTTPServer 进程运行,请检查 !" && exit 1 + port=`netstat -lntp | grep ${PID} | awk '{print $4}' | awk -F ":" '{print $2}'` + iptables_del + kill -9 ${PID} + sleep 2s + PID=`ps -ef | grep SimpleHTTPServer | grep -v grep | awk '{print $2}'` + if [[ ! -z $PID ]]; then + echo -e "\033[41;37m [错误] \033[0m SimpleHTTPServer 停止失败 !" && exit 1 + else + echo + echo "HTTP服务 已停止 !" + echo + fi +} + +action=$1 +[[ -z $1 ]] && action=start +case "$action" in + start|stop) + ${action}http + ;; + *) + echo "输入错误 !" + echo "用法: {start|stop}" + ;; +esac \ No newline at end of file diff --git a/service/adbyby_centos b/service/adbyby_centos new file mode 100644 index 0000000..c82f76e --- /dev/null +++ b/service/adbyby_centos @@ -0,0 +1,85 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: ADbyby + +### BEGIN INIT INFO +# Provides: ADbyby +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Ad filtering tool +# Description: Start or stop the ADbyby +### END INIT INFO + +NAME="ADbyby" +NAME_BIN="adbyby" +FILE="/usr/local/adbyby/bin" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v "adbyby.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + cd ${FILE} + nohup ./adbyby > /dev/null 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID $(echo ${PID})) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/adbyby_debian b/service/adbyby_debian new file mode 100644 index 0000000..32e7367 --- /dev/null +++ b/service/adbyby_debian @@ -0,0 +1,83 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: ADbyby +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Ad filtering tool +# Description: Start or stop the ADbyby +### END INIT INFO + +NAME="ADbyby" +NAME_BIN="adbyby" +FILE="/usr/local/adbyby/bin" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v "adbyby.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + cd ${FILE} + nohup ./adbyby > /dev/null 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID $(echo ${PID})) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/aria2_centos b/service/aria2_centos new file mode 100644 index 0000000..7192fc2 --- /dev/null +++ b/service/aria2_centos @@ -0,0 +1,122 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +# chkconfig: 2345 90 10 +# description: aria2 is a lightweight multi-protocol & multi-source command-line download utility. + +### BEGIN INIT INFO +# Provides: aria2 is a lightweight multi-protocol & multi-source command-line download utility. +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: aria2 is a lightweight multi-protocol & multi-source command-line download utility. +# Description: Start or stop the Aria2 +### END INIT INFO + +NAME="Aria2" +NAME_BIN="aria2c" +CONFIG="/root/.aria2/aria2.conf" +LOG="/root/.aria2/aria2.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v "aria2.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +Read_config(){ + [[ ! -e ${CONFIG} ]] && echo -e "${Error} ${NAME} 配置文件不存在 !" && exit 1 + Download_dir=$(cat ${CONFIG}|grep -v '#'|grep "dir=") + [[ ! -z "${Download_dir}" ]] && Download_dir=$(echo "${Download_dir}"|awk -F '=' '{print $2}') + RPC_listen_port=$(cat ${CONFIG}|grep -v '#'|grep "rpc-listen-port=") + [[ ! -z "${RPC_listen_port}" ]] && RPC_listen_port=$(echo "${RPC_listen_port}"|awk -F '=' '{print $2}') + RPC_secret=$(cat ${CONFIG}|grep -v '#'|grep "rpc-secret=") + [[ ! -z "${RPC_secret}" ]] && RPC_secret=$(echo "${RPC_secret}"|awk -F '=' '{print $2}') +} +View_Config(){ + Read_config + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP(外网IP检测失败)" + fi + fi + fi + [[ -z "${Download_dir}" ]] && Download_dir="/usr/local/aria2/" + [[ -z "${RPC_listen_port}" ]] && RPC_listen_port="6800" + [[ -z "${RPC_secret}" ]] && RPC_secret="无令牌密码" + clear + echo -e "\nAria2 简单配置信息:\n + 地址\t: ${Green_font_prefix}${ip}${Font_color_suffix} + 端口\t: ${Green_font_prefix}${RPC_listen_port}${Font_color_suffix} + 密码\t: ${Green_font_prefix}${RPC_secret}${Font_color_suffix} + 目录\t: ${Green_font_prefix}${Download_dir}${Font_color_suffix}\n" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + nohup aria2c -c "${CONFIG}" >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + View_Config + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + View_Config + echo -e "${Info} $NAME (PID $(echo ${PID})) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/aria2_debian b/service/aria2_debian new file mode 100644 index 0000000..f23f924 --- /dev/null +++ b/service/aria2_debian @@ -0,0 +1,120 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +### BEGIN INIT INFO +# Provides: aria2 is a lightweight multi-protocol & multi-source command-line download utility. +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: aria2 is a lightweight multi-protocol & multi-source command-line download utility. +# Description: Start or stop the Aria2 +### END INIT INFO + +NAME="Aria2" +NAME_BIN="aria2c" +CONFIG="/root/.aria2/aria2.conf" +LOG="/root/.aria2/aria2.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v "aria2.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +Read_config(){ + [[ ! -e ${CONFIG} ]] && echo -e "${Error} ${NAME} 配置文件不存在 !" && exit 1 + Download_dir=$(cat ${CONFIG}|grep -v '#'|grep "dir=") + [[ ! -z "${Download_dir}" ]] && Download_dir=$(echo "${Download_dir}"|awk -F '=' '{print $2}') + RPC_listen_port=$(cat ${CONFIG}|grep -v '#'|grep "rpc-listen-port=") + [[ ! -z "${RPC_listen_port}" ]] && RPC_listen_port=$(echo "${RPC_listen_port}"|awk -F '=' '{print $2}') + RPC_secret=$(cat ${CONFIG}|grep -v '#'|grep "rpc-secret=") + [[ ! -z "${RPC_secret}" ]] && RPC_secret=$(echo "${RPC_secret}"|awk -F '=' '{print $2}') +} +View_Config(){ + Read_config + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP(外网IP检测失败)" + fi + fi + fi + [[ -z "${Download_dir}" ]] && Download_dir="/usr/local/aria2/" + [[ -z "${RPC_listen_port}" ]] && RPC_listen_port="6800" + [[ -z "${RPC_secret}" ]] && RPC_secret="无令牌密码" + clear + echo -e "\nAria2 简单配置信息:\n + 地址\t: ${Green_font_prefix}${ip}${Font_color_suffix} + 端口\t: ${Green_font_prefix}${RPC_listen_port}${Font_color_suffix} + 密码\t: ${Green_font_prefix}${RPC_secret}${Font_color_suffix} + 目录\t: ${Green_font_prefix}${Download_dir}${Font_color_suffix}\n" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + nohup aria2c -c "${CONFIG}" >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + View_Config + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + View_Config + echo -e "${Info} $NAME (PID $(echo ${PID})) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/brook-pf_centos b/service/brook-pf_centos new file mode 100644 index 0000000..db67812 --- /dev/null +++ b/service/brook-pf_centos @@ -0,0 +1,141 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: Brook-pf + +### BEGIN INIT INFO +# Provides: Brook-pf +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight port forwarding tool +# Description: Start or stop the Brook-pf +### END INIT INFO + +NAME="Brook-pf" +NAME_BIN="brook relays" +FILE="/usr/local/brook-pf" +CONF="${FILE}/brook.conf" +LOG="${FILE}/brook.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v ".sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} Brook 配置文件不存在 !" && exit 1 + user_all=$(cat ${CONF}|sed '/^\s*$/d') + user_all_num=$(echo "${user_all}"|wc -l) + [[ -z ${user_all} ]] && echo -e "${Error} Brook 配置文件中用户配置为空 !" && exit 1 +} +View_User(){ + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + user_port=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $1}') + user_ip_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $2}') + user_port_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $3}') + user_Enabled_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $4}') + if [[ ${user_Enabled_pf} == "0" ]]; then + user_Enabled_pf_1="${Red_font_prefix}禁用${Font_color_suffix}" + else + user_Enabled_pf_1="${Green_font_prefix}启用${Font_color_suffix}" + fi + user_list_all=${user_list_all}"本地监听端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 被转发IP: ${Green_font_prefix}"${user_ip_pf}"${Font_color_suffix}\t 被转发端口: ${Green_font_prefix}"${user_port_pf}"${Font_color_suffix}\t 状态: ${user_Enabled_pf_1}\n" + user_IP="" + done + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi + echo -e "当前端口转发总数: ${Green_background_prefix} "${user_all_num}" ${Font_color_suffix} 当前服务器IP: ${Green_background_prefix} "${ip}" ${Font_color_suffix}" + echo -e "${user_list_all}" + echo -e "========================\n" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} ${NAME} (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} ${NAME} 启动中..." + ulimit -n 51200 + servers_all="" + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + user_Enabled_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $4}') + if [[ ${user_Enabled_pf} == "0" ]]; then + continue + fi + user_port=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $1}') + user_ip_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $2}') + user_port_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $3}') + servers_all="${servers_all}-l \":${user_port} ${user_ip_pf}:${user_port_pf}\" " + done + eval nohup ./brook relays $(echo ${servers_all}) >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} ${NAME} 启动成功 !" + View_User + else + echo -e "${Error} ${NAME} 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} ${NAME} 停止成功 !" + else + echo -e "${Error} ${NAME} 停止失败 !" + fi + else + echo -e "${Info} ${NAME} 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + read_config + View_User + echo -e "${Info} ${NAME} (PID ${PID}) 正在运行..." + else + echo -e "${Info} ${NAME} 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + sleep 2s + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/brook-pf_debian b/service/brook-pf_debian new file mode 100644 index 0000000..ce7ff6d --- /dev/null +++ b/service/brook-pf_debian @@ -0,0 +1,139 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: Brook-pf +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight port forwarding tool +# Description: Start or stop the Brook-pf +### END INIT INFO + +NAME="Brook-pf" +NAME_BIN="brook relays" +FILE="/usr/local/brook-pf" +CONF="${FILE}/brook.conf" +LOG="${FILE}/brook.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v ".sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} Brook 配置文件不存在 !" && exit 1 + user_all=$(cat ${CONF}|sed '/^\s*$/d') + user_all_num=$(echo "${user_all}"|wc -l) + [[ -z ${user_all} ]] && echo -e "${Error} Brook 配置文件中用户配置为空 !" && exit 1 +} +View_User(){ + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + user_port=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $1}') + user_ip_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $2}') + user_port_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $3}') + user_Enabled_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $4}') + if [[ ${user_Enabled_pf} == "0" ]]; then + user_Enabled_pf_1="${Red_font_prefix}禁用${Font_color_suffix}" + else + user_Enabled_pf_1="${Green_font_prefix}启用${Font_color_suffix}" + fi + user_list_all=${user_list_all}"本地监听端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 被转发IP: ${Green_font_prefix}"${user_ip_pf}"${Font_color_suffix}\t 被转发端口: ${Green_font_prefix}"${user_port_pf}"${Font_color_suffix}\t 状态: ${user_Enabled_pf_1}\n" + user_IP="" + done + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi + echo -e "当前端口转发总数: ${Green_background_prefix} "${user_all_num}" ${Font_color_suffix} 当前服务器IP: ${Green_background_prefix} "${ip}" ${Font_color_suffix}" + echo -e "${user_list_all}" + echo -e "========================\n" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} ${NAME} (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} ${NAME} 启动中..." + ulimit -n 51200 + servers_all="" + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + user_Enabled_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $4}') + if [[ ${user_Enabled_pf} == "0" ]]; then + continue + fi + user_port=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $1}') + user_ip_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $2}') + user_port_pf=$(echo "${user_all}"|sed -n "${integer}p"|awk '{print $3}') + servers_all="${servers_all}-l \":${user_port} ${user_ip_pf}:${user_port_pf}\" " + done + eval nohup ./brook relays $(echo ${servers_all}) >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} ${NAME} 启动成功 !" + View_User + else + echo -e "${Error} ${NAME} 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} ${NAME} 停止成功 !" + else + echo -e "${Error} ${NAME} 停止失败 !" + fi + else + echo -e "${Info} ${NAME} 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + read_config + View_User + echo -e "${Info} ${NAME} (PID ${PID}) 正在运行..." + else + echo -e "${Info} ${NAME} 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + sleep 2s + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/brook_centos b/service/brook_centos new file mode 100644 index 0000000..8ea47d2 --- /dev/null +++ b/service/brook_centos @@ -0,0 +1,105 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: Brook + +### BEGIN INIT INFO +# Provides: Brook +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight SOCKS5 proxy tool +# Description: Start or stop the Brook +### END INIT INFO + +NAME="Brook" +NAME_BIN="./brook " +FILE="/usr/local/brook" +CONF="/usr/local/brook/brook.conf" +LOG="/usr/local/brook/brook.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "brook.sh" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} Brook 配置文件不存在 !" && exit 1 + user_all=$(cat ${CONF}|sed "1d") + user_all_num=$(echo "${user_all}"|wc -l) + [[ -z ${user_all} ]] && echo -e "${Error} Brook 配置文件中用户配置为空 !" && exit 1 + protocol=$(cat ${CONF}|sed -n "1p") +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + servers_all="" + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + user_text=$(echo "${user_all}"|sed -n "${integer}p") + port=$(echo "${user_text}"|awk '{print $1}') + password=$(echo "${user_text}"|awk '{print $2}') + servers_all="${servers_all}-l \":${port} ${password}\" " + done + eval nohup ./brook ${protocol} $(echo ${servers_all}) >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/brook_debian b/service/brook_debian new file mode 100644 index 0000000..af69dbe --- /dev/null +++ b/service/brook_debian @@ -0,0 +1,104 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: Brook +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight SOCKS5 proxy tool +# Description: Start or stop the Brook +### END INIT INFO + +NAME="Brook" +NAME_BIN="./brook " +FILE="/usr/local/brook" +CONF="/usr/local/brook/brook.conf" +LOG="/usr/local/brook/brook.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "brook.sh" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} Brook 配置文件不存在 !" && exit 1 + user_all=$(cat ${CONF}|sed "1d") + user_all_num=$(echo "${user_all}"|wc -l) + [[ -z ${user_all} ]] && echo -e "${Error} Brook 配置文件中用户配置为空 !" && exit 1 + protocol=$(cat ${CONF}|sed -n "1p") +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + servers_all="" + for((integer = 1; integer <= ${user_all_num}; integer++)) + do + user_text=$(echo "${user_all}"|sed -n "${integer}p") + port=$(echo "${user_text}"|awk '{print $1}') + password=$(echo "${user_text}"|awk '{print $2}') + servers_all="${servers_all}-l \":${port} ${password}\" " + done + #echo -e "nohup ./brook ${protocol} $(echo ${servers_all}) >> \"${LOG}\" 2>&1 &" + eval nohup ./brook ${protocol} $(echo ${servers_all}) >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/caddy_centos b/service/caddy_centos new file mode 100644 index 0000000..c0d22fe --- /dev/null +++ b/service/caddy_centos @@ -0,0 +1,87 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: The HTTP/2 web server with automatic HTTPS. + +### BEGIN INIT INFO +# Provides: Caddy +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: The HTTP/2 web server with automatic HTTPS +# Description: Start or stop the Caddy server +### END INIT INFO + +NAME="Caddy" +NAME_BIN="caddy" +BIN="/usr/local/caddy/caddy" +if [ -f "/usr/local/caddy/Caddyfile" ]; then + CONF="/usr/local/caddy/Caddyfile" +elif [ -f "/etc/caddy/Caddyfile" ]; then + CONF="/etc/caddy/Caddyfile" +fi +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + ulimit -n 51200 + nohup "$BIN" --conf="$CONF" -agree >> /tmp/caddy.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/caddy_debian b/service/caddy_debian new file mode 100644 index 0000000..350c493 --- /dev/null +++ b/service/caddy_debian @@ -0,0 +1,85 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: Caddy +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: The HTTP/2 web server with automatic HTTPS +# Description: Start or stop the Caddy server +### END INIT INFO + +NAME="Caddy" +NAME_BIN="caddy" +BIN="/usr/local/caddy/caddy" +if [ -f "/usr/local/caddy/Caddyfile" ]; then + CONF="/usr/local/caddy/Caddyfile" +elif [ -f "/etc/caddy/Caddyfile" ]; then + CONF="/etc/caddy/Caddyfile" +fi +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + ulimit -n 51200 + nohup "$BIN" --conf="$CONF" -agree >> /tmp/caddy.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix}$NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/cloudt_centos b/service/cloudt_centos new file mode 100644 index 0000000..88ef73f --- /dev/null +++ b/service/cloudt_centos @@ -0,0 +1,138 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: Cloud Torrent: a self-hosted remote torrent client + +### BEGIN INIT INFO +# Provides: Cloud-Torrent +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Cloud Torrent: a self-hosted remote torrent client +# Description: Start or stop the Cloud Torrent +### END INIT INFO + +NAME="Cloud Torrent" +NAME_BIN="cloud-torrent" +FILE="/usr/local/cloudtorrent" +BIN="${FILE}/cloud-torrent" +CONFIG="${FILE}/cloud-torrent.json" +CONF="${FILE}/cloud-torrent.conf" +LOG="/tmp/ct.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} ${NAME} 配置文件不存在 !" && exit 1 + host=`cat ${CONF}|grep "host = "|awk -F "host = " '{print $NF}'` + port=`cat ${CONF}|grep "port = "|awk -F "port = " '{print $NF}'` + user=`cat ${CONF}|grep "user = "|awk -F "user = " '{print $NF}'` + passwd=`cat ${CONF}|grep "passwd = "|awk -F "passwd = " '{print $NF}'` +} +View_User(){ + if [[ "${host}" == "0.0.0.0" ]]; then + host=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${host}" ]]; then + host=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${host}" ]]; then + host=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${host}" ]]; then + host="VPS_IP" + fi + fi + fi + fi + if [[ "${port}" == "80" ]]; then + port="" + else + port=":${port}" + fi + if [[ -z ${user} ]]; then + clear && echo "————————————————" && echo + echo -e " 你的 Cloud Torrent 信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}http://${host}${port}${Font_color_suffix}" + echo && echo "————————————————" + else + clear && echo "————————————————" && echo + echo -e " 你的 Cloud Torrent 信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}http://${host}${port}${Font_color_suffix}" + echo -e " 用户\t: ${Green_font_prefix}${user}${Font_color_suffix}" + echo -e " 密码\t: ${Green_font_prefix}${passwd}${Font_color_suffix}" + echo && echo "————————————————" + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + if [[ -z ${user} ]]; then + ./cloud-torrent -t "Cloud Torrent - DOUBI" -h "${host}" -p ${port} -l >> "${LOG}" 2>&1 & + else + ./cloud-torrent -t "Cloud Torrent - DOUBI" -h "${host}" -p ${port} -l -a "${user}:${passwd}" >> "${LOG}" 2>&1 & + fi + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + View_User + else + echo -e "${Error} $NAME 启动失败(请运行脚本查看日志错误输出) !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + read_config + View_User + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/cloudt_debian b/service/cloudt_debian new file mode 100644 index 0000000..ab86ae9 --- /dev/null +++ b/service/cloudt_debian @@ -0,0 +1,136 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: Cloud-Torrent +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Cloud Torrent: a self-hosted remote torrent client +# Description: Start or stop the Cloud Torrent +### END INIT INFO + +NAME="Cloud Torrent" +NAME_BIN="cloud-torrent" +FILE="/usr/local/cloudtorrent" +BIN="${FILE}/cloud-torrent" +CONFIG="${FILE}/cloud-torrent.json" +CONF="${FILE}/cloud-torrent.conf" +LOG="/tmp/ct.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} ${NAME} 配置文件不存在 !" && exit 1 + host=`cat ${CONF}|grep "host = "|awk -F "host = " '{print $NF}'` + port=`cat ${CONF}|grep "port = "|awk -F "port = " '{print $NF}'` + user=`cat ${CONF}|grep "user = "|awk -F "user = " '{print $NF}'` + passwd=`cat ${CONF}|grep "passwd = "|awk -F "passwd = " '{print $NF}'` +} +View_User(){ + if [[ "${host}" == "0.0.0.0" ]]; then + host=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${host}" ]]; then + host=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${host}" ]]; then + host=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${host}" ]]; then + host="VPS_IP" + fi + fi + fi + fi + if [[ "${port}" == "80" ]]; then + port="" + else + port=":${port}" + fi + if [[ -z ${user} ]]; then + clear && echo "————————————————" && echo + echo -e " 你的 Cloud Torrent 信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}http://${host}${port}${Font_color_suffix}" + echo && echo "————————————————" + else + clear && echo "————————————————" && echo + echo -e " 你的 Cloud Torrent 信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}http://${host}${port}${Font_color_suffix}" + echo -e " 用户\t: ${Green_font_prefix}${user}${Font_color_suffix}" + echo -e " 密码\t: ${Green_font_prefix}${passwd}${Font_color_suffix}" + echo && echo "————————————————" + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + if [[ -z ${user} ]]; then + ./cloud-torrent -t "Cloud Torrent - DOUBI" -h "${host}" -p ${port} -l >> "${LOG}" 2>&1 & + else + ./cloud-torrent -t "Cloud Torrent - DOUBI" -h "${host}" -p ${port} -l -a "${user}:${passwd}" >> "${LOG}" 2>&1 & + fi + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + View_User + else + echo -e "${Error} $NAME 启动失败(请运行脚本查看日志错误输出) !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + read_config + View_User + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/daze_centos b/service/daze_centos new file mode 100644 index 0000000..3f327b9 --- /dev/null +++ b/service/daze_centos @@ -0,0 +1,103 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: DAZE + +### BEGIN INIT INFO +# Provides: DAZE +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight HTTP proxy tool +# Description: Start or stop the DAZE +### END INIT INFO + +NAME="DAZE" +NAME_BIN="daze" +FILE="/usr/local/daze" +CONF="${FILE}/daze.conf" +LOG="${FILE}/daze.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=$(ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v "daze.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}') + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} DAZE 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep "port"|awk -F "=" '{print $NF}') + password=$(cat ${CONF}|grep "password"|awk -F "=" '{print $NF}') + method=$(cat ${CONF}|grep "method"|awk -F "=" '{print $NF}') + obfs_url=$(cat ${CONF}|grep "obfs_url"|awk -F "=" '{print $NF}') + dns=$(cat ${CONF}|grep "dns"|awk -F "=" '{print $NF}') +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + if [[ -z ${obfs_url} ]]; then + nohup ./daze server -l "0.0.0.0:${port}" -k "${password}" -e "${method}" -dns "${dns}" >> "${LOG}" 2>&1 & + else + nohup ./daze server -l "0.0.0.0:${port}" -k "${password}" -e "${method}" -m "${obfs_url}" -dns "${dns}" >> "${LOG}" 2>&1 & + fi + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + sleep 2s + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/daze_debian b/service/daze_debian new file mode 100644 index 0000000..69159ac --- /dev/null +++ b/service/daze_debian @@ -0,0 +1,101 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: DAZE +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight HTTP proxy tool +# Description: Start or stop the DAZE +### END INIT INFO + +NAME="DAZE" +NAME_BIN="daze" +FILE="/usr/local/daze" +CONF="${FILE}/daze.conf" +LOG="${FILE}/daze.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=$(ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v "daze.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}') + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} DAZE 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep "port"|awk -F "=" '{print $NF}') + password=$(cat ${CONF}|grep "password"|awk -F "=" '{print $NF}') + method=$(cat ${CONF}|grep "method"|awk -F "=" '{print $NF}') + obfs_url=$(cat ${CONF}|grep "obfs_url"|awk -F "=" '{print $NF}') + dns=$(cat ${CONF}|grep "dns"|awk -F "=" '{print $NF}') +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + if [[ -z ${obfs_url} ]]; then + nohup ./daze server -l "0.0.0.0:${port}" -k "${password}" -e "${method}" -dns "${dns}" >> "${LOG}" 2>&1 & + else + nohup ./daze server -l "0.0.0.0:${port}" -k "${password}" -e "${method}" -m "${obfs_url}" -dns "${dns}" >> "${LOG}" 2>&1 & + fi + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + sleep 2s + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/dowsdns_centos b/service/dowsdns_centos new file mode 100644 index 0000000..3a3574a --- /dev/null +++ b/service/dowsdns_centos @@ -0,0 +1,104 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: DowsDNS + +### BEGIN INIT INFO +# Provides: DowsDNS +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight DNS server +# Description: Start or stop the DowsDNS server +### END INIT INFO + +NAME="DowsDNS" +NAME_BIN="python start.py" +BIN="/usr/local/dowsDNS" +CONF="/usr/local/dowsDNS/conf/config.json" +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +Read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} DowsDNS 配置文件不存在 !" && exit 1 + local_dns_port=`cat ${CONF}|grep "Local_dns_port"|sed -r 's/.*:(.+),.*/\1/'` +} +View_dowsdns(){ + Read_config + if [[ ${local_dns_server} == "127.0.0.1" ]]; then + ip="${local_dns_server} " + else + ip=`wget -qO- -t1 -T2 members.3322.org/dyndns/getip` + [[ -z ${ip} ]] && ip="VPS_IP" + fi + clear && echo "————————————————" && echo + echo -e " 请在你的设备中设置DNS服务器为: + IP : ${Info_font_prefix}${ip}${Font_suffix} ,端口 : ${Info_font_prefix}${local_dns_port}${Font_suffix} + + 注意:如果设备中没有 DNS端口设置选项,那么就只能使用默认的 53 端口" + echo && echo "————————————————" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID $(echo ${PID})) 正在运行..." && exit 0 + else + cd "${BIN}" + nohup python start.py > /tmp/dowsdns.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + View_dowsdns + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + View_dowsdns + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID $(echo ${PID})) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/dowsdns_debian b/service/dowsdns_debian new file mode 100644 index 0000000..bb29e86 --- /dev/null +++ b/service/dowsdns_debian @@ -0,0 +1,103 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: DowsDNS +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight DNS server +# Description: Start or stop the DowsDNS server +### END INIT INFO + + +NAME="DowsDNS" +NAME_BIN="python start.py" +BIN="/usr/local/dowsDNS" +CONF="/usr/local/dowsDNS/conf/config.json" +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +Read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} DowsDNS 配置文件不存在 !" && exit 1 + local_dns_port=`cat ${CONF}|grep "Local_dns_port"|sed -r 's/.*:(.+),.*/\1/'` +} +View_dowsdns(){ + Read_config + if [[ ${local_dns_server} == "127.0.0.1" ]]; then + ip="${local_dns_server} " + else + ip=`wget -qO- -t1 -T2 members.3322.org/dyndns/getip` + [[ -z ${ip} ]] && ip="VPS_IP" + fi + clear && echo "————————————————" && echo + echo -e " 请在你的设备中设置DNS服务器为: + IP : ${Info_font_prefix}${ip}${Font_suffix} ,端口 : ${Info_font_prefix}${local_dns_port}${Font_suffix} + + 注意:如果设备中没有 DNS端口设置选项,那么就只能使用默认的 53 端口" + echo && echo "————————————————" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID $(echo ${PID})) 正在运行..." && exit 0 + else + cd "${BIN}" + nohup python start.py > /tmp/dowsdns.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + View_dowsdns + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix}$NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + View_dowsdns + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID $(echo ${PID})) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/goflyway_centos b/service/goflyway_centos new file mode 100644 index 0000000..1edde18 --- /dev/null +++ b/service/goflyway_centos @@ -0,0 +1,103 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: GoFlyway + +### BEGIN INIT INFO +# Provides: GoFlyway +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight HTTP proxy tool +# Description: Start or stop the GoFlyway +### END INIT INFO + +NAME="GoFlyway" +NAME_BIN="goflyway" +FILE="/usr/local/goflyway" +CONF="${FILE}/goflyway.conf" +LOG="${FILE}/goflyway.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v "goflyway.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} GoFlyway 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep "port"|awk -F "=" '{print $NF}') + passwd=$(cat ${CONF}|grep "passwd"|awk -F "=" '{print $NF}') + proxy_pass=$(cat ${CONF}|grep "proxy_pass"|awk -F "=" '{print $NF}') + protocol=$(cat ${CONF}|grep "protocol"|awk -F "=" '{print $NF}') + [[ -z "${protocol}" ]] && protocol="http" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + if [[ -z ${proxy_pass} ]]; then + nohup ./goflyway -k="${passwd}" -l=":${port}" -U="${protocol}" >> "${LOG}" 2>&1 & + else + nohup ./goflyway -k="${passwd}" -l=":${port}" -proxy-pass="${proxy_pass}" -U="${protocol}" >> "${LOG}" 2>&1 & + fi + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + sleep 2s + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/goflyway_debian b/service/goflyway_debian new file mode 100644 index 0000000..a041f7e --- /dev/null +++ b/service/goflyway_debian @@ -0,0 +1,101 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: GoFlyway +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight HTTP proxy tool +# Description: Start or stop the GoFlyway +### END INIT INFO + +NAME="GoFlyway" +NAME_BIN="goflyway" +FILE="/usr/local/goflyway" +CONF="${FILE}/goflyway.conf" +LOG="${FILE}/goflyway.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v "goflyway.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} GoFlyway 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep "port"|awk -F "=" '{print $NF}') + passwd=$(cat ${CONF}|grep "passwd"|awk -F "=" '{print $NF}') + proxy_pass=$(cat ${CONF}|grep "proxy_pass"|awk -F "=" '{print $NF}') + protocol=$(cat ${CONF}|grep "protocol"|awk -F "=" '{print $NF}') + [[ -z "${protocol}" ]] && protocol="http" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + if [[ -z ${proxy_pass} ]]; then + nohup ./goflyway -k="${passwd}" -l=":${port}" -U="${protocol}" >> "${LOG}" 2>&1 & + else + nohup ./goflyway -k="${passwd}" -l=":${port}" -proxy-pass="${proxy_pass}" -U="${protocol}" >> "${LOG}" 2>&1 & + fi + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + sleep 2s + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/lightsocks_centos b/service/lightsocks_centos new file mode 100644 index 0000000..61c2e34 --- /dev/null +++ b/service/lightsocks_centos @@ -0,0 +1,90 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: Lightsocks + +### BEGIN INIT INFO +# Provides: Lightsocks +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: A light tunnel proxy that helps you bypass firewalls +# Description: Start or stop the Lightsocks +### END INIT INFO + +NAME="Lightsocks" +NAME_BIN="lightsocks" +FILE="/usr/local/lightsocks" +CONF=$(echo ${HOME})"/.lightsocks.json" +LOG="/usr/local/lightsocks/lightsocks.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v "lightsocks.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + nohup ./lightsocks >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + sleep 2s + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/lightsocks_debian b/service/lightsocks_debian new file mode 100644 index 0000000..8ff6cbd --- /dev/null +++ b/service/lightsocks_debian @@ -0,0 +1,88 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: Lightsocks +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: A light tunnel proxy that helps you bypass firewalls +# Description: Start or stop the Lightsocks +### END INIT INFO + +NAME="Lightsocks" +NAME_BIN="lightsocks" +FILE="/usr/local/lightsocks" +CONF=$(echo ${HOME})"/.lightsocks.json" +LOG="/usr/local/lightsocks/lightsocks.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v "lightsocks.sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + nohup ./lightsocks >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + sleep 2s + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/mtproxy_centos b/service/mtproxy_centos new file mode 100644 index 0000000..fce5260 --- /dev/null +++ b/service/mtproxy_centos @@ -0,0 +1,99 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: MTProxy + +### BEGIN INIT INFO +# Provides: MTProxy +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Simple MT-Proto proxy +# Description: Start or stop the MTProxy +### END INIT INFO + +NAME="MTProxy" +NAME_BIN="./mtproto-proxy" +FILE="/usr/local/mtproxy" +CONF="/usr/local/mtproxy/mtproxy.conf" +LOG="/usr/local/mtproxy/mtproxy.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} MTProxy 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + passwd=$(cat ${CONF}|grep 'PASSWORD = '|awk -F 'PASSWORD = ' '{print $NF}') + tag=$(cat ${CONF}|grep 'TAG = '|awk -F 'TAG = ' '{print $NF}') + nat=$(cat ${CONF}|grep 'NAT = '|awk -F 'NAT = ' '{print $NF}') + [[ ! -z "${tag}" ]] && tag="-P \"${tag}\"" + [[ ! -z "${nat}" ]] && nat="--nat-info \"${nat}\"" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + eval nohup ./mtproto-proxy -u nobody -p 65432 -H ${port} -S "${passwd}" $(echo ${tag}) $(echo ${nat}) --aes-pwd proxy-secret proxy-multi.conf >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !请查看日志文件检查问题所在。" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/mtproxy_debian b/service/mtproxy_debian new file mode 100644 index 0000000..0e86e95 --- /dev/null +++ b/service/mtproxy_debian @@ -0,0 +1,97 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: MTProxy +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Simple MT-Proto proxy +# Description: Start or stop the MTProxy +### END INIT INFO + +NAME="MTProxy" +NAME_BIN="./mtproto-proxy" +FILE="/usr/local/mtproxy" +CONF="/usr/local/mtproxy/mtproxy.conf" +LOG="/usr/local/mtproxy/mtproxy.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} MTProxy 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + passwd=$(cat ${CONF}|grep 'PASSWORD = '|awk -F 'PASSWORD = ' '{print $NF}') + tag=$(cat ${CONF}|grep 'TAG = '|awk -F 'TAG = ' '{print $NF}') + nat=$(cat ${CONF}|grep 'NAT = '|awk -F 'NAT = ' '{print $NF}') + [[ ! -z "${tag}" ]] && tag="-P \"${tag}\"" + [[ ! -z "${nat}" ]] && nat="--nat-info \"${nat}\"" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + eval nohup ./mtproto-proxy -u nobody -p 65432 -H ${port} -S "${passwd}" $(echo ${tag}) $(echo ${nat}) --aes-pwd proxy-secret proxy-multi.conf >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !请查看日志文件检查问题所在。" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/mtproxy_go_centos b/service/mtproxy_go_centos new file mode 100644 index 0000000..6f4ea58 --- /dev/null +++ b/service/mtproxy_go_centos @@ -0,0 +1,106 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: MTProxy Golang + +### BEGIN INIT INFO +# Provides: MTProxy Golang +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Simple MT-Proto-go proxy +# Description: Start or stop the MTProxy-go +### END INIT INFO + +NAME="MTProxy" +NAME_BIN="./mtg " +FILE="/usr/local/mtproxy-go" +CONF="/usr/local/mtproxy-go/mtproxy.conf" +LOG="/usr/local/mtproxy-go/mtproxy.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=$(ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}') + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} $NAME 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + password=$(cat ${CONF}|grep 'PASSWORD = '|awk -F 'PASSWORD = ' '{print $NF}') + tag=$(cat ${CONF}|grep 'TAG = '|awk -F 'TAG = ' '{print $NF}') + nat_ipv4=$(cat ${CONF}|grep 'NAT-IPv4 = '|awk -F 'NAT-IPv4 = ' '{print $NF}') + nat_ipv6=$(cat ${CONF}|grep 'NAT-IPv6 = '|awk -F 'NAT-IPv6 = ' '{print $NF}') + secure=$(cat ${CONF}|grep 'SECURE = '|awk -F 'SECURE = ' '{print $NF}') + [[ ! -z "${nat_ipv4}" ]] && nat_ipv4="-4 \"${nat_ipv4}\"" + [[ ! -z "${nat_ipv6}" ]] && nat_ipv6="-6 \"${nat_ipv6}\"" + if [[ "${secure}" == "YES" ]]; then + secure="-s" + else + secure="" + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + eval nohup ./mtg -b 0.0.0.0 -p ${port} $(echo ${nat_ipv4}) $(echo ${nat_ipv6}) -q 65436 $(echo ${secure}) "${password}" "${tag}" >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !请查看日志文件检查问题所在。" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/mtproxy_go_debian b/service/mtproxy_go_debian new file mode 100644 index 0000000..0faa25d --- /dev/null +++ b/service/mtproxy_go_debian @@ -0,0 +1,104 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: MTProxy Golang +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Simple MT-Proto-go proxy +# Description: Start or stop the MTProxy-go +### END INIT INFO + +NAME="MTProxy" +NAME_BIN="./mtg " +FILE="/usr/local/mtproxy-go" +CONF="/usr/local/mtproxy-go/mtproxy.conf" +LOG="/usr/local/mtproxy-go/mtproxy.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=$(ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}') + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} $NAME 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + password=$(cat ${CONF}|grep 'PASSWORD = '|awk -F 'PASSWORD = ' '{print $NF}') + tag=$(cat ${CONF}|grep 'TAG = '|awk -F 'TAG = ' '{print $NF}') + nat_ipv4=$(cat ${CONF}|grep 'NAT-IPv4 = '|awk -F 'NAT-IPv4 = ' '{print $NF}') + nat_ipv6=$(cat ${CONF}|grep 'NAT-IPv6 = '|awk -F 'NAT-IPv6 = ' '{print $NF}') + secure=$(cat ${CONF}|grep 'SECURE = '|awk -F 'SECURE = ' '{print $NF}') + [[ ! -z "${nat_ipv4}" ]] && nat_ipv4="-4 \"${nat_ipv4}\"" + [[ ! -z "${nat_ipv6}" ]] && nat_ipv6="-6 \"${nat_ipv6}\"" + if [[ "${secure}" == "YES" ]]; then + secure="-s" + else + secure="" + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + eval nohup ./mtg -b 0.0.0.0 -p ${port} $(echo ${nat_ipv4}) $(echo ${nat_ipv6}) -q 65436 $(echo ${secure}) "${password}" "${tag}" >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !请查看日志文件检查问题所在。" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/ocserv_debian b/service/ocserv_debian new file mode 100644 index 0000000..4e8028b --- /dev/null +++ b/service/ocserv_debian @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +### BEGIN INIT INFO +# Provides: ocserv - OpenConnect VPN server +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Openconnect VPN server (ocserv) is a VPN server compatible with the openconnect VPN client. +# Description: Start or stop the ocserv +### END INIT INFO + +NAME="ocserv" +CONFIG="/etc/ocserv/ocserv.conf" +PID_FILE="/var/run/ocserv.pid" +LOG="/tmp/ocserv.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + [[ ! -e ${PID_FILE} ]] && return 1 + PID=$(cat ${PID_FILE}) + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + nohup ocserv -f -d 1 -c "${CONFIG}" > "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + rm -f ${PID_FILE} + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID $(echo ${PID})) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +do_log(){ + [[ ! -e ${LOG} ]] && echo -e "${Error} 日志文件不存在 !" && exit 0 + echo && echo -e " 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo + tail -f ${LOG} +} +do_test(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + fi + echo && echo -e " 提示 note 的不影响使用,提示 Error 的才影响。" && echo + ocserv -f -t -c ${CONFIG} +} +case "$1" in + start|stop|restart|status|log|test) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status | log | test }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/pipes_centos b/service/pipes_centos new file mode 100644 index 0000000..8f2c1b0 --- /dev/null +++ b/service/pipes_centos @@ -0,0 +1,106 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: PipeSocks + +### BEGIN INIT INFO +# Provides: PipeSocks +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight SOCKS5 proxy tool +# Description: Start or stop the PipeSocks +### END INIT INFO + +NAME="PipeSocks" +NAME_BIN="pipesocks" +FILE="/usr/local/pipesocks" +CONF="/etc/pipesocks/pipesocks.conf" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v ".sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} ${NAME} 配置文件不存在 !" && exit 1 + pump_port=`cat ${CONF}|grep "pump_port"|awk -F "=" '{print $NF}'` + pump_passwd=`cat ${CONF}|grep "pump_passwd"|awk -F "=" '{print $NF}'` +} +View_User(){ + ip=`wget -qO- -t1 -T2 ipinfo.io/ip` + [[ -z ${ip} ]] && ip="VPS_IP" + clear && echo "————————————————" && echo + echo -e " 你的 PipeSocks 账号信息 :" && echo + echo -e " I P\t: ${Info_font_prefix}${ip}${Font_suffix}" + echo -e " 端口\t: ${Info_font_prefix}${pump_port}${Font_suffix}" + echo -e " 密码\t: ${Info_font_prefix}${pump_passwd}${Font_suffix}" + echo && echo "————————————————" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + nohup ./pipesocks pump -p ${pump_port} -k ${pump_passwd} &>pipesocks.log & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + View_User + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + read_config + View_User + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/pipes_debian b/service/pipes_debian new file mode 100644 index 0000000..5d6d4b6 --- /dev/null +++ b/service/pipes_debian @@ -0,0 +1,104 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: PipeSocks +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight SOCKS5 proxy tool +# Description: Start or stop the PipeSocks +### END INIT INFO + +NAME="PipeSocks" +NAME_BIN="pipesocks" +FILE="/usr/local/pipesocks" +CONF="/etc/pipesocks/pipesocks.conf" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" | grep -v ".sh"| grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} ${NAME} 配置文件不存在 !" && exit 1 + pump_port=`cat ${CONF}|grep "pump_port"|awk -F "=" '{print $NF}'` + pump_passwd=`cat ${CONF}|grep "pump_passwd"|awk -F "=" '{print $NF}'` +} +View_User(){ + ip=`wget -qO- -t1 -T2 ipinfo.io/ip` + [[ -z ${ip} ]] && ip="VPS_IP" + clear && echo "————————————————" && echo + echo -e " 你的 PipeSocks 账号信息 :" && echo + echo -e " I P\t: ${Info_font_prefix}${ip}${Font_suffix}" + echo -e " 端口\t: ${Info_font_prefix}${pump_port}${Font_suffix}" + echo -e " 密码\t: ${Info_font_prefix}${pump_passwd}${Font_suffix}" + echo && echo "————————————————" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FILE} + echo -e "${Info} $NAME 启动中..." + nohup ./pipesocks pump -p ${pump_port} -k ${pump_passwd} &>pipesocks.log & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + View_User + else + echo -e "${Error} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + read_config + View_User + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/pserver_centos b/service/pserver_centos new file mode 100644 index 0000000..3725df1 --- /dev/null +++ b/service/pserver_centos @@ -0,0 +1,115 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: Peerflix Server: a self-hosted remote torrent client + +### BEGIN INIT INFO +# Provides: Peerflix Server +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Peerflix Server: a self-hosted remote torrent client +# Description: Start or stop the Peerflix Server +### END INIT INFO + +NAME="Peerflix Server" +NAME_BIN="peerflix-server" +FILE="/etc/node/lib/node_modules/peerflix-server" +CONF="/etc/peerflix-server/peerflix-server.conf" +LOG="/tmp/peerflix-server.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} ${NAME} 配置文件不存在 !" && exit 1 + host=`cat ${CONF}|grep "host = "|awk -F "host = " '{print $NF}'` + port=`cat ${CONF}|grep "port = "|awk -F "port = " '{print $NF}'` + user=`cat ${CONF}|grep "user = "|awk -F "user = " '{print $NF}'` + passwd=`cat ${CONF}|grep "passwd = "|awk -F "passwd = " '{print $NF}'` +} +View_User(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi + clear && echo "————————————————" && echo + echo -e " Peerflix Server 信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}http://${ip}:${port}${Font_color_suffix}" + echo && echo "————————————————" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + PORT=${port} nohup node ${FILE} > "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + View_User + else + echo -e "${Error} $NAME 启动失败(请运行脚本查看日志错误输出) !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + read_config + View_User + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/pserver_debian b/service/pserver_debian new file mode 100644 index 0000000..25f107d --- /dev/null +++ b/service/pserver_debian @@ -0,0 +1,110 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: Peerflix Server +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Peerflix Server: a self-hosted remote torrent client +# Description: Start or stop the Peerflix Server +### END INIT INFO + +NAME="Peerflix Server" +NAME_BIN="peerflix-server" +FILE="/etc/node/lib/node_modules/peerflix-server" +CONF="/etc/peerflix-server/peerflix-server.conf" +LOG="/tmp/peerflix-server.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} ${NAME} 配置文件不存在 !" && exit 1 + port=`cat ${CONF}|grep "port = "|awk -F "port = " '{print $NF}'` +} +View_User(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi + clear && echo "————————————————" && echo + echo -e " Peerflix Server 信息 :" && echo + echo -e " 地址\t: ${Green_font_prefix}http://${ip}:${port}${Font_color_suffix}" + echo && echo "————————————————" +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + PORT=${port} nohup node ${FILE} > "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + View_User + else + echo -e "${Error} $NAME 启动失败(请运行脚本查看日志错误输出) !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + read_config + View_User + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/server_status_client_centos b/service/server_status_client_centos new file mode 100644 index 0000000..2789048 --- /dev/null +++ b/service/server_status_client_centos @@ -0,0 +1,88 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: ServerStatus-Client + +### BEGIN INIT INFO +# Provides: ServerStatus-Client +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Server status monitoring +# Description: Start or stop the ServerStatus Client server +### END INIT INFO + +NAME="ServerStatus Client" +NAME_BIN="status-client.py" +if [[ -e "/usr/local/ServerStatus/client/status-client.py" ]]; then + BIN="/usr/local/ServerStatus/client/status-client.py" +elif [[ -e "/usr/local/ServerStatus/status-client.py" ]]; then + BIN="/usr/local/ServerStatus/status-client.py" +else + echo -e "${Error_font_prefix}[错误]${Font_suffix} 客户端文件($NAME_BIN)找不到 !" && exit 1 +fi +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + ulimit -n 51200 + nohup python "$BIN" > /tmp/serverstatus_client.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/server_status_client_debian b/service/server_status_client_debian new file mode 100644 index 0000000..8572bc3 --- /dev/null +++ b/service/server_status_client_debian @@ -0,0 +1,86 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: ServerStatus-Client +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Server status monitoring +# Description: Start or stop the ServerStatus Client server +### END INIT INFO + +NAME="ServerStatus Client" +NAME_BIN="status-client.py" +if [[ -e "/usr/local/ServerStatus/client/status-client.py" ]]; then + BIN="/usr/local/ServerStatus/client/status-client.py" +elif [[ -e "/usr/local/ServerStatus/status-client.py" ]]; then + BIN="/usr/local/ServerStatus/status-client.py" +else + echo -e "${Error_font_prefix}[错误]${Font_suffix} 客户端文件($NAME_BIN)找不到 !" && exit 1 +fi +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + ulimit -n 51200 + nohup python "$BIN" > /tmp/serverstatus_client.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix}$NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/server_status_server_centos b/service/server_status_server_centos new file mode 100644 index 0000000..d9cd37e --- /dev/null +++ b/service/server_status_server_centos @@ -0,0 +1,94 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: ServerStatus-Server + +### BEGIN INIT INFO +# Provides: ServerStatus-Server +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Server status monitoring +# Description: Start or stop the ServerStatus Server server +### END INIT INFO + +NAME="ServerStatus Server" +NAME_BIN="sergate" +SERVER_BIN="/usr/local/ServerStatus/server" +WEB_BIN="/usr/local/ServerStatus/web" +CONF="/usr/local/ServerStatus/server/config.json" +CONF1="/usr/local/ServerStatus/server/config.conf" +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +Read_config(){ + if [[ -e "${CONF1}" ]]; then + port="$(cat "${CONF1}"|grep "PORT = "|awk '{print $3}')" + else + port="35601" + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + Read_config + cd "${SERVER_BIN}" + ulimit -n 51200 + nohup "./$NAME_BIN" --config="$CONF" --web-dir="$WEB_BIN" --port=${port} > /tmp/serverstatus_server.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功[监听端口:${port}] !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/server_status_server_debian b/service/server_status_server_debian new file mode 100644 index 0000000..1df6653 --- /dev/null +++ b/service/server_status_server_debian @@ -0,0 +1,92 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: ServerStatus-Server +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Server status monitoring +# Description: Start or stop the ServerStatus Server server +### END INIT INFO + +NAME="ServerStatus Server" +NAME_BIN="sergate" +SERVER_BIN="/usr/local/ServerStatus/server" +WEB_BIN="/usr/local/ServerStatus/web" +CONF="/usr/local/ServerStatus/server/config.json" +CONF1="/usr/local/ServerStatus/server/config.conf" +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +Read_config(){ + if [[ -e "${CONF1}" ]]; then + port="$(cat "${CONF1}"|grep "PORT = "|awk '{print $3}')" + else + port="35601" + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + Read_config + cd "${SERVER_BIN}" + ulimit -n 51200 + nohup "./$NAME_BIN" --config="$CONF" --web-dir="$WEB_BIN" --port=${port} > /tmp/serverstatus_server.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功[监听端口:${port}] !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix}$NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/ss_go_centos b/service/ss_go_centos new file mode 100644 index 0000000..4de03f3 --- /dev/null +++ b/service/ss_go_centos @@ -0,0 +1,102 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: Shadowsocks Golang + +### BEGIN INIT INFO +# Provides: Shadowsocks Golang +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight SOCKS5 proxy tool Shadowsocks +# Description: Start or stop the Shadowsocks-go +### END INIT INFO + +NAME="Shadowsocks" +NAME_BIN="./shadowsocks-go " +FOLDER="/usr/local/shadowsocks-go" +CONF="/usr/local/shadowsocks-go/shadowsocks-go.conf" +LOG="/usr/local/shadowsocks-go/shadowsocks-go.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=$(ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}') + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} $NAME 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + password=$(cat ${CONF}|grep 'PASSWORD = '|awk -F 'PASSWORD = ' '{print $NF}') + cipher=$(cat ${CONF}|grep 'CIPHER = '|awk -F 'CIPHER = ' '{print $NF}') + verbose=$(cat ${CONF}|grep 'VERBOSE = '|awk -F 'VERBOSE = ' '{print $NF}') + if [[ "${verbose}" == "YES" ]]; then + verbose="-verbose" + else + verbose="" + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FOLDER} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + nohup ./shadowsocks-go -s ":${port}" -cipher "${cipher}" -password "${password}" "${verbose}" >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !请查看日志文件检查问题所在。" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/ss_go_debian b/service/ss_go_debian new file mode 100644 index 0000000..ed7760d --- /dev/null +++ b/service/ss_go_debian @@ -0,0 +1,100 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: Shadowsocks Golang +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight SOCKS5 proxy tool Shadowsocks +# Description: Start or stop the Shadowsocks-go +### END INIT INFO + +NAME="Shadowsocks" +NAME_BIN="./shadowsocks-go " +FOLDER="/usr/local/shadowsocks-go" +CONF="/usr/local/shadowsocks-go/shadowsocks-go.conf" +LOG="/usr/local/shadowsocks-go/shadowsocks-go.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +RETVAL=0 + +check_running(){ + PID=$(ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}') + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} $NAME 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + password=$(cat ${CONF}|grep 'PASSWORD = '|awk -F 'PASSWORD = ' '{print $NF}') + cipher=$(cat ${CONF}|grep 'CIPHER = '|awk -F 'CIPHER = ' '{print $NF}') + verbose=$(cat ${CONF}|grep 'VERBOSE = '|awk -F 'VERBOSE = ' '{print $NF}') + if [[ "${verbose}" == "YES" ]]; then + verbose="-verbose" + else + verbose="" + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + read_config + cd ${FOLDER} + echo -e "${Info} $NAME 启动中..." + ulimit -n 51200 + nohup ./shadowsocks-go -s ":${port}" -cipher "${cipher}" -password "${password}" "${verbose}" >> "${LOG}" 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME 启动成功 !" + else + echo -e "${Error} $NAME 启动失败 !请查看日志文件检查问题所在。" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info} $NAME 停止成功 !" + else + echo -e "${Error} $NAME 停止失败 !" + fi + else + echo -e "${Info} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/ssr_centos b/service/ssr_centos new file mode 100644 index 0000000..dc6bb65 --- /dev/null +++ b/service/ssr_centos @@ -0,0 +1,91 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: ShadowsocksR + +### BEGIN INIT INFO +# Provides: ShadowsocksR +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight SOCKS5 proxy tool +# Description: Start or stop the ShadowsocksR server +### END INIT INFO + +NAME="ShadowsocksR" +NAME_BIN="server.py" +FOLDER="/usr/local/shadowsocksr/shadowsocks" +BIN="/usr/local/shadowsocksr/shadowsocks/server.py" +if [ -f "/usr/local/shadowsocksr/user-config.json" ]; then + CONF="/usr/local/shadowsocksr/user-config.json" +elif [ -f "/etc/shadowsocksr/user-config.json" ]; then + CONF="/etc/shadowsocksr/user-config.json" +fi +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + cd ${FOLDER} + #python_ver=$(ls /usr/bin|grep -e "^python[23]\.[1-9]\+$"|tail -1) + python_ver="python" + ulimit -n 512000 + nohup "${python_ver}" "$BIN" -c "$CONF" a >> ssserver.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/ssr_debian b/service/ssr_debian new file mode 100644 index 0000000..2537287 --- /dev/null +++ b/service/ssr_debian @@ -0,0 +1,89 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: ShadowsocksR +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight SOCKS5 proxy tool +# Description: Start or stop the ShadowsocksR server +### END INIT INFO + +NAME="ShadowsocksR" +NAME_BIN="server.py" +FOLDER="/usr/local/shadowsocksr/shadowsocks" +BIN="/usr/local/shadowsocksr/shadowsocks/server.py" +if [ -f "/usr/local/shadowsocksr/user-config.json" ]; then + CONF="/usr/local/shadowsocksr/user-config.json" +elif [ -f "/etc/shadowsocksr/user-config.json" ]; then + CONF="/etc/shadowsocksr/user-config.json" +fi +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + cd ${FOLDER} + #python_ver=$(ls /usr/bin|grep -e "^python[23]\.[1-9]\+$"|tail -1) + python_ver="python" + ulimit -n 512000 + nohup "${python_ver}" "$BIN" -c "$CONF" a >> ssserver.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix}$NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/ssrmu_centos b/service/ssrmu_centos new file mode 100644 index 0000000..1093fde --- /dev/null +++ b/service/ssrmu_centos @@ -0,0 +1,86 @@ +#!/bin/bash +# chkconfig: 2345 90 10 +# description: ShadowsocksR + +### BEGIN INIT INFO +# Provides: ShadowsocksR +# Required-Start: $network $syslog +# Required-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight SOCKS5 proxy tool +# Description: Start or stop the ShadowsocksR mudbjson server +### END INIT INFO + +NAME="ShadowsocksR" +NAME_BIN="server.py" +FOLDER="/usr/local/shadowsocksr" +BIN="/usr/local/shadowsocksr/server.py" +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + cd ${FOLDER} + #python_ver=$(ls /usr/bin|grep -e "^python[23]\.[1-9]\+$"|tail -1) + python_ver="python" + ulimit -n 512000 + nohup "${python_ver}" "$BIN" a >> ssserver.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo -e "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/service/ssrmu_debian b/service/ssrmu_debian new file mode 100644 index 0000000..1f83eea --- /dev/null +++ b/service/ssrmu_debian @@ -0,0 +1,84 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: ShadowsocksR +# Required-Start: $network $local_fs $remote_fs +# Required-Stop: $network $local_fs $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Lightweight SOCKS5 proxy tool +# Description: Start or stop the ShadowsocksR mudbjson server +### END INIT INFO + +NAME="ShadowsocksR" +NAME_BIN="server.py" +FOLDER="/usr/local/shadowsocksr" +BIN="/usr/local/shadowsocksr/server.py" +Info_font_prefix="\033[32m" && Error_font_prefix="\033[31m" && Info_background_prefix="\033[42;37m" && Error_background_prefix="\033[41;37m" && Font_suffix="\033[0m" +RETVAL=0 + +check_running(){ + PID=`ps -ef |grep "${NAME_BIN}" |grep -v "grep" |grep -v "init.d" |grep -v "service" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + return 0 + else + return 1 + fi +} +do_start(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." && exit 0 + else + cd ${FOLDER} + #python_ver=$(ls /usr/bin|grep -e "^python[23]\.[1-9]\+$"|tail -1) + python_ver="python" + ulimit -n 512000 + nohup "${python_ver}" "$BIN" a >> ssserver.log 2>&1 & + sleep 2s + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 启动成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix} $NAME 启动失败 !" + fi + fi +} +do_stop(){ + check_running + if [[ $? -eq 0 ]]; then + kill -9 ${PID} + RETVAL=$? + if [[ $RETVAL -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 停止成功 !" + else + echo -e "${Error_font_prefix}[错误]${Font_suffix}$NAME 停止失败 !" + fi + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_status(){ + check_running + if [[ $? -eq 0 ]]; then + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME (PID ${PID}) 正在运行..." + else + echo -e "${Info_font_prefix}[信息]${Font_suffix} $NAME 未运行 !" + RETVAL=1 + fi +} +do_restart(){ + do_stop + do_start +} +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "使用方法: $0 { start | stop | restart | status }" + RETVAL=1 + ;; +esac +exit $RETVAL \ No newline at end of file diff --git a/socat.sh b/socat.sh new file mode 100644 index 0000000..f1fd266 --- /dev/null +++ b/socat.sh @@ -0,0 +1,359 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: Debian/Ubuntu +# Description: Socat +# Version: 1.0.5 +# Author: Toyo +# Blog: https://doub.io/wlzy-18/ +#================================================= + +sh_ver="1.0.5" +socat_file="/usr/bin/socat" +socat_log_file="/tmp/socat.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" && Error="${Red_font_prefix}[错误]${Font_color_suffix}" && Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +Save_iptables(){ + iptables-save > /etc/iptables.up.rules +} +Set_iptables(){ + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables +} +check_socat(){ + [[ ! -e ${socat_file} ]] && echo -e "${Error} 没有安装Socat,请检查 !" && exit 1 +} +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + #bit=`uname -m` +} +installSocat(){ + [[ -e ${socat_file} ]] && echo -e "${Error} 已经安装Socat,请检查 !" && exit 1 + apt-get update + apt-get install -y socat + Set_iptables + chmod +x /etc/rc.local + # echo "nameserver 8.8.8.8" > /etc/resolv.conf + # echo "nameserver 8.8.4.4" >> /etc/resolv.conf + socat_exist=`socat -h` + if [[ ! -e ${socat_file} ]]; then + echo -e "${Error} 安装Socat失败,请检查 !" && exit 1 + else + echo -e "${Info} Socat 安装完成 !" + fi +} +addSocat(){ +# 判断是否安装Socat + check_socat +# 设置本地监听端口 + while true + do + echo -e "请输入 Socat 的 本地监听端口 [1-65535]" + read -e -p "(默认端口: 23333):" Socatport + [[ -z "$Socatport" ]] && Socatport="23333" + echo $((${Socatport}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${Socatport} -ge 1 ]] && [[ ${Socatport} -le 65535 ]]; then + echo + echo "——————————————————————————————" + echo -e " 本地监听端口 : ${Red_background_prefix} ${Socatport} ${Font_color_suffix}" + echo "——————————————————————————————" + echo + break + else + echo -e "${Error} 请输入正确的数字 !" + fi + else + echo -e "${Error} 请输入正确的数字 !" + fi + done +# 设置欲转发端口 + while true + do + echo -e "请输入 Socat 远程被转发 端口 [1-65535]" + read -e -p "(默认端口: ${Socatport}):" Socatport1 + [[ -z "$Socatport1" ]] && Socatport1=${Socatport} + echo $((${Socatport1}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${Socatport1} -ge 1 ]] && [[ ${Socatport1} -le 65535 ]]; then + echo + echo "——————————————————————————————" + echo -e " 远程转发端口 : ${Red_background_prefix} ${Socatport1} ${Font_color_suffix}" + echo "——————————————————————————————" + echo + break + else + echo -e "${Error} 请输入正确的数字 !" + fi + else + echo -e "${Error} 请输入正确的数字 !" + fi + done +# 设置欲转发 IP + read -e -p "请输入 Socat 远程被转发 IP:" socatip + [[ -z "${socatip}" ]] && echo "取消..." && exit 1 + echo + echo "——————————————————————————————" + echo -e " 远程转发 IP : ${Red_background_prefix} ${socatip} ${Font_color_suffix}" + echo "——————————————————————————————" + echo +#设置 转发类型 + echo "请输入数字 来选择 Socat 转发类型:" + echo "1. TCP" + echo "2. UDP" + echo "3. TCP+UDP" + echo + read -e -p "(默认: TCP+UDP):" socattype_num + [[ -z "${socattype_num}" ]] && socattype_num="3" + if [[ ${socattype_num} = "1" ]]; then + socattype="TCP" + elif [[ ${socattype_num} = "2" ]]; then + socattype="UDP" + elif [[ ${socattype_num} = "3" ]]; then + socattype="TCP+UDP" + else + socattype="TCP+UDP" + fi +#最后确认 + echo + echo "——————————————————————————————" + echo " 请检查 Socat 配置是否有误 !" + echo + echo -e " 本地监听端口\t : ${Red_background_prefix} ${Socatport} ${Font_color_suffix}" + echo -e " 远程转发 IP\t : ${Red_background_prefix} ${socatip} ${Font_color_suffix}" + echo -e " 远程转发端口\t : ${Red_background_prefix} ${Socatport1} ${Font_color_suffix}" + echo -e " 转发类型\t : ${Red_background_prefix} ${socattype} ${Font_color_suffix}" + echo "——————————————————————————————" + echo + read -e -p "请按任意键继续,如有配置错误请使用 Ctrl+C 退出。" var + startSocat + # 获取IP + ip=`wget -qO- -t1 -T2 ipinfo.io/ip` + [[ -z $ip ]] && ip="ip" + clear + echo + echo "——————————————————————————————" + echo " Socat 已启动 !" + echo + echo -e " 本地监听 IP\t : ${Red_background_prefix} ${ip} ${Font_color_suffix}" + echo -e " 本地监听端口\t : ${Red_background_prefix} ${Socatport} ${Font_color_suffix}" + echo + echo -e " 远程转发 IP\t : ${Red_background_prefix} ${socatip} ${Font_color_suffix}" + echo -e " 远程转发端口\t : ${Red_background_prefix} ${Socatport1} ${Font_color_suffix}" + echo -e " 转发类型\t : ${Red_background_prefix} ${socattype} ${Font_color_suffix}" + echo "——————————————————————————————" + echo +} +startSocat(){ + if [[ ${socattype} = "TCP" ]]; then + runSocat "TCP4" + sleep 2s + PID=`ps -ef | grep "socat TCP4-LISTEN:${Socatport}" | grep -v grep | awk '{print $2}'` + [[ -z $PID ]] && echo -e "${Error} Socat TCP 启动失败 !" && exit 1 + addLocal "TCP4" + iptables -I INPUT -p tcp --dport ${Socatport} -j ACCEPT + elif [[ ${socattype} = "UDP" ]]; then + runSocat "UDP4" + sleep 2s + PID=`ps -ef | grep "socat UDP4-LISTEN:${Socatport}" | grep -v grep | awk '{print $2}'` + [[ -z $PID ]] && echo -e "${Error} Socat UDP 启动失败 !" && exit 1 + addLocal "UDP4" + iptables -I INPUT -p udp --dport ${Socatport} -j ACCEPT + elif [[ ${socattype} = "TCP+UDP" ]]; then + runSocat "TCP4" + runSocat "UDP4" + sleep 2s + PID=`ps -ef | grep "socat TCP4-LISTEN:${Socatport}" | grep -v grep | awk '{print $2}'` + PID1=`ps -ef | grep "socat UDP4-LISTEN:${Socatport}" | grep -v grep | awk '{print $2}'` + if [[ -z $PID ]]; then + echo -e "${Error} Socat TCP 启动失败 !" && exit 1 + else + [[ -z $PID1 ]] && echo -e "${Error} Socat TCP 启动成功,但 UDP 启动失败 !" + addLocal "TCP4" + addLocal "UDP4" + iptables -I INPUT -p tcp --dport ${Socatport} -j ACCEPT + iptables -I INPUT -p udp --dport ${Socatport} -j ACCEPT + fi + fi + Save_iptables +} +runSocat(){ + nohup socat $1-LISTEN:${Socatport},reuseaddr,fork $1:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 & +} +addLocal(){ + sed -i '/exit 0/d' /etc/rc.local + echo -e "nohup socat $1-LISTEN:${Socatport},reuseaddr,fork $1:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local + [[ ${release} == "debian" ]] && echo -e "exit 0" >> /etc/rc.local +} +# 查看Socat列表 +listSocat(){ +# 检查是否安装 + check_socat + socat_total=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | wc -l` + if [[ ${socat_total} = "0" ]]; then + echo -e "${Error} 没有发现 Socat 进程运行,请检查 !" && exit 1 + fi + socat_list_all="" + for((integer = 1; integer <= ${socat_total}; integer++)) + do + socat_all=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh"` + socat_type=`echo -e "${socat_all}" | awk '{print $9}' | sed -n "${integer}p" | cut -c 1-4` + socat_listen=`echo -e "${socat_all}" | awk '{print $9}' | sed -n "${integer}p" | sed -r 's/.*LISTEN:(.+),reuseaddr.*/\1/'` + socat_fork=`echo -e "${socat_all}" | awk '{print $10}' | sed -n "${integer}p" | cut -c 6-26` + socat_pid=`echo -e "${socat_all}" | awk '{print $2}' | sed -n "${integer}p"` + socat_list_all=${socat_list_all}"${Green_font_prefix}"${integer}". ${Font_color_suffix}进程PID: ${Red_font_prefix}"${socat_pid}"${Font_color_suffix} 类型: ${Red_font_prefix}"${socat_type}"${Font_color_suffix} 监听端口: ${Green_font_prefix}"${socat_listen}"${Font_color_suffix} 转发IP和端口: ${Green_font_prefix}"${socat_fork}"${Font_color_suffix}\n" + done + echo + echo -e "当前有${Green_background_prefix}" ${socat_total} "${Font_color_suffix}个Socat转发进程。" + echo -e ${socat_list_all} +} +delSocat(){ +# 检查是否安装 + check_socat +# 判断进程是否存在 + PID=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $2}'` + if [[ -z $PID ]]; then + echo -e "${Error} 没有发现 Socat 进程运行,请检查 !" && exit 1 + fi + + while true + do + # 列出 Socat + listSocat + read -e -p "请输入数字 来选择要终止的 Socat 进程:" stopsocat + [[ -z "${stopsocat}" ]] && stopsocat="0" + echo $((${stopsocat}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${stopsocat} -ge 1 ]] && [[ ${stopsocat} -le ${socat_total} ]]; then + # 删除开机启动 + socat_del_rc1=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $8}' | sed -n "${stopsocat}p"` + socat_del_rc2=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $9}' | sed -n "${stopsocat}p"` + socat_del_rc3=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $10}' | sed -n "${stopsocat}p"` + socat_del_rc4=${socat_del_rc1}" "${socat_del_rc2}" "${socat_del_rc3} + #echo ${socat_del_rc4} + sed -i "/${socat_del_rc4}/d" /etc/rc.local + # 删除防火墙规则 + socat_listen=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $9}' | sed -n "${stopsocat}p" | sed -r 's/.*LISTEN:(.+),reuseaddr.*/\1/'` + socat_type=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $9}' | sed -n "${stopsocat}p" | cut -c 1-4` + if [[ ${socat_type} = "TCP4" ]]; then + iptables -D INPUT -p tcp --dport ${socat_listen} -j ACCEPT + else + iptables -D INPUT -p udp --dport ${socat_listen} -j ACCEPT + fi + Save_iptables + socat_total=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | wc -l` + PID=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $2}' | sed -n "${stopsocat}p"` + kill -2 ${PID} + sleep 2s + socat_total1=$((${socat_total}-1)) + socat_total=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | wc -l` + if [[ ${socat_total} != ${socat_total1} ]]; then + echo -e "${Error} Socat 停止失败 !" && exit 1 + else + echo && echo " Socat 已停止 !" && echo + fi + break + else + echo -e "${Error} 请输入正确的数字 !" + fi + else + echo "取消..." && exit 1 + fi + done +} +# 查看日志 +tailSocat(){ + [[ ! -e ${socat_log_file} ]] && echo -e "${Error} Socat 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${socat_log_file}${Font_color_suffix} 命令。" && echo + tail -f ${socat_log_file} +} +uninstallSocat(){ + check_socat + echo "确定要卸载 Socat ? [y/N]" + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + PID=$(ps -ef | grep "socat" | grep -v grep | grep -v ".sh" |awk '{print $2}') + [[ ! -z "${PID}" ]] && kill -9 "${PID}" + apt-get remove --purge socat -y + sed -i "/socat/d" /etc/rc.local + [[ -e ${socat_file} ]] && echo -e "${Error} Socat 卸载失败,请检查 !" && exit 1 + echo && echo -e "${Info} Socat 已卸载 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/socat.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/socat.sh" && chmod +x socat.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && echo -e "${Error} 本脚本不支持当前系统 ${release} !" && exit 1 +echo && echo -e " SoCat 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/wlzy-18 -- + + ${Green_font_prefix}0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix}1.${Font_color_suffix} 安装 SoCat + ${Green_font_prefix}2.${Font_color_suffix} 卸载 SoCat +———————————— + ${Green_font_prefix}3.${Font_color_suffix} 新增 SoCat + ${Green_font_prefix}4.${Font_color_suffix} 删除 SoCat +———————————— + ${Green_font_prefix}5.${Font_color_suffix} 查看 SoCat 信息 + ${Green_font_prefix}6.${Font_color_suffix} 查看 SoCat 日志 +————————————" && echo +if [[ -e ${socat_file} ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix}" +else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-9]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + installSocat + ;; + 2) + uninstallSocat + ;; + 3) + addSocat + ;; + 4) + delSocat + ;; + 5) + listSocat + ;; + 6) + tailSocat + ;; + *) + echo "请输入正确数字 [0-6]" + ;; +esac \ No newline at end of file diff --git a/sources/163.sources.list b/sources/163.sources.list new file mode 100644 index 0000000..0feb785 --- /dev/null +++ b/sources/163.sources.list @@ -0,0 +1,8 @@ +deb http://mirrors.163.com/debian/ jessie main non-free contrib +deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib +deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib +deb-src http://mirrors.163.com/debian/ jessie main non-free contrib +deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib +deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib +deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib +deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib \ No newline at end of file diff --git a/sources/README.md b/sources/README.md new file mode 100644 index 0000000..7e41529 --- /dev/null +++ b/sources/README.md @@ -0,0 +1,50 @@ + +# 一些 Debian 系统软件包镜像源(sources) + +本页面是一些Debian系统的 apt-get 软件包镜像源(sources)。 +> 注意:本页面仅针对 Debian 7 / Debian 8 系统,Debian 9 请不要执行下面代码更换! + +---- + +目前很多服务器的Debian系统所使用的 apt-get 软件包镜像源都是上一个Debian发布的 apt-get 稳定源: **wheezy** 。 +而目前最新的稳定源是 **jessie** ,**wheezy** 已经是旧稳定源了,很多软件包的版本都很老,一些新的软件包也没有,所以建议更换为 新稳定源: **jessie** 。 + +### 一键更换: +假设你的服务器是美国,例如选择镜像源: `us.sources.list` 。 +如果是其他地区,请更换下面代码中的 `us.sources.list` 中的 `us` 。 +``` +mv /etc/apt/sources.list /etc/apt/sources.list.bak && wget -N --no-check-certificate -O "/etc/apt/sources.list" "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/sources/us.sources.list" +``` +上面代码的意思是,把原源文件重命名为 `sources.list.bak` ,然后下载新的源文件。 +如果下载失败,或者新的源文件使用有问题,可以通过这个命令恢复: +``` +rm -rf /etc/apt/sources.list && mv /etc/apt/sources.list.bak /etc/apt/sources.list +``` + +### 手动更换: +打开你的 apt-get 镜像源文件, +``` +vi /etc/apt/sources.list +``` +然后按 `I键` 进入编辑模式,如果你没有安装vim,也无法通过 `apt-get install vim -y` 安装,那么你就只能通过 *SFTP* 下载这个文件本地编辑了。 +``` +deb http://ftp.us.debian.org/debian/ jessie main +deb-src http://ftp.us.debian.org/debian/ jessie main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.us.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.us.debian.org/debian/ jessie-updates main contrib +``` +修改完毕之后,按 `ESC键` 退出编辑模式,然后输入 `:wq` (英文小写,包括引号)保存并退出,然后再试一试 `apt-get update` 是否正常。 + +### 其他问题: + +如果你在执行 `apt-get update` 时,提示类似以下信息: +``` +Media change:please insert the disc labeled‘Debian GNU/Linux X.x.x Wheezy — Official amd64 CD +``` +那么说明你的 apt-get 镜像源文件(sources)里面设置了需要插入CD的内容。 +解决方法很容易,用上面的一键更换,或者手动更换打开文件后,注释掉提示错误的那几行即可。 diff --git a/sources/aliyun.sources.list b/sources/aliyun.sources.list new file mode 100644 index 0000000..64829d5 --- /dev/null +++ b/sources/aliyun.sources.list @@ -0,0 +1,7 @@ +deb http://mirrors.aliyun.com/debian jessie main contrib non-free +deb-src http://mirrors.aliyun.com/debian jessie main contrib non-free +deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free +deb http://mirrors.aliyun.com/debian jessie-backports main contrib non-free +deb-src http://mirrors.aliyun.com/debian jessie-updates main contrib non-free +deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free +deb-src http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free \ No newline at end of file diff --git a/sources/ca.sources.list b/sources/ca.sources.list new file mode 100644 index 0000000..783be8b --- /dev/null +++ b/sources/ca.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.ca.debian.org/debian/ jessie main +deb-src http://ftp.ca.debian.org/debian/ jessie main +deb http://ftp.ca.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.ca.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.ca.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/cn.sources.list b/sources/cn.sources.list new file mode 100644 index 0000000..1b105cf --- /dev/null +++ b/sources/cn.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.cn.debian.org/debian/ jessie main +deb-src http://ftp.cn.debian.org/debian/ jessie main +deb http://ftp.cn.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.cn.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.cn.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/cn2.sources.list b/sources/cn2.sources.list new file mode 100644 index 0000000..7ec95b5 --- /dev/null +++ b/sources/cn2.sources.list @@ -0,0 +1,10 @@ +deb http://ftp2.cn.debian.org/debian/ jessie main +deb-src http://ftp2.cn.debian.org/debian/ jessie main +deb http://ftp2.cn.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp2.cn.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp2.cn.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/de.sources.list b/sources/de.sources.list new file mode 100644 index 0000000..e15b758 --- /dev/null +++ b/sources/de.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.de.debian.org/debian/ jessie main +deb-src http://ftp.de.debian.org/debian/ jessie main +deb http://ftp.de.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.de.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.de.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/fr.sources.list b/sources/fr.sources.list new file mode 100644 index 0000000..d78c191 --- /dev/null +++ b/sources/fr.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.fr.debian.org/debian/ jessie main +deb-src http://ftp.fr.debian.org/debian/ jessie main +deb http://ftp.fr.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.fr.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.fr.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/hk.sources.list b/sources/hk.sources.list new file mode 100644 index 0000000..fec473e --- /dev/null +++ b/sources/hk.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.hk.debian.org/debian/ jessie main +deb-src http://ftp.hk.debian.org/debian/ jessie main +deb http://ftp.hk.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.hk.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.hk.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/jp.sources.list b/sources/jp.sources.list new file mode 100644 index 0000000..5070888 --- /dev/null +++ b/sources/jp.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.jp.debian.org/debian/ jessie main +deb-src http://ftp.jp.debian.org/debian/ jessie main +deb http://ftp.jp.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.jp.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.jp.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/kr.sources.list b/sources/kr.sources.list new file mode 100644 index 0000000..a398d27 --- /dev/null +++ b/sources/kr.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.kr.debian.org/debian/ jessie main +deb-src http://ftp.kr.debian.org/debian/ jessie main +deb http://ftp.kr.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.kr.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.kr.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/ru.sources.list b/sources/ru.sources.list new file mode 100644 index 0000000..a347920 --- /dev/null +++ b/sources/ru.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.ru.debian.org/debian/ jessie main +deb-src http://ftp.ru.debian.org/debian/ jessie main +deb http://ftp.ru.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.ru.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.ru.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/sg.sources.list b/sources/sg.sources.list new file mode 100644 index 0000000..afc3f5c --- /dev/null +++ b/sources/sg.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.sg.debian.org/debian/ jessie main +deb-src http://ftp.sg.debian.org/debian/ jessie main +deb http://ftp.sg.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.sg.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.sg.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/uk.sources.list b/sources/uk.sources.list new file mode 100644 index 0000000..7d60e9a --- /dev/null +++ b/sources/uk.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.uk.debian.org/debian/ jessie main +deb-src http://ftp.uk.debian.org/debian/ jessie main +deb http://ftp.uk.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.uk.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.uk.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/us.sources.list b/sources/us.sources.list new file mode 100644 index 0000000..b4d6c93 --- /dev/null +++ b/sources/us.sources.list @@ -0,0 +1,10 @@ +deb http://ftp.us.debian.org/debian/ jessie main +deb-src http://ftp.us.debian.org/debian/ jessie main +deb http://ftp.us.debian.org/debian jessie-backports main + +deb http://security.debian.org/ jessie/updates main contrib +deb-src http://security.debian.org/ jessie/updates main contrib + +# jessie-updates, previously known as 'volatile' +deb http://ftp.us.debian.org/debian/ jessie-updates main contrib +deb-src http://ftp.us.debian.org/debian/ jessie-updates main contrib \ No newline at end of file diff --git a/sources/us.sources_stretch.list b/sources/us.sources_stretch.list new file mode 100644 index 0000000..76eda71 --- /dev/null +++ b/sources/us.sources_stretch.list @@ -0,0 +1,10 @@ +deb http://ftp.us.debian.org/debian/ stretch main +deb-src http://ftp.us.debian.org/debian/ stretch main +deb http://ftp.us.debian.org/debian jessie-backports main + +deb http://security.debian.org/ stretch/updates main contrib +deb-src http://security.debian.org/ stretch/updates main contrib + +# stretch-updates, previously known as 'volatile' +deb http://ftp.us.debian.org/debian/ stretch-updates main contrib +deb-src http://ftp.us.debian.org/debian/ stretch-updates main contrib \ No newline at end of file diff --git a/ss-go.sh b/ss-go.sh new file mode 100644 index 0000000..c7ec12e --- /dev/null +++ b/ss-go.sh @@ -0,0 +1,713 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: Shadowsocks Golang +# Version: 1.0.0 +# Author: Toyo +# Blog: https://doub.io/ss-jc67/ +#================================================= + +sh_ver="1.0.0" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +FOLDER="/usr/local/shadowsocks-go" +FILE="/usr/local/shadowsocks-go/shadowsocks-go" +CONF="/usr/local/shadowsocks-go/shadowsocks-go.conf" +LOG="/usr/local/shadowsocks-go/shadowsocks-go.log" +Now_ver_File="/usr/local/shadowsocks-go/ver.txt" +Crontab_file="/usr/bin/crontab" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${FILE} ]] && echo -e "${Error} Shadowsocks 没有安装,请检查 !" && exit 1 +} +check_crontab_installed_status(){ + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 没有安装,开始安装..." + if [[ ${release} == "centos" ]]; then + yum install crond -y + else + apt-get install cron -y + fi + if [[ ! -e ${Crontab_file} ]]; then + echo -e "${Error} Crontab 安装失败,请检查!" && exit 1 + else + echo -e "${Info} Crontab 安装成功!" + fi + fi +} +check_pid(){ + PID=$(ps -ef| grep "./shadowsocks-go "| grep -v "grep" | grep -v "init.d" |grep -v "service" |awk '{print $2}') +} +check_new_ver(){ + new_ver=$(wget -qO- https://api.github.com/repos/shadowsocks/go-shadowsocks2/releases| grep "tag_name"| head -n 1| awk -F ":" '{print $2}'| sed 's/\"//g;s/,//g;s/ //g') + [[ -z ${new_ver} ]] && echo -e "${Error} Shadowsocks 最新版本获取失败!" && exit 1 + echo -e "${Info} 检测到 Shadowsocks 最新版本为 [ ${new_ver} ]" +} +check_ver_comparison(){ + now_ver=$(cat ${Now_ver_File}) + if [[ "${now_ver}" != "${new_ver}" ]]; then + echo -e "${Info} 发现 Shadowsocks 已有新版本 [ ${new_ver} ],旧版本 [ ${now_ver} ]" + read -e -p "是否更新 ? [Y/n] :" yn + [[ -z "${yn}" ]] && yn="y" + if [[ $yn == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + \cp "${CONF}" "/tmp/shadowsocks-go.conf" + rm -rf ${FOLDER} + Download + mv "/tmp/shadowsocks-go.conf" "${CONF}" + Start + fi + else + echo -e "${Info} 当前 Shadowsocks 已是最新版本 [ ${new_ver} ]" && exit 1 + fi +} +Download(){ + if [[ ! -e "${FOLDER}" ]]; then + mkdir "${FOLDER}" + else + [[ -e "${FILE}" ]] && rm -rf "${FILE}" + fi + cd "${FOLDER}" + if [[ ${bit} == "x86_64" ]]; then + wget --no-check-certificate -N "https://github.com/shadowsocks/go-shadowsocks2/releases/download/${new_ver}/shadowsocks2-linux.gz" + else + echo -e "${Error} Shadowsocks-Go版目前不支持 非64位 构架的服务器安装,请更换系统 !" && rm -rf "${FOLDER}" && exit 1 + fi + [[ ! -e "shadowsocks2-linux.gz" ]] && echo -e "${Error} Shadowsocks 压缩包下载失败 !" && rm -rf "${FOLDER}" && exit 1 + gzip -d "shadowsocks2-linux.gz" + [[ ! -e "shadowsocks2-linux" ]] && echo -e "${Error} Shadowsocks 压缩包解压失败 !" && rm -rf "${FOLDER}" && exit 1 + mv "shadowsocks2-linux" "shadowsocks-go" + [[ ! -e "shadowsocks-go" ]] && echo -e "${Error} Shadowsocks 重命名失败 !" && rm -rf "${FOLDER}" && exit 1 + chmod +x shadowsocks-go + echo "${new_ver}" > ${Now_ver_File} +} +Service(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/ss_go_centos" -O /etc/init.d/ss-go; then + echo -e "${Error} Shadowsocks 服务管理脚本下载失败 !" + rm -rf "${FOLDER}" + exit 1 + fi + chmod +x "/etc/init.d/ss-go" + chkconfig --add ss-go + chkconfig ss-go on + else + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/ss_go_debian" -O /etc/init.d/ss-go; then + echo -e "${Error} Shadowsocks 服务管理脚本下载失败 !" + rm -rf "${FOLDER}" + exit 1 + fi + chmod +x "/etc/init.d/ss-go" + update-rc.d -f ss-go defaults + fi + echo -e "${Info} Shadowsocks 服务管理脚本下载完成 !" +} +Installation_dependency(){ + gzip_ver=$(gzip -V) + if [[ -z ${gzip_ver} ]]; then + if [[ ${release} == "centos" ]]; then + yum update + yum install -y gzip + else + apt-get update + apt-get install -y gzip + fi + fi + \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +} +Write_config(){ + cat > ${CONF}<<-EOF +PORT = ${ss_port} +PASSWORD = ${ss_password} +CIPHER = ${ss_cipher} +VERBOSE = ${ss_verbose} +EOF +} +Read_config(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} Shadowsocks 配置文件不存在 !" && exit 1 + port=$(cat ${CONF}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + password=$(cat ${CONF}|grep 'PASSWORD = '|awk -F 'PASSWORD = ' '{print $NF}') + cipher=$(cat ${CONF}|grep 'CIPHER = '|awk -F 'CIPHER = ' '{print $NF}') + verbose=$(cat ${CONF}|grep 'VERBOSE = '|awk -F 'VERBOSE = ' '{print $NF}') +} +Set_port(){ + while true + do + echo -e "请输入 Shadowsocks 端口 [1-65535]" + read -e -p "(默认: 443):" ss_port + [[ -z "${ss_port}" ]] && ss_port="443" + echo $((${ss_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ss_port} -ge 1 ]] && [[ ${ss_port} -le 65535 ]]; then + echo && echo "========================" + echo -e " 端口 : ${Red_background_prefix} ${ss_port} ${Font_color_suffix}" + echo "========================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_password(){ + echo "请输入 Shadowsocks 密码 [0-9][a-z][A-Z]" + read -e -p "(默认: 随机生成):" ss_password + [[ -z "${ss_password}" ]] && ss_password=$(date +%s%N | md5sum | head -c 16) + echo && echo "========================" + echo -e " 密码 : ${Red_background_prefix} ${ss_password} ${Font_color_suffix}" + echo "========================" && echo +} +Set_cipher(){ + echo -e "请选择 Shadowsocks 加密方式 + + ${Green_font_prefix} 1.${Font_color_suffix} aes-128-cfb + ${Green_font_prefix} 2.${Font_color_suffix} aes-128-ctr + ${Green_font_prefix} 3.${Font_color_suffix} aes-192-cfb + ${Green_font_prefix} 4.${Font_color_suffix} aes-192-ctr + ${Green_font_prefix} 5.${Font_color_suffix} aes-256-cfb + ${Green_font_prefix} 6.${Font_color_suffix} aes-256-ctr + ${Green_font_prefix} 7.${Font_color_suffix} chacha20-ietf + ${Green_font_prefix} 8.${Font_color_suffix} xchacha20 + ${Green_font_prefix} 9.${Font_color_suffix} aes-128-gcm (AEAD) + ${Green_font_prefix}10.${Font_color_suffix} aes-192-gcm (AEAD) + ${Green_font_prefix}11.${Font_color_suffix} aes-256-gcm (AEAD) + ${Green_font_prefix}12.${Font_color_suffix} chacha20-ietf-poly1305 (AEAD) + + ${Tip} chacha20 系列加密方式无需额外安装 libsodium,Shadowsocks Go版默认集成 !" && echo + read -e -p "(默认: 12. chacha20-ietf-poly1305):" ss_cipher + [[ -z "${ss_cipher}" ]] && ss_cipher="12" + if [[ ${ss_cipher} == "1" ]]; then + ss_cipher="aes-128-cfb" + elif [[ ${ss_cipher} == "2" ]]; then + ss_cipher="aes-128-ctr" + elif [[ ${ss_cipher} == "3" ]]; then + ss_cipher="aes-192-cfb" + elif [[ ${ss_cipher} == "4" ]]; then + ss_cipher="aes-192-ctr" + elif [[ ${ss_cipher} == "5" ]]; then + ss_cipher="aes-256-cfb" + elif [[ ${ss_cipher} == "6" ]]; then + ss_cipher="aes-256-ctr" + elif [[ ${ss_cipher} == "7" ]]; then + ss_cipher="chacha20-ietf" + elif [[ ${ss_cipher} == "8" ]]; then + ss_cipher="xchacha20" + elif [[ ${ss_cipher} == "9" ]]; then + ss_cipher="aead_aes_128_gcm" + elif [[ ${ss_cipher} == "10" ]]; then + ss_cipher="aead_aes_192_gcm" + elif [[ ${ss_cipher} == "11" ]]; then + ss_cipher="aead_aes_256_gcm" + elif [[ ${ss_cipher} == "12" ]]; then + ss_cipher="aead_chacha20_poly1305" + else + ss_cipher="aead_chacha20_poly1305" + fi + echo && echo "========================" + echo -e " 加密 : ${Red_background_prefix} ${ss_cipher} ${Font_color_suffix}" + echo "========================" && echo +} +Set_verbose(){ + echo -e "是否启用详细日志模式?[Y/n] +启用详细日志模式就可以在日志中看到链接者信息(链接时间、链接代理端口、链接者IP、链接者访问的目标域名或IP这些非敏感类信息)。" + read -e -p "(默认:N 禁用):" ss_verbose + [[ -z "${ss_verbose}" ]] && ss_verbose="N" + if [[ "${ss_verbose}" == [Yy] ]]; then + ss_verbose="YES" + else + ss_verbose="NO" + fi + echo && echo "========================" + echo -e " 详细日志模式 : ${Red_background_prefix} ${ss_verbose} ${Font_color_suffix}" + echo "========================" && echo +} +Set(){ + check_installed_status + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 修改 端口配置 + ${Green_font_prefix}2.${Font_color_suffix} 修改 密码配置 + ${Green_font_prefix}3.${Font_color_suffix} 修改 加密配置 + ${Green_font_prefix}4.${Font_color_suffix} 修改 详细日志模式 配置 + ${Green_font_prefix}5.${Font_color_suffix} 修改 全部配置 +———————————————— + ${Green_font_prefix}6.${Font_color_suffix} 监控 运行状态" && echo + read -e -p "(默认: 取消):" ss_modify + [[ -z "${ss_modify}" ]] && echo "已取消..." && exit 1 + if [[ "${ss_modify}" == "1" ]]; then + Read_config + Set_port + ss_password=${password} + ss_cipher=${cipher} + ss_verbose=${verbose} + Write_config + Del_iptables + Add_iptables + Restart + elif [[ "${ss_modify}" == "2" ]]; then + Read_config + Set_password + ss_port=${port} + ss_cipher=${cipher} + ss_verbose=${verbose} + Write_config + Restart + elif [[ "${ss_modify}" == "3" ]]; then + Read_config + Set_cipher + ss_port=${port} + ss_password=${password} + ss_verbose=${verbose} + Write_config + Restart + elif [[ "${ss_modify}" == "4" ]]; then + Read_config + Set_verbose + ss_port=${port} + ss_password=${password} + ss_cipher=${cipher} + Write_config + Restart + elif [[ "${ss_modify}" == "5" ]]; then + Read_config + Set_port + Set_password + Set_cipher + Set_verbose + Write_config + Restart + elif [[ "${ss_modify}" == "6" ]]; then + Set_crontab_monitor + else + echo -e "${Error} 请输入正确的数字(1-6)" && exit 1 + fi +} +Install(){ + check_root + [[ -e ${FILE} ]] && echo -e "${Error} 检测到 Shadowsocks 已安装 !" && exit 1 + echo -e "${Info} 开始设置 用户配置..." + Set_port + Set_password + Set_cipher + Set_verbose + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装..." + check_new_ver + Download + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service + echo -e "${Info} 开始写入 配置文件..." + Write_config + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start +} +Start(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} Shadowsocks 正在运行,请检查 !" && exit 1 + /etc/init.d/ss-go start + #sleep 1s + check_pid + [[ ! -z ${PID} ]] && View +} +Stop(){ + check_installed_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} Shadowsocks 没有运行,请检查 !" && exit 1 + /etc/init.d/ss-go stop +} +Restart(){ + check_installed_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/ss-go stop + /etc/init.d/ss-go start + #sleep 1s + check_pid + [[ ! -z ${PID} ]] && View +} +Update(){ + check_installed_status + check_new_ver + check_ver_comparison +} +Uninstall(){ + check_installed_status + echo "确定要卸载 Shadowsocks ? (y/N)" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z $PID ]] && kill -9 ${PID} + if [[ -e ${CONF} ]]; then + port=$(cat ${CONF}|grep 'PORT = '|awk -F 'PORT = ' '{print $NF}') + Del_iptables + Save_iptables + fi + if [[ ! -z $(crontab -l | grep "ss-go.sh monitor") ]]; then + crontab_monitor_cron_stop + fi + rm -rf "${FOLDER}" + if [[ ${release} = "centos" ]]; then + chkconfig --del ss-go + else + update-rc.d -f ss-go remove + fi + rm -rf "/etc/init.d/ss-go" + echo && echo "Shadowsocks 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +getipv4(){ + ipv4=$(wget -qO- -4 -t1 -T2 ipinfo.io/ip) + if [[ -z "${ipv4}" ]]; then + ipv4=$(wget -qO- -4 -t1 -T2 api.ip.sb/ip) + if [[ -z "${ipv4}" ]]; then + ipv4=$(wget -qO- -4 -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ipv4}" ]]; then + ipv4="IPv4_Error" + fi + fi + fi +} +getipv6(){ + ipv6=$(wget -qO- -6 -t1 -T2 ifconfig.co) + if [[ -z "${ipv6}" ]]; then + ipv6="IPv6_Error" + fi +} +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g;s/+/-/g;s/\//_/g') + echo -e "${date}" +} +ss_link_qr(){ + if [[ "${ipv4}" != "IPv4_Error" ]]; then + if [[ "${cipher}" == "aead_chacha20_poly1305" ]]; then + cipher_1="chacha20-ietf-poly1305" + else + cipher_1=$(echo "${cipher}"|sed 's/aead_//g;s/_/-/g') + fi + SSbase64=$(urlsafe_base64 "${cipher_1}:${password}@${ipv4}:${port}") + SSurl="ss://${SSbase64}" + SSQRcode="http://doub.pw/qr/qr.php?text=${SSurl}" + ss_link_ipv4=" 链接 [ipv4] : ${Red_font_prefix}${SSurl}${Font_color_suffix} \n 二维码[ipv4] : ${Red_font_prefix}${SSQRcode}${Font_color_suffix}" + fi + if [[ "${ipv6}" != "IPv6_Error" ]]; then + if [[ "${cipher}" == "aead_chacha20_poly1305" ]]; then + cipher_1="chacha20-ietf-poly1305" + else + cipher_1=$(echo "${cipher}"|sed 's/aead_//g;s/_/-/g') + fi + SSbase64=$(urlsafe_base64 "${cipher_1}:${password}@${ipv6}:${port}") + SSurl="ss://${SSbase64}" + SSQRcode="http://doub.pw/qr/qr.php?text=${SSurl}" + ss_link_ipv6=" 链接 [ipv6] : ${Red_font_prefix}${SSurl}${Font_color_suffix} \n 二维码[ipv6] : ${Red_font_prefix}${SSQRcode}${Font_color_suffix}" + fi +} +View(){ + check_installed_status + Read_config + getipv4 + getipv6 + ss_link_qr + if [[ "${cipher}" == "aead_chacha20_poly1305" ]]; then + cipher_2="chacha20-ietf-poly1305" + else + cipher_2=$(echo "${cipher}"|sed 's/aead_//g;s/_/-/g') + fi + clear && echo + echo -e "Shadowsocks 用户配置:" + echo -e "————————————————" + [[ "${ipv4}" != "IPv4_Error" ]] && echo -e " 地址\t: ${Green_font_prefix}${ipv4}${Font_color_suffix}" + [[ "${ipv6}" != "IPv6_Error" ]] && echo -e " 地址\t: ${Green_font_prefix}${ipv6}${Font_color_suffix}" + echo -e " 端口\t: ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " 密码\t: ${Green_font_prefix}${password}${Font_color_suffix}" + echo -e " 加密\t: ${Green_font_prefix}${cipher_2}${Font_color_suffix}" + [[ ! -z "${ss_link_ipv4}" ]] && echo -e "${ss_link_ipv4}" + [[ ! -z "${ss_link_ipv6}" ]] && echo -e "${ss_link_ipv6}" + echo + echo -e " 详细日志模式\t: ${Green_font_prefix}${verbose}${Font_color_suffix}" + echo +} +View_Log(){ + check_installed_status + [[ ! -e ${LOG} ]] && echo -e "${Error} Shadowsocks 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" + echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${LOG}${Font_color_suffix} 命令。" + echo -e "如果想要查看详细日志,请在 [7.设置 账号配置 - 4.修改 详细日志模式 配置] 开启。" && echo + tail -f ${LOG} +} +# 显示 连接信息 +View_user_connection_info_1(){ + format_1=$1 + Read_config + user_IP=$(ss state connected sport = :${port} -tn|sed '1d'|awk '{print $NF}'|awk -F ':' '{print $(NF-1)}'|sort -u) + if [[ -z ${user_IP} ]]; then + user_IP_total="0" + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + else + user_IP_total=$(echo -e "${user_IP}"|wc -l) + if [[ ${format_1} == "IP_address" ]]; then + echo -e "端口: ${Green_font_prefix}"${port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: " + get_IP_address + echo + else + user_IP=$(echo -e "\n${user_IP}") + echo -e "端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + fi + fi + user_IP="" +} +View_user_connection_info(){ + check_installed_status + echo && echo -e "请选择要显示的格式: + ${Green_font_prefix}1.${Font_color_suffix} 显示 IP 格式 + ${Green_font_prefix}2.${Font_color_suffix} 显示 IP+IP归属地 格式" && echo + read -e -p "(默认: 1):" connection_info + [[ -z "${connection_info}" ]] && connection_info="1" + if [[ "${connection_info}" == "1" ]]; then + View_user_connection_info_1 + elif [[ "${connection_info}" == "2" ]]; then + echo -e "${Tip} 检测IP归属地(ipip.net),如果IP较多,可能时间会比较长..." + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} 请输入正确的数字(1-2)" && exit 1 + fi +} +get_IP_address(){ + if [[ ! -z ${user_IP} ]]; then + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=$(echo "${user_IP}" |sed -n "$integer_1"p) + IP_address=$(wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g') + echo -e "${Green_font_prefix}${IP}${Font_color_suffix} (${IP_address})" + sleep 1s + done + fi +} +Set_crontab_monitor(){ + check_crontab_installed_status + crontab_monitor_status=$(crontab -l|grep "ss-go.sh monitor") + if [[ -z "${crontab_monitor_status}" ]]; then + echo && echo -e "当前监控模式: ${Red_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启 ${Green_font_prefix}Shadowsocks 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 Shadowsocks 服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_status_ny + [[ -z "${crontab_monitor_status_ny}" ]] && crontab_monitor_status_ny="y" + if [[ ${crontab_monitor_status_ny} == [Yy] ]]; then + crontab_monitor_cron_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭 ${Red_font_prefix}Shadowsocks 服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动 Shadowsocks 服务端)[y/N]" + read -e -p "(默认: n):" crontab_monitor_status_ny + [[ -z "${crontab_monitor_status_ny}" ]] && crontab_monitor_status_ny="n" + if [[ ${crontab_monitor_status_ny} == [Yy] ]]; then + crontab_monitor_cron_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_cron_start(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/ss-go.sh monitor/d" "$file_1/crontab.bak" + echo -e "\n* * * * * /bin/bash $file_1/ss-go.sh monitor" >> "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "ss-go.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Shadowsocks 服务端运行状态监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} Shadowsocks 服务端运行状态监控功能 启动成功 !" + fi +} +crontab_monitor_cron_stop(){ + crontab -l > "$file_1/crontab.bak" + sed -i "/ss-go.sh monitor/d" "$file_1/crontab.bak" + crontab "$file_1/crontab.bak" + rm -r "$file_1/crontab.bak" + cron_config=$(crontab -l | grep "ss-go.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Shadowsocks 服务端运行状态监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} Shadowsocks 服务端运行状态监控功能 停止成功 !" + fi +} +crontab_monitor(){ + check_installed_status + check_pid + #echo "${PID}" + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 Shadowsocks服务端 未运行 , 开始启动..." | tee -a ${LOG} + /etc/init.d/ss-go start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Shadowsocks服务端 启动失败..." | tee -a ${LOG} + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Shadowsocks服务端 启动成功..." | tee -a ${LOG} + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Shadowsocks服务端 进程运行正常..." | tee -a ${LOG} + fi +} +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ss_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ss_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ss_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m udp -p udp --dport ${ss_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + chkconfig --level 2345 iptables on + chkconfig --level 2345 ip6tables on + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules\n/sbin/ip6tables-restore < /etc/ip6tables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ss-go.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/ss-go" ]]; then + rm -rf /etc/init.d/ss-go + Service + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ss-go.sh" && chmod +x ss-go.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +action=$1 +if [[ "${action}" == "monitor" ]]; then + crontab_monitor +else + echo && echo -e " Shadowsocks-Go 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/ss-jc67 ---- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 Shadowsocks + ${Green_font_prefix} 2.${Font_color_suffix} 更新 Shadowsocks + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 Shadowsocks +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 Shadowsocks + ${Green_font_prefix} 5.${Font_color_suffix} 停止 Shadowsocks + ${Green_font_prefix} 6.${Font_color_suffix} 重启 Shadowsocks +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 账号配置 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 账号信息 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 日志信息 + ${Green_font_prefix}10.${Font_color_suffix} 查看 链接信息 +————————————" && echo + if [[ -e ${FILE} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi + else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" + fi + echo + read -e -p " 请输入数字 [0-10]:" num + case "$num" in + 0) + Update_Shell + ;; + 1) + Install + ;; + 2) + Update + ;; + 3) + Uninstall + ;; + 4) + Start + ;; + 5) + Stop + ;; + 6) + Restart + ;; + 7) + Set + ;; + 8) + View + ;; + 9) + View_Log + ;; + 10) + View_user_connection_info + ;; + *) + echo "请输入正确数字 [0-10]" + ;; + esac +fi \ No newline at end of file diff --git a/ssh_port.sh b/ssh_port.sh new file mode 100644 index 0000000..dda0c79 --- /dev/null +++ b/ssh_port.sh @@ -0,0 +1,217 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: Debian/Ubuntu +# Description: SSH modify port +# Version: 1.0.0 +# Author: Toyo +# Blog: https://doub.io/linux-jc11/ +#================================================= + +sh_ver="1.0.0" +CONF="/etc/ssh/sshd_config" +SSH_init_1="/etc/init.d/ssh" +SSH_init_2="/etc/init.d/sshd" +if [[ -e ${SSH_init_1} ]]; then + SSH_init=${SSH_init_1} +elif [[ -e ${SSH_init_2} ]]; then + SSH_init=${SSH_init_2} +else + echo -e "${Error} 找不到 SSH 的服务脚本文件!" && exit 1 +fi +bak_text="(可通过备份SSH配置文件复原:[ ${Green_font_prefix}rm -rf /etc/ssh/sshd_config && mv /etc/ssh/sshd_config.bak /etc/ssh/sshd_config && ${SSH_init} restart${Font_color_suffix} ])" +over_text="${Tip} 当服务器存在外部防火墙时(如 阿里云、腾讯云、微软云、谷歌云、亚马逊云等),需要外部防火墙开放 新SSH端口TCP协议方可连接!(如使用途中出现任何问题均可通过该代码复原:[ ${Green_font_prefix}rm -rf /etc/ssh/sshd_config && mv /etc/ssh/sshd_config.bak /etc/ssh/sshd_config && ${SSH_init} restart${Font_color_suffix} ] )" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" && Error="${Red_font_prefix}[错误]${Font_color_suffix}" && Tip="${Green_font_prefix}[注意]${Font_color_suffix}" +filepath=$(cd "$(dirname "$0")"; pwd) +file=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') + +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + #bit=`uname -m` +} +check_installed_status(){ + [[ ! -e ${CONF} ]] && echo -e "${Error} SSH配置文件不存在[ ${CONF} ],请检查 !" && exit 1 +} +check_pid(){ + PID=$(ps -ef| grep '/usr/sbin/sshd'| grep -v grep| awk '{print $2}') +} +Read_config(){ + port_all=$(cat ${CONF}|grep -v '#'|grep "Port "|awk '{print $2}') + if [[ -z ${port_all} ]]; then + port=22 + else + port=${port_all} + fi +} +Set_port(){ + while true + do + echo -e "\n旧SSH端口:${Green_font_prefix}[${port}]${Font_color_suffix}" + echo -e "请输入新的SSH端口 [1-65535]" + read -e -p "(输入为空则取消):" new_port + [[ -z "${new_port}" ]] && echo "取消..." && exit 1 + echo $((${new_port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${new_port} -ge 1 ]] && [[ ${new_port} -le 65535 ]]; then + if [[ ${new_port} == ${port} ]]; then + echo -e "输入错误, 新端口与旧端口一致。" + else + echo && echo "=============================" + echo -e " 新端口 : ${Red_background_prefix} ${new_port} ${Font_color_suffix}" + echo "=============================" && echo + break + fi + else + echo -e "输入错误, 请输入正确的端口。" + fi + else + echo -e "输入错误, 请输入正确的端口。" + fi + done +} +choose_the_way(){ + echo -e "请选择SSH端口修改方式: + 1. 直接修改(直接修改旧端口为新端口,并且防火墙禁止旧端口 开放新端口) + 2. 保守修改(不删除旧端口,先添加新端口,然后手动断开SSH链接并使用新端口尝试链接,如果链接正常,那么再次执行脚本删除旧端口配置)\n + 一般来说修改SSH端口不会出现什么问题,但保守起见,我做了两个修改方式。 + 如果不懂请选 ${Green_font_prefix}[2. 保守修改]${Font_color_suffix},避免因为未知问题而导致修改后无法通过 新端口和旧端口 链接服务器!\n + ${over_text}\n" + read -e -p "(默认: 2. 保守修改):" choose_the_way_num + [[ -z "${choose_the_way_num}" ]] && choose_the_way_num="2" + if [[ ${choose_the_way_num} == "1" ]]; then + cp -f "${CONF}" "/etc/ssh/sshd_config.bak" + Direct_modification + elif [[ ${choose_the_way_num} == "2" ]]; then + cp -f "${CONF}" "/etc/ssh/sshd_config.bak" + Conservative_modifications + else + echo -e "${Error} 请输入正确的数字 [1-2]" && exit 1 + fi +} +Direct_modification(){ + echo -e "${Info} 删除旧端口配置..." + sed -i "/Port ${port}/d" "${CONF}" + echo -e "${Info} 添加新端口配置..." + echo -e "\nPort ${new_port}" >> "${CONF}" + ${SSH_init} restart + sleep 2s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} SSH 启动失败 !${bak_text}" && exit 1 + else + port_status=$(netstat -lntp|grep ssh|awk '{print $4}'|grep -w "${new_port}") + if [[ -z ${port_status} ]]; then + echo -e "${Error} SSH 端口修改失败 !${bak_text}" && exit 1 + else + Del_iptables_ACCEPT + Del_iptables_DROP + Add_iptables_ACCEPT + Add_iptables_DROP + Set_iptables + #rm -rf /etc/ssh/sshd_config.bak + echo -e "${Info} SSH 端口修改成功!新端口:[${Green_font_prefix}${new_port}${Font_color_suffix}]" + echo -e "${over_text}" + fi + fi +} +Conservative_modifications(){ + if [[ $1 != "End" ]]; then + echo -e "${Info} 添加新端口配置..." + echo -e "\nPort ${new_port}" >> "${CONF}" + ${SSH_init} restart + sleep 2s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} SSH 启动失败 !${bak_text}" && exit 1 + else + port_status=$(netstat -lntp|grep ssh|awk '{print $4}'|grep -w "${new_port}") + if [[ -z ${port_status} ]]; then + echo -e "${Error} SSH 端口添加失败 !${bak_text}" && exit 1 + else + Add_iptables_ACCEPT + Set_iptables + echo "${new_port}|${port}" > "${file}/ssh_port.conf" + echo -e "${Info} SSH 端口添加成功 ! +请手动断开 SSH链接并使用新端口 ${Green_font_prefix}[${new_port}]${Font_color_suffix} 尝试链接,如无法链接 请通过旧端口 ${Green_font_prefix}[${port}]${Font_color_suffix} 链接,如链接正常 请链接后再次执行脚本${Green_font_prefix} [bash ${file}/ssh_port.sh end]${Font_color_suffix} 以删除旧端口配置!" + echo -e "${over_text}" + fi + fi + else + [[ ! -e "${file}/ssh_port.conf" ]] && echo -e "${Error} ${file}/ssh_port.conf 文件缺失 !" && exit 1 + new_port=$(cat "${file}/ssh_port.conf"|awk -F '|' '{print $1}') + port=$(cat "${file}/ssh_port.conf"|awk -F '|' '{print $2}') + rm -rf "${file}/ssh_port.conf" + echo -e "${Info} 删除旧端口配置..." + sed -i "/Port ${port}/d" "${CONF}" + ${SSH_init} restart + sleep 2s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} SSH 启动失败 !" && exit 1 + else + Add_iptables_DROP + Set_iptables + #rm -rf /etc/ssh/sshd_config.bak + echo -e "${Info} 所有配置完成!新端口:[${Green_font_prefix}${new_port}${Font_color_suffix}]" + echo -e "${over_text}" + fi + fi +} +modify_ssh(){ + Read_config + Set_port + choose_the_way +} +end_ssh(){ + Conservative_modifications "End" +} +Add_iptables_ACCEPT(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${new_port} -j ACCEPT +} +Del_iptables_ACCEPT(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT +} +Add_iptables_DROP(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j DROP +} +Del_iptables_DROP(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${new_port} -j DROP +} +Set_iptables(){ + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && echo -e "${Error} 本脚本不支持当前系统 ${release} !" && exit 1 +check_installed_status +action=$1 +[[ -z $1 ]] && action=modify +case "$action" in + modify|end) + ${action}_ssh + ;; + *) + echo "输入错误 !" + echo "用法: {modify|end}" + ;; +esac \ No newline at end of file diff --git a/ssr.sh b/ssr.sh new file mode 100644 index 0000000..28bd119 --- /dev/null +++ b/ssr.sh @@ -0,0 +1,1526 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS 6+/Debian 6+/Ubuntu 14.04+ +# Description: Install the ShadowsocksR server +# Version: 2.0.38 +# Author: Toyo +# Blog: https://doub.io/ss-jc42/ +#================================================= + +sh_ver="2.0.38" +filepath=$(cd "$(dirname "$0")"; pwd) +file=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +ssr_folder="/usr/local/shadowsocksr" +ssr_ss_file="${ssr_folder}/shadowsocks" +config_file="${ssr_folder}/config.json" +config_folder="/etc/shadowsocksr" +config_user_file="${config_folder}/user-config.json" +ssr_log_file="${ssr_ss_file}/ssserver.log" +Libsodiumr_file="/usr/local/lib/libsodium.so" +Libsodiumr_ver_backup="1.0.13" +Server_Speeder_file="/serverspeeder/bin/serverSpeeder.sh" +LotServer_file="/appex/bin/serverSpeeder.sh" +BBR_file="${file}/bbr.sh" +jq_file="${ssr_folder}/jq" +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" +Separator_1="——————————————————————————————" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前账号非ROOT(或没有ROOT权限),无法继续操作,请使用${Green_background_prefix} sudo su ${Font_color_suffix}来获取临时ROOT权限(执行后会提示输入当前账号的密码)。" && exit 1 +} +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_pid(){ + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` +} +SSR_installation_status(){ + [[ ! -e ${config_user_file} ]] && echo -e "${Error} 没有发现 ShadowsocksR 配置文件,请检查 !" && exit 1 + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} 没有发现 ShadowsocksR 文件夹,请检查 !" && exit 1 +} +Server_Speeder_installation_status(){ + [[ ! -e ${Server_Speeder_file} ]] && echo -e "${Error} 没有安装 锐速(Server Speeder),请检查 !" && exit 1 +} +LotServer_installation_status(){ + [[ ! -e ${LotServer_file} ]] && echo -e "${Error} 没有安装 LotServer,请检查 !" && exit 1 +} +BBR_installation_status(){ + if [[ ! -e ${BBR_file} ]]; then + echo -e "${Error} 没有发现 BBR脚本,开始下载..." + cd "${file}" + if ! wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/bbr.sh; then + echo -e "${Error} BBR 脚本下载失败 !" && exit 1 + else + echo -e "${Info} BBR 脚本下载完成 !" + chmod +x bbr.sh + fi + fi +} +# 设置 防火墙规则 +Add_iptables(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT +} +Del_iptables(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + chkconfig --level 2345 iptables on + chkconfig --level 2345 ip6tables on + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules\n/sbin/ip6tables-restore < /etc/ip6tables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +# 读取 配置信息 +Get_IP(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi +} +Get_User(){ + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ解析器 不存在,请检查 !" && exit 1 + port=`${jq_file} '.server_port' ${config_user_file}` + password=`${jq_file} '.password' ${config_user_file} | sed 's/^.//;s/.$//'` + method=`${jq_file} '.method' ${config_user_file} | sed 's/^.//;s/.$//'` + protocol=`${jq_file} '.protocol' ${config_user_file} | sed 's/^.//;s/.$//'` + obfs=`${jq_file} '.obfs' ${config_user_file} | sed 's/^.//;s/.$//'` + protocol_param=`${jq_file} '.protocol_param' ${config_user_file} | sed 's/^.//;s/.$//'` + speed_limit_per_con=`${jq_file} '.speed_limit_per_con' ${config_user_file}` + speed_limit_per_user=`${jq_file} '.speed_limit_per_user' ${config_user_file}` + connect_verbose_info=`${jq_file} '.connect_verbose_info' ${config_user_file}` +} +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g;s/+/-/g;s/\//_/g') + echo -e "${date}" +} +ss_link_qr(){ + SSbase64=$(urlsafe_base64 "${method}:${password}@${ip}:${port}") + SSurl="ss://${SSbase64}" + SSQRcode="http://doub.pw/qr/qr.php?text=${SSurl}" + ss_link=" SS 链接 : ${Green_font_prefix}${SSurl}${Font_color_suffix} \n SS 二维码 : ${Green_font_prefix}${SSQRcode}${Font_color_suffix}" +} +ssr_link_qr(){ + SSRprotocol=$(echo ${protocol} | sed 's/_compatible//g') + SSRobfs=$(echo ${obfs} | sed 's/_compatible//g') + SSRPWDbase64=$(urlsafe_base64 "${password}") + SSRbase64=$(urlsafe_base64 "${ip}:${port}:${SSRprotocol}:${method}:${SSRobfs}:${SSRPWDbase64}") + SSRurl="ssr://${SSRbase64}" + SSRQRcode="http://doub.pw/qr/qr.php?text=${SSRurl}" + ssr_link=" SSR 链接 : ${Red_font_prefix}${SSRurl}${Font_color_suffix} \n SSR 二维码 : ${Red_font_prefix}${SSRQRcode}${Font_color_suffix} \n " +} +ss_ssr_determine(){ + protocol_suffix=`echo ${protocol} | awk -F "_" '{print $NF}'` + obfs_suffix=`echo ${obfs} | awk -F "_" '{print $NF}'` + if [[ ${protocol} = "origin" ]]; then + if [[ ${obfs} = "plain" ]]; then + ss_link_qr + ssr_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + ss_link="" + else + ss_link_qr + fi + fi + else + if [[ ${protocol_suffix} != "compatible" ]]; then + ss_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + if [[ ${obfs_suffix} = "plain" ]]; then + ss_link_qr + else + ss_link="" + fi + else + ss_link_qr + fi + fi + fi + ssr_link_qr +} +# 显示 配置信息 +View_User(){ + SSR_installation_status + Get_IP + Get_User + now_mode=$(cat "${config_user_file}"|grep '"port_password"') + [[ -z ${protocol_param} ]] && protocol_param="0(无限)" + if [[ -z "${now_mode}" ]]; then + ss_ssr_determine + clear && echo "===================================================" && echo + echo -e " ShadowsocksR账号 配置信息:" && echo + echo -e " I P\t : ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " 端口\t : ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " 密码\t : ${Green_font_prefix}${password}${Font_color_suffix}" + echo -e " 加密\t : ${Green_font_prefix}${method}${Font_color_suffix}" + echo -e " 协议\t : ${Red_font_prefix}${protocol}${Font_color_suffix}" + echo -e " 混淆\t : ${Red_font_prefix}${obfs}${Font_color_suffix}" + echo -e " 设备数限制 : ${Green_font_prefix}${protocol_param}${Font_color_suffix}" + echo -e " 单线程限速 : ${Green_font_prefix}${speed_limit_per_con} KB/S${Font_color_suffix}" + echo -e " 端口总限速 : ${Green_font_prefix}${speed_limit_per_user} KB/S${Font_color_suffix}" + echo -e "${ss_link}" + echo -e "${ssr_link}" + echo -e " ${Green_font_prefix} 提示: ${Font_color_suffix} + 在浏览器中,打开二维码链接,就可以看到二维码图片。 + 协议和混淆后面的[ _compatible ],指的是 兼容原版协议/混淆。" + echo && echo "===================================================" + else + user_total=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + [[ ${user_total} = "0" ]] && echo -e "${Error} 没有发现 多端口用户,请检查 !" && exit 1 + clear && echo "===================================================" && echo + echo -e " ShadowsocksR账号 配置信息:" && echo + echo -e " I P\t : ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " 加密\t : ${Green_font_prefix}${method}${Font_color_suffix}" + echo -e " 协议\t : ${Red_font_prefix}${protocol}${Font_color_suffix}" + echo -e " 混淆\t : ${Red_font_prefix}${obfs}${Font_color_suffix}" + echo -e " 设备数限制 : ${Green_font_prefix}${protocol_param}${Font_color_suffix}" + echo -e " 单线程限速 : ${Green_font_prefix}${speed_limit_per_con} KB/S${Font_color_suffix}" + echo -e " 端口总限速 : ${Green_font_prefix}${speed_limit_per_user} KB/S${Font_color_suffix}" && echo + for((integer = ${user_total}; integer >= 1; integer--)) + do + port=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | sed -r 's/.*\"(.+)\".*/\1/'` + password=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $2}' | sed -n "${integer}p" | sed -r 's/.*\"(.+)\".*/\1/'` + ss_ssr_determine + echo -e ${Separator_1} + echo -e " 端口\t : ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " 密码\t : ${Green_font_prefix}${password}${Font_color_suffix}" + echo -e "${ss_link}" + echo -e "${ssr_link}" + done + echo -e " ${Green_font_prefix} 提示: ${Font_color_suffix} + 在浏览器中,打开二维码链接,就可以看到二维码图片。 + 协议和混淆后面的[ _compatible ],指的是 兼容原版协议/混淆。" + echo && echo "===================================================" + fi +} +# 设置 配置信息 +Set_config_port(){ + while true + do + echo -e "请输入要设置的ShadowsocksR账号 端口" + read -e -p "(默认: 2333):" ssr_port + [[ -z "$ssr_port" ]] && ssr_port="2333" + echo $((${ssr_port}+0)) &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_port} -ge 1 ]] && [[ ${ssr_port} -le 65535 ]]; then + echo && echo ${Separator_1} && echo -e " 端口 : ${Green_font_prefix}${ssr_port}${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo -e "${Error} 请输入正确的数字(1-65535)" + fi + else + echo -e "${Error} 请输入正确的数字(1-65535)" + fi + done +} +Set_config_password(){ + echo "请输入要设置的ShadowsocksR账号 密码" + read -e -p "(默认: doub.io):" ssr_password + [[ -z "${ssr_password}" ]] && ssr_password="doub.io" + echo && echo ${Separator_1} && echo -e " 密码 : ${Green_font_prefix}${ssr_password}${Font_color_suffix}" && echo ${Separator_1} && echo +} +Set_config_method(){ + echo -e "请选择要设置的ShadowsocksR账号 加密方式 + + ${Green_font_prefix} 1.${Font_color_suffix} none + ${Tip} 如果使用 auth_chain_a 协议,请加密方式选择 none,混淆随意(建议 plain) + + ${Green_font_prefix} 2.${Font_color_suffix} rc4 + ${Green_font_prefix} 3.${Font_color_suffix} rc4-md5 + ${Green_font_prefix} 4.${Font_color_suffix} rc4-md5-6 + + ${Green_font_prefix} 5.${Font_color_suffix} aes-128-ctr + ${Green_font_prefix} 6.${Font_color_suffix} aes-192-ctr + ${Green_font_prefix} 7.${Font_color_suffix} aes-256-ctr + + ${Green_font_prefix} 8.${Font_color_suffix} aes-128-cfb + ${Green_font_prefix} 9.${Font_color_suffix} aes-192-cfb + ${Green_font_prefix}10.${Font_color_suffix} aes-256-cfb + + ${Green_font_prefix}11.${Font_color_suffix} aes-128-cfb8 + ${Green_font_prefix}12.${Font_color_suffix} aes-192-cfb8 + ${Green_font_prefix}13.${Font_color_suffix} aes-256-cfb8 + + ${Green_font_prefix}14.${Font_color_suffix} salsa20 + ${Green_font_prefix}15.${Font_color_suffix} chacha20 + ${Green_font_prefix}16.${Font_color_suffix} chacha20-ietf + ${Tip} salsa20/chacha20-*系列加密方式,需要额外安装依赖 libsodium ,否则会无法启动ShadowsocksR !" && echo + read -e -p "(默认: 5. aes-128-ctr):" ssr_method + [[ -z "${ssr_method}" ]] && ssr_method="5" + if [[ ${ssr_method} == "1" ]]; then + ssr_method="none" + elif [[ ${ssr_method} == "2" ]]; then + ssr_method="rc4" + elif [[ ${ssr_method} == "3" ]]; then + ssr_method="rc4-md5" + elif [[ ${ssr_method} == "4" ]]; then + ssr_method="rc4-md5-6" + elif [[ ${ssr_method} == "5" ]]; then + ssr_method="aes-128-ctr" + elif [[ ${ssr_method} == "6" ]]; then + ssr_method="aes-192-ctr" + elif [[ ${ssr_method} == "7" ]]; then + ssr_method="aes-256-ctr" + elif [[ ${ssr_method} == "8" ]]; then + ssr_method="aes-128-cfb" + elif [[ ${ssr_method} == "9" ]]; then + ssr_method="aes-192-cfb" + elif [[ ${ssr_method} == "10" ]]; then + ssr_method="aes-256-cfb" + elif [[ ${ssr_method} == "11" ]]; then + ssr_method="aes-128-cfb8" + elif [[ ${ssr_method} == "12" ]]; then + ssr_method="aes-192-cfb8" + elif [[ ${ssr_method} == "13" ]]; then + ssr_method="aes-256-cfb8" + elif [[ ${ssr_method} == "14" ]]; then + ssr_method="salsa20" + elif [[ ${ssr_method} == "15" ]]; then + ssr_method="chacha20" + elif [[ ${ssr_method} == "16" ]]; then + ssr_method="chacha20-ietf" + else + ssr_method="aes-128-ctr" + fi + echo && echo ${Separator_1} && echo -e " 加密 : ${Green_font_prefix}${ssr_method}${Font_color_suffix}" && echo ${Separator_1} && echo +} +Set_config_protocol(){ + echo -e "请选择要设置的ShadowsocksR账号 协议插件 + + ${Green_font_prefix}1.${Font_color_suffix} origin + ${Green_font_prefix}2.${Font_color_suffix} auth_sha1_v4 + ${Green_font_prefix}3.${Font_color_suffix} auth_aes128_md5 + ${Green_font_prefix}4.${Font_color_suffix} auth_aes128_sha1 + ${Green_font_prefix}5.${Font_color_suffix} auth_chain_a + ${Green_font_prefix}6.${Font_color_suffix} auth_chain_b + ${Tip} 如果使用 auth_chain_a 协议,请加密方式选择 none,混淆随意(建议 plain)" && echo + read -e -p "(默认: 2. auth_sha1_v4):" ssr_protocol + [[ -z "${ssr_protocol}" ]] && ssr_protocol="2" + if [[ ${ssr_protocol} == "1" ]]; then + ssr_protocol="origin" + elif [[ ${ssr_protocol} == "2" ]]; then + ssr_protocol="auth_sha1_v4" + elif [[ ${ssr_protocol} == "3" ]]; then + ssr_protocol="auth_aes128_md5" + elif [[ ${ssr_protocol} == "4" ]]; then + ssr_protocol="auth_aes128_sha1" + elif [[ ${ssr_protocol} == "5" ]]; then + ssr_protocol="auth_chain_a" + elif [[ ${ssr_protocol} == "6" ]]; then + ssr_protocol="auth_chain_b" + else + ssr_protocol="auth_sha1_v4" + fi + echo && echo ${Separator_1} && echo -e " 协议 : ${Green_font_prefix}${ssr_protocol}${Font_color_suffix}" && echo ${Separator_1} && echo + if [[ ${ssr_protocol} != "origin" ]]; then + if [[ ${ssr_protocol} == "auth_sha1_v4" ]]; then + read -e -p "是否设置 协议插件兼容原版(_compatible)?[Y/n]" ssr_protocol_yn + [[ -z "${ssr_protocol_yn}" ]] && ssr_protocol_yn="y" + [[ $ssr_protocol_yn == [Yy] ]] && ssr_protocol=${ssr_protocol}"_compatible" + echo + fi + fi +} +Set_config_obfs(){ + echo -e "请选择要设置的ShadowsocksR账号 混淆插件 + + ${Green_font_prefix}1.${Font_color_suffix} plain + ${Green_font_prefix}2.${Font_color_suffix} http_simple + ${Green_font_prefix}3.${Font_color_suffix} http_post + ${Green_font_prefix}4.${Font_color_suffix} random_head + ${Green_font_prefix}5.${Font_color_suffix} tls1.2_ticket_auth + ${Tip} 如果使用 ShadowsocksR 加速游戏,请选择 混淆兼容原版或 plain 混淆,然后客户端选择 plain,否则会增加延迟 ! + 另外, 如果你选择了 tls1.2_ticket_auth,那么客户端可以选择 tls1.2_ticket_fastauth,这样即能伪装又不会增加延迟 ! + 如果你是在日本、美国等热门地区搭建,那么选择 plain 混淆可能被墙几率更低 !" && echo + read -e -p "(默认: 1. plain):" ssr_obfs + [[ -z "${ssr_obfs}" ]] && ssr_obfs="1" + if [[ ${ssr_obfs} == "1" ]]; then + ssr_obfs="plain" + elif [[ ${ssr_obfs} == "2" ]]; then + ssr_obfs="http_simple" + elif [[ ${ssr_obfs} == "3" ]]; then + ssr_obfs="http_post" + elif [[ ${ssr_obfs} == "4" ]]; then + ssr_obfs="random_head" + elif [[ ${ssr_obfs} == "5" ]]; then + ssr_obfs="tls1.2_ticket_auth" + else + ssr_obfs="plain" + fi + echo && echo ${Separator_1} && echo -e " 混淆 : ${Green_font_prefix}${ssr_obfs}${Font_color_suffix}" && echo ${Separator_1} && echo + if [[ ${ssr_obfs} != "plain" ]]; then + read -e -p "是否设置 混淆插件兼容原版(_compatible)?[Y/n]" ssr_obfs_yn + [[ -z "${ssr_obfs_yn}" ]] && ssr_obfs_yn="y" + [[ $ssr_obfs_yn == [Yy] ]] && ssr_obfs=${ssr_obfs}"_compatible" + echo + fi +} +Set_config_protocol_param(){ + while true + do + echo -e "请输入要设置的ShadowsocksR账号 欲限制的设备数 (${Green_font_prefix} auth_* 系列协议 不兼容原版才有效 ${Font_color_suffix})" + echo -e "${Tip} 设备数限制:每个端口同一时间能链接的客户端数量(多端口模式,每个端口都是独立计算),建议最少 2个。" + read -e -p "(默认: 无限):" ssr_protocol_param + [[ -z "$ssr_protocol_param" ]] && ssr_protocol_param="" && echo && break + echo $((${ssr_protocol_param}+0)) &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_protocol_param} -ge 1 ]] && [[ ${ssr_protocol_param} -le 9999 ]]; then + echo && echo ${Separator_1} && echo -e " 设备数限制 : ${Green_font_prefix}${ssr_protocol_param}${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo -e "${Error} 请输入正确的数字(1-9999)" + fi + else + echo -e "${Error} 请输入正确的数字(1-9999)" + fi + done +} +Set_config_speed_limit_per_con(){ + while true + do + echo -e "请输入要设置的每个端口 单线程 限速上限(单位:KB/S)" + echo -e "${Tip} 单线程限速:每个端口 单线程的限速上限,多线程即无效。" + read -e -p "(默认: 无限):" ssr_speed_limit_per_con + [[ -z "$ssr_speed_limit_per_con" ]] && ssr_speed_limit_per_con=0 && echo && break + echo $((${ssr_speed_limit_per_con}+0)) &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_con} -ge 1 ]] && [[ ${ssr_speed_limit_per_con} -le 131072 ]]; then + echo && echo ${Separator_1} && echo -e " 单线程限速 : ${Green_font_prefix}${ssr_speed_limit_per_con} KB/S${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo -e "${Error} 请输入正确的数字(1-131072)" + fi + else + echo -e "${Error} 请输入正确的数字(1-131072)" + fi + done +} +Set_config_speed_limit_per_user(){ + while true + do + echo + echo -e "请输入要设置的每个端口 总速度 限速上限(单位:KB/S)" + echo -e "${Tip} 端口总限速:每个端口 总速度 限速上限,单个端口整体限速。" + read -e -p "(默认: 无限):" ssr_speed_limit_per_user + [[ -z "$ssr_speed_limit_per_user" ]] && ssr_speed_limit_per_user=0 && echo && break + echo $((${ssr_speed_limit_per_user}+0)) &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_user} -ge 1 ]] && [[ ${ssr_speed_limit_per_user} -le 131072 ]]; then + echo && echo ${Separator_1} && echo -e " 端口总限速 : ${Green_font_prefix}${ssr_speed_limit_per_user} KB/S${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo -e "${Error} 请输入正确的数字(1-131072)" + fi + else + echo -e "${Error} 请输入正确的数字(1-131072)" + fi + done +} +Set_config_all(){ + Set_config_port + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user +} +# 修改 配置信息 +Modify_config_port(){ + sed -i 's/"server_port": '"$(echo ${port})"'/"server_port": '"$(echo ${ssr_port})"'/g' ${config_user_file} +} +Modify_config_password(){ + sed -i 's/"password": "'"$(echo ${password})"'"/"password": "'"$(echo ${ssr_password})"'"/g' ${config_user_file} +} +Modify_config_method(){ + sed -i 's/"method": "'"$(echo ${method})"'"/"method": "'"$(echo ${ssr_method})"'"/g' ${config_user_file} +} +Modify_config_protocol(){ + sed -i 's/"protocol": "'"$(echo ${protocol})"'"/"protocol": "'"$(echo ${ssr_protocol})"'"/g' ${config_user_file} +} +Modify_config_obfs(){ + sed -i 's/"obfs": "'"$(echo ${obfs})"'"/"obfs": "'"$(echo ${ssr_obfs})"'"/g' ${config_user_file} +} +Modify_config_protocol_param(){ + sed -i 's/"protocol_param": "'"$(echo ${protocol_param})"'"/"protocol_param": "'"$(echo ${ssr_protocol_param})"'"/g' ${config_user_file} +} +Modify_config_speed_limit_per_con(){ + sed -i 's/"speed_limit_per_con": '"$(echo ${speed_limit_per_con})"'/"speed_limit_per_con": '"$(echo ${ssr_speed_limit_per_con})"'/g' ${config_user_file} +} +Modify_config_speed_limit_per_user(){ + sed -i 's/"speed_limit_per_user": '"$(echo ${speed_limit_per_user})"'/"speed_limit_per_user": '"$(echo ${ssr_speed_limit_per_user})"'/g' ${config_user_file} +} +Modify_config_connect_verbose_info(){ + sed -i 's/"connect_verbose_info": '"$(echo ${connect_verbose_info})"'/"connect_verbose_info": '"$(echo ${ssr_connect_verbose_info})"'/g' ${config_user_file} +} +Modify_config_all(){ + Modify_config_port + Modify_config_password + Modify_config_method + Modify_config_protocol + Modify_config_obfs + Modify_config_protocol_param + Modify_config_speed_limit_per_con + Modify_config_speed_limit_per_user +} +Modify_config_port_many(){ + sed -i 's/"'"$(echo ${port})"'":/"'"$(echo ${ssr_port})"'":/g' ${config_user_file} +} +Modify_config_password_many(){ + sed -i 's/"'"$(echo ${password})"'"/"'"$(echo ${ssr_password})"'"/g' ${config_user_file} +} +# 写入 配置信息 +Write_configuration(){ + cat > ${config_user_file}<<-EOF +{ + "server": "0.0.0.0", + "server_ipv6": "::", + "server_port": ${ssr_port}, + "local_address": "127.0.0.1", + "local_port": 1080, + + "password": "${ssr_password}", + "method": "${ssr_method}", + "protocol": "${ssr_protocol}", + "protocol_param": "${ssr_protocol_param}", + "obfs": "${ssr_obfs}", + "obfs_param": "", + "speed_limit_per_con": ${ssr_speed_limit_per_con}, + "speed_limit_per_user": ${ssr_speed_limit_per_user}, + + "additional_ports" : {}, + "timeout": 120, + "udp_timeout": 60, + "dns_ipv6": false, + "connect_verbose_info": 0, + "redirect": "", + "fast_open": false +} +EOF +} +Write_configuration_many(){ + cat > ${config_user_file}<<-EOF +{ + "server": "0.0.0.0", + "server_ipv6": "::", + "local_address": "127.0.0.1", + "local_port": 1080, + + "port_password":{ + "${ssr_port}":"${ssr_password}" + }, + "method": "${ssr_method}", + "protocol": "${ssr_protocol}", + "protocol_param": "${ssr_protocol_param}", + "obfs": "${ssr_obfs}", + "obfs_param": "", + "speed_limit_per_con": ${ssr_speed_limit_per_con}, + "speed_limit_per_user": ${ssr_speed_limit_per_user}, + + "additional_ports" : {}, + "timeout": 120, + "udp_timeout": 60, + "dns_ipv6": false, + "connect_verbose_info": 0, + "redirect": "", + "fast_open": false +} +EOF +} +Check_python(){ + python_ver=`python -h` + if [[ -z ${python_ver} ]]; then + echo -e "${Info} 没有安装Python,开始安装..." + if [[ ${release} == "centos" ]]; then + yum install -y python + else + apt-get install -y python + fi + fi +} +Centos_yum(){ + yum update + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + yum install -y vim unzip net-tools + else + yum install -y vim unzip + fi +} +Debian_apt(){ + apt-get update + cat /etc/issue |grep 9\..*>/dev/null + if [[ $? = 0 ]]; then + apt-get install -y vim unzip net-tools + else + apt-get install -y vim unzip + fi +} +# 下载 ShadowsocksR +Download_SSR(){ + cd "/usr/local/" + wget -N --no-check-certificate "https://github.com/ToyoDAdoubi/shadowsocksr/archive/manyuser.zip" + #git config --global http.sslVerify false + #env GIT_SSL_NO_VERIFY=true git clone -b manyuser https://github.com/ToyoDAdoubi/shadowsocksr.git + #[[ ! -e ${ssr_folder} ]] && echo -e "${Error} ShadowsocksR服务端 下载失败 !" && exit 1 + [[ ! -e "manyuser.zip" ]] && echo -e "${Error} ShadowsocksR服务端 压缩包 下载失败 !" && rm -rf manyuser.zip && exit 1 + unzip "manyuser.zip" + [[ ! -e "/usr/local/shadowsocksr-manyuser/" ]] && echo -e "${Error} ShadowsocksR服务端 解压失败 !" && rm -rf manyuser.zip && exit 1 + mv "/usr/local/shadowsocksr-manyuser/" "/usr/local/shadowsocksr/" + [[ ! -e "/usr/local/shadowsocksr/" ]] && echo -e "${Error} ShadowsocksR服务端 重命名失败 !" && rm -rf manyuser.zip && rm -rf "/usr/local/shadowsocksr-manyuser/" && exit 1 + rm -rf manyuser.zip + [[ -e ${config_folder} ]] && rm -rf ${config_folder} + mkdir ${config_folder} + [[ ! -e ${config_folder} ]] && echo -e "${Error} ShadowsocksR配置文件的文件夹 建立失败 !" && exit 1 + echo -e "${Info} ShadowsocksR服务端 下载完成 !" +} +Service_SSR(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/ssr_centos -O /etc/init.d/ssr; then + echo -e "${Error} ShadowsocksR服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/ssr + chkconfig --add ssr + chkconfig ssr on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/ssr_debian -O /etc/init.d/ssr; then + echo -e "${Error} ShadowsocksR服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/ssr + update-rc.d -f ssr defaults + fi + echo -e "${Info} ShadowsocksR服务 管理脚本下载完成 !" +} +# 安装 JQ解析器 +JQ_install(){ + if [[ ! -e ${jq_file} ]]; then + cd "${ssr_folder}" + if [[ ${bit} = "x86_64" ]]; then + mv "jq-linux64" "jq" + #wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64" -O ${jq_file} + else + mv "jq-linux32" "jq" + #wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux32" -O ${jq_file} + fi + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ解析器 重命名失败,请检查 !" && exit 1 + chmod +x ${jq_file} + echo -e "${Info} JQ解析器 安装完成,继续..." + else + echo -e "${Info} JQ解析器 已安装,继续..." + fi +} +# 安装 依赖 +Installation_dependency(){ + if [[ ${release} == "centos" ]]; then + Centos_yum + else + Debian_apt + fi + [[ ! -e "/usr/bin/unzip" ]] && echo -e "${Error} 依赖 unzip(解压压缩包) 安装失败,多半是软件包源的问题,请检查 !" && exit 1 + Check_python + #echo "nameserver 8.8.8.8" > /etc/resolv.conf + #echo "nameserver 8.8.4.4" >> /etc/resolv.conf + \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +} +Install_SSR(){ + check_root + [[ -e ${config_user_file} ]] && echo -e "${Error} ShadowsocksR 配置文件已存在,请检查( 如安装失败或者存在旧版本,请先卸载 ) !" && exit 1 + [[ -e ${ssr_folder} ]] && echo -e "${Error} ShadowsocksR 文件夹已存在,请检查( 如安装失败或者存在旧版本,请先卸载 ) !" && exit 1 + echo -e "${Info} 开始设置 ShadowsocksR账号配置..." + Set_config_all + echo -e "${Info} 开始安装/配置 ShadowsocksR依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装 ShadowsocksR文件..." + Download_SSR + echo -e "${Info} 开始下载/安装 ShadowsocksR服务脚本(init)..." + Service_SSR + echo -e "${Info} 开始下载/安装 JSNO解析器 JQ..." + JQ_install + echo -e "${Info} 开始写入 ShadowsocksR配置文件..." + Write_configuration + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动 ShadowsocksR服务端..." + Start_SSR +} +Update_SSR(){ + SSR_installation_status + echo -e "因破娃暂停更新ShadowsocksR服务端,所以此功能临时禁用。" + #cd ${ssr_folder} + #git pull + #Restart_SSR +} +Uninstall_SSR(){ + [[ ! -e ${config_user_file} ]] && [[ ! -e ${ssr_folder} ]] && echo -e "${Error} 没有安装 ShadowsocksR,请检查 !" && exit 1 + echo "确定要 卸载ShadowsocksR?[y/N]" && echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z "${PID}" ]] && kill -9 ${PID} + if [[ -z "${now_mode}" ]]; then + port=`${jq_file} '.server_port' ${config_user_file}` + Del_iptables + Save_iptables + else + user_total=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + for((integer = 1; integer <= ${user_total}; integer++)) + do + port=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | sed -r 's/.*\"(.+)\".*/\1/'` + Del_iptables + done + Save_iptables + fi + if [[ ${release} = "centos" ]]; then + chkconfig --del ssr + else + update-rc.d -f ssr remove + fi + rm -rf ${ssr_folder} && rm -rf ${config_folder} && rm -rf /etc/init.d/ssr + echo && echo " ShadowsocksR 卸载完成 !" && echo + else + echo && echo " 卸载已取消..." && echo + fi +} +Check_Libsodium_ver(){ + echo -e "${Info} 开始获取 libsodium 最新版本..." + Libsodiumr_ver=$(wget -qO- "https://github.com/jedisct1/libsodium/tags"|grep "/jedisct1/libsodium/releases/tag/"|head -1|sed -r 's/.*tag\/(.+)\">.*/\1/') + [[ -z ${Libsodiumr_ver} ]] && Libsodiumr_ver=${Libsodiumr_ver_backup} + echo -e "${Info} libsodium 最新版本为 ${Green_font_prefix}${Libsodiumr_ver}${Font_color_suffix} !" +} +Install_Libsodium(){ + if [[ -e ${Libsodiumr_file} ]]; then + echo -e "${Error} libsodium 已安装 , 是否覆盖安装(更新)?[y/N]" + read -e -p "(默认: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Nn] ]]; then + echo "已取消..." && exit 1 + fi + else + echo -e "${Info} libsodium 未安装,开始安装..." + fi + Check_Libsodium_ver + if [[ ${release} == "centos" ]]; then + yum update + echo -e "${Info} 安装依赖..." + yum -y groupinstall "Development Tools" + echo -e "${Info} 下载..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} 解压..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} 编译安装..." + ./configure --disable-maintainer-mode && make -j2 && make install + echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf + else + apt-get update + echo -e "${Info} 安装依赖..." + apt-get install -y build-essential + echo -e "${Info} 下载..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} 解压..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} 编译安装..." + ./configure --disable-maintainer-mode && make -j2 && make install + fi + ldconfig + cd .. && rm -rf libsodium-${Libsodiumr_ver}.tar.gz && rm -rf libsodium-${Libsodiumr_ver} + [[ ! -e ${Libsodiumr_file} ]] && echo -e "${Error} libsodium 安装失败 !" && exit 1 + echo && echo -e "${Info} libsodium 安装成功 !" && echo +} +# 显示 连接信息 +debian_View_user_connection_info(){ + format_1=$1 + if [[ -z "${now_mode}" ]]; then + now_mode="单端口" && user_total="1" + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |wc -l` + user_port=`${jq_file} '.server_port' ${config_user_file}` + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep ":${user_port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" ` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all="端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + echo -e "当前模式: ${Green_background_prefix} "${now_mode}" ${Font_color_suffix} 链接IP总数: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix}" + echo -e "${user_list_all}" + else + now_mode="多端口" && user_total=`${jq_file} '.port_password' ${config_user_file} |sed '$d;1d' | wc -l` + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |wc -l` + user_list_all="" + for((integer = ${user_total}; integer >= 1; integer--)) + do + user_port=`${jq_file} '.port_password' ${config_user_file} |sed '$d;1d' |awk -F ":" '{print $1}' |sed -n "${integer}p" |sed -r 's/.*\"(.+)\".*/\1/'` + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep "${user_port}" |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all=${user_list_all}"端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "当前模式: ${Green_background_prefix} "${now_mode}" ${Font_color_suffix} 用户总数: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} 链接IP总数: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + echo -e "${user_list_all}" + fi +} +centos_View_user_connection_info(){ + format_1=$1 + if [[ -z "${now_mode}" ]]; then + now_mode="单端口" && user_total="1" + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |wc -l` + user_port=`${jq_file} '.server_port' ${config_user_file}` + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep ":${user_port} " | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all="端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + echo -e "当前模式: ${Green_background_prefix} "${now_mode}" ${Font_color_suffix} 链接IP总数: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix}" + echo -e "${user_list_all}" + else + now_mode="多端口" && user_total=`${jq_file} '.port_password' ${config_user_file} |sed '$d;1d' | wc -l` + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=`${jq_file} '.port_password' ${config_user_file} |sed '$d;1d' |awk -F ":" '{print $1}' |sed -n "${integer}p" |sed -r 's/.*\"(.+)\".*/\1/'` + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep "${user_port}"|grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" ` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all=${user_list_all}"端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "当前模式: ${Green_background_prefix} "${now_mode}" ${Font_color_suffix} 用户总数: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} 链接IP总数: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + echo -e "${user_list_all}" + fi +} +View_user_connection_info(){ + SSR_installation_status + echo && echo -e "请选择要显示的格式: + ${Green_font_prefix}1.${Font_color_suffix} 显示 IP 格式 + ${Green_font_prefix}2.${Font_color_suffix} 显示 IP+IP归属地 格式" && echo + read -e -p "(默认: 1):" ssr_connection_info + [[ -z "${ssr_connection_info}" ]] && ssr_connection_info="1" + if [[ ${ssr_connection_info} == "1" ]]; then + View_user_connection_info_1 "" + elif [[ ${ssr_connection_info} == "2" ]]; then + echo -e "${Tip} 检测IP归属地(ipip.net),如果IP较多,可能时间会比较长..." + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} 请输入正确的数字(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + #echo "user_IP_1=${user_IP_1}" + if [[ ! -z ${user_IP_1} ]]; then + #echo "user_IP_total=${user_IP_total}" + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=`echo "${user_IP_1}" |sed -n "$integer_1"p` + #echo "IP=${IP}" + IP_address=`wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g'` + #echo "IP_address=${IP_address}" + user_IP="${user_IP}\n${IP}(${IP_address})" + #echo "user_IP=${user_IP}" + sleep 1s + done + fi +} +# 修改 用户配置 +Modify_Config(){ + SSR_installation_status + if [[ -z "${now_mode}" ]]; then + echo && echo -e "当前模式: 单端口,你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 修改 用户端口 + ${Green_font_prefix}2.${Font_color_suffix} 修改 用户密码 + ${Green_font_prefix}3.${Font_color_suffix} 修改 加密方式 + ${Green_font_prefix}4.${Font_color_suffix} 修改 协议插件 + ${Green_font_prefix}5.${Font_color_suffix} 修改 混淆插件 + ${Green_font_prefix}6.${Font_color_suffix} 修改 设备数限制 + ${Green_font_prefix}7.${Font_color_suffix} 修改 单线程限速 + ${Green_font_prefix}8.${Font_color_suffix} 修改 端口总限速 + ${Green_font_prefix}9.${Font_color_suffix} 修改 全部配置" && echo + read -e -p "(默认: 取消):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo "已取消..." && exit 1 + Get_User + if [[ ${ssr_modify} == "1" ]]; then + Set_config_port + Modify_config_port + Add_iptables + Del_iptables + Save_iptables + elif [[ ${ssr_modify} == "2" ]]; then + Set_config_password + Modify_config_password + elif [[ ${ssr_modify} == "3" ]]; then + Set_config_method + Modify_config_method + elif [[ ${ssr_modify} == "4" ]]; then + Set_config_protocol + Modify_config_protocol + elif [[ ${ssr_modify} == "5" ]]; then + Set_config_obfs + Modify_config_obfs + elif [[ ${ssr_modify} == "6" ]]; then + Set_config_protocol_param + Modify_config_protocol_param + elif [[ ${ssr_modify} == "7" ]]; then + Set_config_speed_limit_per_con + Modify_config_speed_limit_per_con + elif [[ ${ssr_modify} == "8" ]]; then + Set_config_speed_limit_per_user + Modify_config_speed_limit_per_user + elif [[ ${ssr_modify} == "9" ]]; then + Set_config_all + Modify_config_all + else + echo -e "${Error} 请输入正确的数字(1-9)" && exit 1 + fi + else + echo && echo -e "当前模式: 多端口,你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 添加 用户配置 + ${Green_font_prefix}2.${Font_color_suffix} 删除 用户配置 + ${Green_font_prefix}3.${Font_color_suffix} 修改 用户配置 +—————————— + ${Green_font_prefix}4.${Font_color_suffix} 修改 加密方式 + ${Green_font_prefix}5.${Font_color_suffix} 修改 协议插件 + ${Green_font_prefix}6.${Font_color_suffix} 修改 混淆插件 + ${Green_font_prefix}7.${Font_color_suffix} 修改 设备数限制 + ${Green_font_prefix}8.${Font_color_suffix} 修改 单线程限速 + ${Green_font_prefix}9.${Font_color_suffix} 修改 端口总限速 + ${Green_font_prefix}10.${Font_color_suffix} 修改 全部配置" && echo + read -e -p "(默认: 取消):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo "已取消..." && exit 1 + Get_User + if [[ ${ssr_modify} == "1" ]]; then + Add_multi_port_user + elif [[ ${ssr_modify} == "2" ]]; then + Del_multi_port_user + elif [[ ${ssr_modify} == "3" ]]; then + Modify_multi_port_user + elif [[ ${ssr_modify} == "4" ]]; then + Set_config_method + Modify_config_method + elif [[ ${ssr_modify} == "5" ]]; then + Set_config_protocol + Modify_config_protocol + elif [[ ${ssr_modify} == "6" ]]; then + Set_config_obfs + Modify_config_obfs + elif [[ ${ssr_modify} == "7" ]]; then + Set_config_protocol_param + Modify_config_protocol_param + elif [[ ${ssr_modify} == "8" ]]; then + Set_config_speed_limit_per_con + Modify_config_speed_limit_per_con + elif [[ ${ssr_modify} == "9" ]]; then + Set_config_speed_limit_per_user + Modify_config_speed_limit_per_user + elif [[ ${ssr_modify} == "10" ]]; then + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Modify_config_method + Modify_config_protocol + Modify_config_obfs + Modify_config_protocol_param + Modify_config_speed_limit_per_con + Modify_config_speed_limit_per_user + else + echo -e "${Error} 请输入正确的数字(1-9)" && exit 1 + fi + fi + Restart_SSR +} +# 显示 多端口用户配置 +List_multi_port_user(){ + user_total=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + [[ ${user_total} = "0" ]] && echo -e "${Error} 没有发现 多端口用户,请检查 !" && exit 1 + user_list_all="" + for((integer = ${user_total}; integer >= 1; integer--)) + do + user_port=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | sed -r 's/.*\"(.+)\".*/\1/'` + user_password=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $2}' | sed -n "${integer}p" | sed -r 's/.*\"(.+)\".*/\1/'` + user_list_all=${user_list_all}"端口: "${user_port}" 密码: "${user_password}"\n" + done + echo && echo -e "用户总数 ${Green_font_prefix}"${user_total}"${Font_color_suffix}" + echo -e ${user_list_all} +} +# 添加 多端口用户配置 +Add_multi_port_user(){ + Set_config_port + Set_config_password + sed -i "8 i \" \"${ssr_port}\":\"${ssr_password}\"," ${config_user_file} + sed -i "8s/^\"//" ${config_user_file} + Add_iptables + Save_iptables + echo -e "${Info} 多端口用户添加完成 ${Green_font_prefix}[端口: ${ssr_port} , 密码: ${ssr_password}]${Font_color_suffix} " +} +# 修改 多端口用户配置 +Modify_multi_port_user(){ + List_multi_port_user + echo && echo -e "请输入要修改的用户端口" + read -e -p "(默认: 取消):" modify_user_port + [[ -z "${modify_user_port}" ]] && echo -e "已取消..." && exit 1 + del_user=`cat ${config_user_file}|grep '"'"${modify_user_port}"'"'` + if [[ ! -z "${del_user}" ]]; then + port="${modify_user_port}" + password=`echo -e ${del_user}|awk -F ":" '{print $NF}'|sed -r 's/.*\"(.+)\".*/\1/'` + Set_config_port + Set_config_password + sed -i 's/"'$(echo ${port})'":"'$(echo ${password})'"/"'$(echo ${ssr_port})'":"'$(echo ${ssr_password})'"/g' ${config_user_file} + Del_iptables + Add_iptables + Save_iptables + echo -e "${Inof} 多端口用户修改完成 ${Green_font_prefix}[旧: ${modify_user_port} ${password} , 新: ${ssr_port} ${ssr_password}]${Font_color_suffix} " + else + echo -e "${Error} 请输入正确的端口 !" && exit 1 + fi +} +# 删除 多端口用户配置 +Del_multi_port_user(){ + List_multi_port_user + user_total=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + [[ "${user_total}" = "1" ]] && echo -e "${Error} 多端口用户仅剩 1个,不能删除 !" && exit 1 + echo -e "请输入要删除的用户端口" + read -e -p "(默认: 取消):" del_user_port + [[ -z "${del_user_port}" ]] && echo -e "已取消..." && exit 1 + del_user=`cat ${config_user_file}|grep '"'"${del_user_port}"'"'` + if [[ ! -z ${del_user} ]]; then + port=${del_user_port} + Del_iptables + Save_iptables + del_user_determine=`echo ${del_user:((${#del_user} - 1))}` + if [[ ${del_user_determine} != "," ]]; then + del_user_num=$(sed -n -e "/${port}/=" ${config_user_file}) + echo $((${ssr_protocol_param}+0)) &>/dev/null + del_user_num=$(echo $((${del_user_num}-1))) + sed -i "${del_user_num}s/,//g" ${config_user_file} + fi + sed -i "/${port}/d" ${config_user_file} + echo -e "${Info} 多端口用户删除完成 ${Green_font_prefix} ${del_user_port} ${Font_color_suffix} " + else + echo "${Error} 请输入正确的端口 !" && exit 1 + fi +} +# 手动修改 用户配置 +Manually_Modify_Config(){ + SSR_installation_status + port=`${jq_file} '.server_port' ${config_user_file}` + vi ${config_user_file} + if [[ -z "${now_mode}" ]]; then + ssr_port=`${jq_file} '.server_port' ${config_user_file}` + Del_iptables + Add_iptables + fi + Restart_SSR +} +# 切换端口模式 +Port_mode_switching(){ + SSR_installation_status + if [[ -z "${now_mode}" ]]; then + echo && echo -e " 当前模式: ${Green_font_prefix}单端口${Font_color_suffix}" && echo + echo -e "确定要切换为 多端口模式?[y/N]" + read -e -p "(默认: n):" mode_yn + [[ -z ${mode_yn} ]] && mode_yn="n" + if [[ ${mode_yn} == [Yy] ]]; then + port=`${jq_file} '.server_port' ${config_user_file}` + Set_config_all + Write_configuration_many + Del_iptables + Add_iptables + Save_iptables + Restart_SSR + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e " 当前模式: ${Green_font_prefix}多端口${Font_color_suffix}" && echo + echo -e "确定要切换为 单端口模式?[y/N]" + read -e -p "(默认: n):" mode_yn + [[ -z ${mode_yn} ]] && mode_yn="n" + if [[ ${mode_yn} == [Yy] ]]; then + user_total=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + for((integer = 1; integer <= ${user_total}; integer++)) + do + port=`${jq_file} '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | sed -r 's/.*\"(.+)\".*/\1/'` + Del_iptables + done + Set_config_all + Write_configuration + Add_iptables + Restart_SSR + else + echo && echo " 已取消..." && echo + fi + fi +} +Start_SSR(){ + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} ShadowsocksR 正在运行 !" && exit 1 + /etc/init.d/ssr start + check_pid + [[ ! -z ${PID} ]] && View_User +} +Stop_SSR(){ + SSR_installation_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} ShadowsocksR 未运行 !" && exit 1 + /etc/init.d/ssr stop +} +Restart_SSR(){ + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/ssr stop + /etc/init.d/ssr start + check_pid + [[ ! -z ${PID} ]] && View_User +} +View_Log(){ + SSR_installation_status + [[ ! -e ${ssr_log_file} ]] && echo -e "${Error} ShadowsocksR日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${ssr_log_file}${Font_color_suffix} 命令。" && echo + tail -f ${ssr_log_file} +} +# 锐速 +Configure_Server_Speeder(){ + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 安装 锐速 + ${Green_font_prefix}2.${Font_color_suffix} 卸载 锐速 +———————— + ${Green_font_prefix}3.${Font_color_suffix} 启动 锐速 + ${Green_font_prefix}4.${Font_color_suffix} 停止 锐速 + ${Green_font_prefix}5.${Font_color_suffix} 重启 锐速 + ${Green_font_prefix}6.${Font_color_suffix} 查看 锐速 状态 + + 注意: 锐速和LotServer不能同时安装/启动!" && echo + read -e -p "(默认: 取消):" server_speeder_num + [[ -z "${server_speeder_num}" ]] && echo "已取消..." && exit 1 + if [[ ${server_speeder_num} == "1" ]]; then + Install_ServerSpeeder + elif [[ ${server_speeder_num} == "2" ]]; then + Server_Speeder_installation_status + Uninstall_ServerSpeeder + elif [[ ${server_speeder_num} == "3" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} start + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "4" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} stop + elif [[ ${server_speeder_num} == "5" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} restart + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "6" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} status + else + echo -e "${Error} 请输入正确的数字(1-6)" && exit 1 + fi +} +Install_ServerSpeeder(){ + [[ -e ${Server_Speeder_file} ]] && echo -e "${Error} 锐速(Server Speeder) 已安装 !" && exit 1 + cd /root + #借用91yun.rog的开心版锐速 + wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder.sh + [[ ! -e "serverspeeder.sh" ]] && echo -e "${Error} 锐速安装脚本下载失败 !" && exit 1 + bash serverspeeder.sh + sleep 2s + PID=`ps -ef |grep -v grep |grep "serverspeeder" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + rm -rf /root/serverspeeder.sh + rm -rf /root/91yunserverspeeder + rm -rf /root/91yunserverspeeder.tar.gz + echo -e "${Info} 锐速(Server Speeder) 安装完成 !" && exit 1 + else + echo -e "${Error} 锐速(Server Speeder) 安装失败 !" && exit 1 + fi +} +Uninstall_ServerSpeeder(){ + echo "确定要卸载 锐速(Server Speeder)?[y/N]" && echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && echo && echo "已取消..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + chattr -i /serverspeeder/etc/apx* + /serverspeeder/bin/serverSpeeder.sh uninstall -f + echo && echo "锐速(Server Speeder) 卸载完成 !" && echo + fi +} +# LotServer +Configure_LotServer(){ + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 安装 LotServer + ${Green_font_prefix}2.${Font_color_suffix} 卸载 LotServer +———————— + ${Green_font_prefix}3.${Font_color_suffix} 启动 LotServer + ${Green_font_prefix}4.${Font_color_suffix} 停止 LotServer + ${Green_font_prefix}5.${Font_color_suffix} 重启 LotServer + ${Green_font_prefix}6.${Font_color_suffix} 查看 LotServer 状态 + + 注意: 锐速和LotServer不能同时安装/启动!" && echo + read -e -p "(默认: 取消):" lotserver_num + [[ -z "${lotserver_num}" ]] && echo "已取消..." && exit 1 + if [[ ${lotserver_num} == "1" ]]; then + Install_LotServer + elif [[ ${lotserver_num} == "2" ]]; then + LotServer_installation_status + Uninstall_LotServer + elif [[ ${lotserver_num} == "3" ]]; then + LotServer_installation_status + ${LotServer_file} start + ${LotServer_file} status + elif [[ ${lotserver_num} == "4" ]]; then + LotServer_installation_status + ${LotServer_file} stop + elif [[ ${lotserver_num} == "5" ]]; then + LotServer_installation_status + ${LotServer_file} restart + ${LotServer_file} status + elif [[ ${lotserver_num} == "6" ]]; then + LotServer_installation_status + ${LotServer_file} status + else + echo -e "${Error} 请输入正确的数字(1-6)" && exit 1 + fi +} +Install_LotServer(){ + [[ -e ${LotServer_file} ]] && echo -e "${Error} LotServer 已安装 !" && exit 1 + #Github: https://github.com/0oVicero0/serverSpeeder_Install + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" + [[ ! -e "/tmp/appex.sh" ]] && echo -e "${Error} LotServer 安装脚本下载失败 !" && exit 1 + bash /tmp/appex.sh 'install' + sleep 2s + PID=`ps -ef |grep -v grep |grep "appex" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + echo -e "${Info} LotServer 安装完成 !" && exit 1 + else + echo -e "${Error} LotServer 安装失败 !" && exit 1 + fi +} +Uninstall_LotServer(){ + echo "确定要卸载 LotServer?[y/N]" && echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && echo && echo "已取消..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" && bash /tmp/appex.sh 'uninstall' + echo && echo "LotServer 卸载完成 !" && echo + fi +} +# BBR +Configure_BBR(){ + echo && echo -e " 你要做什么? + + ${Green_font_prefix}1.${Font_color_suffix} 安装 BBR +———————— + ${Green_font_prefix}2.${Font_color_suffix} 启动 BBR + ${Green_font_prefix}3.${Font_color_suffix} 停止 BBR + ${Green_font_prefix}4.${Font_color_suffix} 查看 BBR 状态" && echo +echo -e "${Green_font_prefix} [安装前 请注意] ${Font_color_suffix} +1. 安装开启BBR,需要更换内核,存在更换失败等风险(重启后无法开机) +2. 本脚本仅支持 Debian / Ubuntu 系统更换内核,OpenVZ和Docker 不支持更换内核 +3. Debian 更换内核过程中会提示 [ 是否终止卸载内核 ] ,请选择 ${Green_font_prefix} NO ${Font_color_suffix}" && echo + read -e -p "(默认: 取消):" bbr_num + [[ -z "${bbr_num}" ]] && echo "已取消..." && exit 1 + if [[ ${bbr_num} == "1" ]]; then + Install_BBR + elif [[ ${bbr_num} == "2" ]]; then + Start_BBR + elif [[ ${bbr_num} == "3" ]]; then + Stop_BBR + elif [[ ${bbr_num} == "4" ]]; then + Status_BBR + else + echo -e "${Error} 请输入正确的数字(1-4)" && exit 1 + fi +} +Install_BBR(){ + [[ ${release} = "centos" ]] && echo -e "${Error} 本脚本不支持 CentOS系统安装 BBR !" && exit 1 + BBR_installation_status + bash "${BBR_file}" +} +Start_BBR(){ + BBR_installation_status + bash "${BBR_file}" start +} +Stop_BBR(){ + BBR_installation_status + bash "${BBR_file}" stop +} +Status_BBR(){ + BBR_installation_status + bash "${BBR_file}" status +} +# 其他功能 +Other_functions(){ + echo && echo -e " 你要做什么? + + ${Green_font_prefix}1.${Font_color_suffix} 配置 BBR + ${Green_font_prefix}2.${Font_color_suffix} 配置 锐速(ServerSpeeder) + ${Green_font_prefix}3.${Font_color_suffix} 配置 LotServer(锐速母公司) + 注意: 锐速/LotServer/BBR 不支持 OpenVZ! + 注意: 锐速/LotServer/BBR 不能共存! +———————————— + ${Green_font_prefix}4.${Font_color_suffix} 一键封禁 BT/PT/SPAM (iptables) + ${Green_font_prefix}5.${Font_color_suffix} 一键解封 BT/PT/SPAM (iptables) + ${Green_font_prefix}6.${Font_color_suffix} 切换 ShadowsocksR日志输出模式 + ——说明:SSR默认只输出错误日志,此项可切换为输出详细的访问日志" && echo + read -e -p "(默认: 取消):" other_num + [[ -z "${other_num}" ]] && echo "已取消..." && exit 1 + if [[ ${other_num} == "1" ]]; then + Configure_BBR + elif [[ ${other_num} == "2" ]]; then + Configure_Server_Speeder + elif [[ ${other_num} == "3" ]]; then + Configure_LotServer + elif [[ ${other_num} == "4" ]]; then + BanBTPTSPAM + elif [[ ${other_num} == "5" ]]; then + UnBanBTPTSPAM + elif [[ ${other_num} == "6" ]]; then + Set_config_connect_verbose_info + else + echo -e "${Error} 请输入正确的数字 [1-6]" && exit 1 + fi +} +# 封禁 BT PT SPAM +BanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh banall + rm -rf ban_iptables.sh +} +# 解封 BT PT SPAM +UnBanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh unbanall + rm -rf ban_iptables.sh +} +Set_config_connect_verbose_info(){ + SSR_installation_status + Get_User + if [[ ${connect_verbose_info} = "0" ]]; then + echo && echo -e "当前日志模式: ${Green_font_prefix}简单模式(只输出错误日志)${Font_color_suffix}" && echo + echo -e "确定要切换为 ${Green_font_prefix}详细模式(输出详细连接日志+错误日志)${Font_color_suffix}?[y/N]" + read -e -p "(默认: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="1" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前日志模式: ${Green_font_prefix}详细模式(输出详细连接日志+错误日志)${Font_color_suffix}" && echo + echo -e "确定要切换为 ${Green_font_prefix}简单模式(只输出错误日志)${Font_color_suffix}?[y/N]" + read -e -p "(默认: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="0" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " 已取消..." && echo + fi + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssr.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/ssr" ]]; then + rm -rf /etc/init.d/ssr + Service_SSR + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssr.sh" && chmod +x ssr.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +# 显示 菜单状态 +menu_status(){ + if [[ -e ${config_user_file} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi + now_mode=$(cat "${config_user_file}"|grep '"port_password"') + if [[ -z "${now_mode}" ]]; then + echo -e " 当前模式: ${Green_font_prefix}单端口${Font_color_suffix}" + else + echo -e " 当前模式: ${Green_font_prefix}多端口${Font_color_suffix}" + fi + else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" + fi +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && [[ ${release} != "centos" ]] && echo -e "${Error} 本脚本不支持当前系统 ${release} !" && exit 1 +echo -e " ShadowsocksR 一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/ss-jc42 ---- + + ${Green_font_prefix}1.${Font_color_suffix} 安装 ShadowsocksR + ${Green_font_prefix}2.${Font_color_suffix} 更新 ShadowsocksR + ${Green_font_prefix}3.${Font_color_suffix} 卸载 ShadowsocksR + ${Green_font_prefix}4.${Font_color_suffix} 安装 libsodium(chacha20) +———————————— + ${Green_font_prefix}5.${Font_color_suffix} 查看 账号信息 + ${Green_font_prefix}6.${Font_color_suffix} 显示 连接信息 + ${Green_font_prefix}7.${Font_color_suffix} 设置 用户配置 + ${Green_font_prefix}8.${Font_color_suffix} 手动 修改配置 + ${Green_font_prefix}9.${Font_color_suffix} 切换 端口模式 +———————————— + ${Green_font_prefix}10.${Font_color_suffix} 启动 ShadowsocksR + ${Green_font_prefix}11.${Font_color_suffix} 停止 ShadowsocksR + ${Green_font_prefix}12.${Font_color_suffix} 重启 ShadowsocksR + ${Green_font_prefix}13.${Font_color_suffix} 查看 ShadowsocksR 日志 +———————————— + ${Green_font_prefix}14.${Font_color_suffix} 其他功能 + ${Green_font_prefix}15.${Font_color_suffix} 升级脚本 + " +menu_status +echo && read -e -p "请输入数字 [1-15]:" num +case "$num" in + 1) + Install_SSR + ;; + 2) + Update_SSR + ;; + 3) + Uninstall_SSR + ;; + 4) + Install_Libsodium + ;; + 5) + View_User + ;; + 6) + View_user_connection_info + ;; + 7) + Modify_Config + ;; + 8) + Manually_Modify_Config + ;; + 9) + Port_mode_switching + ;; + 10) + Start_SSR + ;; + 11) + Stop_SSR + ;; + 12) + Restart_SSR + ;; + 13) + View_Log + ;; + 14) + Other_functions + ;; + 15) + Update_Shell + ;; + *) + echo -e "${Error} 请输入正确的数字 [1-15]" + ;; +esac \ No newline at end of file diff --git a/ssr_check.sh b/ssr_check.sh new file mode 100644 index 0000000..2c5c07e --- /dev/null +++ b/ssr_check.sh @@ -0,0 +1,367 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS 6+/Debian 7+/Ubuntu 14.04+ +# Description: ShadowsocksR Config Check +# Version: 1.0.3 +# Author: Toyo +#================================================= + +Timeout="10" +Test_URL="https://github.com" +SSR_folder="/root/shadowsocksr/shadowsocks" +log_file="$PWD/ssr_check.log" +config_file="$PWD/ssr_check.conf" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" && Error="${Red_font_prefix}[错误]${Font_color_suffix}" && Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +set_config_ip(){ + echo "请输入 ShadowsocksR 账号服务器公网IP" + read -e -p "(默认取消):" ip + [[ -z "${ip}" ]] && echo "已取消..." && exit 1 + echo && echo -e " I P : ${Red_font_prefix}${ip}${Font_color_suffix}" && echo +} +set_config_port(){ + while true + do + echo -e "请输入 ShadowsocksR 账号端口" + read -e -p "(默认: 2333):" port + [[ -z "$port" ]] && port="2333" + echo $((${port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${port} -ge 1 ]] && [[ ${port} -le 65535 ]]; then + echo && echo -e " 端口 : ${Red_font_prefix}${port}${Font_color_suffix}" && echo + break + else + echo -e "${Error} 请输入正确的数字!" + fi + else + echo -e "${Error} 请输入正确的数字!" + fi + done +} +set_config_password(){ + echo "请输入 ShadowsocksR 账号密码" + read -e -p "(默认: doub.io):" passwd + [[ -z "${passwd}" ]] && passwd="doub.io" + echo && echo -e " 密码 : ${Red_font_prefix}${passwd}${Font_color_suffix}" && echo +} +set_config_method(){ + echo -e "请选择要设置的ShadowsocksR账号 加密方式 + ${Green_font_prefix} 1.${Font_color_suffix} none + ${Tip} 如果使用 auth_chain_a 协议,请加密方式选择 none,混淆随意(建议 plain) + + ${Green_font_prefix} 2.${Font_color_suffix} rc4 + ${Green_font_prefix} 3.${Font_color_suffix} rc4-md5 + ${Green_font_prefix} 4.${Font_color_suffix} rc4-md5-6 + + ${Green_font_prefix} 5.${Font_color_suffix} aes-128-ctr + ${Green_font_prefix} 6.${Font_color_suffix} aes-192-ctr + ${Green_font_prefix} 7.${Font_color_suffix} aes-256-ctr + + ${Green_font_prefix} 8.${Font_color_suffix} aes-128-cfb + ${Green_font_prefix} 9.${Font_color_suffix} aes-192-cfb + ${Green_font_prefix}10.${Font_color_suffix} aes-256-cfb + + ${Green_font_prefix}11.${Font_color_suffix} aes-128-cfb8 + ${Green_font_prefix}12.${Font_color_suffix} aes-192-cfb8 + ${Green_font_prefix}13.${Font_color_suffix} aes-256-cfb8 + + ${Green_font_prefix}14.${Font_color_suffix} salsa20 + ${Green_font_prefix}15.${Font_color_suffix} chacha20 + ${Green_font_prefix}16.${Font_color_suffix} chacha20-ietf + ${Tip} salsa20/chacha20-*系列加密方式,需要额外安装依赖 libsodium ,否则会无法启动ShadowsocksR !" && echo + read -e -p "(默认: 5. aes-128-ctr):" method + [[ -z "${method}" ]] && method="5" + if [[ ${method} == "1" ]]; then + method="none" + elif [[ ${method} == "2" ]]; then + method="rc4" + elif [[ ${method} == "3" ]]; then + method="rc4-md5" + elif [[ ${method} == "4" ]]; then + method="rc4-md5-6" + elif [[ ${method} == "5" ]]; then + method="aes-128-ctr" + elif [[ ${method} == "6" ]]; then + method="aes-192-ctr" + elif [[ ${method} == "7" ]]; then + method="aes-256-ctr" + elif [[ ${method} == "8" ]]; then + method="aes-128-cfb" + elif [[ ${method} == "9" ]]; then + method="aes-192-cfb" + elif [[ ${method} == "10" ]]; then + method="aes-256-cfb" + elif [[ ${method} == "11" ]]; then + method="aes-128-cfb8" + elif [[ ${method} == "12" ]]; then + method="aes-192-cfb8" + elif [[ ${method} == "13" ]]; then + method="aes-256-cfb8" + elif [[ ${method} == "14" ]]; then + method="salsa20" + elif [[ ${method} == "15" ]]; then + method="chacha20" + elif [[ ${method} == "16" ]]; then + method="chacha20-ietf" + else + method="aes-128-ctr" + fi + echo && echo ${Separator_1} && echo -e " 加密 : ${Red_font_prefix}${method}${Font_color_suffix}" && echo ${Separator_1} && echo +} +set_config_protocol(){ + echo -e "请选择要设置的ShadowsocksR账号 协议插件 + ${Green_font_prefix}1.${Font_color_suffix} origin + ${Green_font_prefix}2.${Font_color_suffix} auth_sha1_v4 + ${Green_font_prefix}3.${Font_color_suffix} auth_aes128_md5 + ${Green_font_prefix}4.${Font_color_suffix} auth_aes128_sha1 + ${Green_font_prefix}5.${Font_color_suffix} auth_chain_a + ${Tip} 如果使用 auth_chain_a 协议,请加密方式选择 none,混淆随意(建议 plain)" && echo + read -e -p "(默认: 2. auth_sha1_v4):" protocol + [[ -z "${protocol}" ]] && protocol="2" + if [[ ${protocol} == "1" ]]; then + protocol="origin" + elif [[ ${protocol} == "2" ]]; then + protocol="auth_sha1_v4" + elif [[ ${protocol} == "3" ]]; then + protocol="auth_aes128_md5" + elif [[ ${protocol} == "4" ]]; then + protocol="auth_aes128_sha1" + elif [[ ${protocol} == "5" ]]; then + protocol="auth_chain_a" + else + protocol="auth_sha1_v4" + fi + echo && echo -e " 协议 : ${Red_font_prefix}${protocol}${Font_color_suffix}" && echo +} +set_config_obfs(){ + echo -e "请选择要设置的ShadowsocksR账号 混淆插件 + ${Green_font_prefix}1.${Font_color_suffix} plain + ${Green_font_prefix}2.${Font_color_suffix} http_simple + ${Green_font_prefix}3.${Font_color_suffix} http_post + ${Green_font_prefix}4.${Font_color_suffix} random_head + ${Green_font_prefix}5.${Font_color_suffix} tls1.2_ticket_auth + ${Tip} 如果使用 ShadowsocksR 加速游戏,请选择 混淆兼容原版或 plain 混淆,然后客户端选择 plain,否则会增加延迟 !" && echo + read -e -p "(默认: 5. tls1.2_ticket_auth):" obfs + [[ -z "${obfs}" ]] && obfs="5" + if [[ ${obfs} == "1" ]]; then + obfs="plain" + elif [[ ${obfs} == "2" ]]; then + obfs="http_simple" + elif [[ ${obfs} == "3" ]]; then + obfs="http_post" + elif [[ ${obfs} == "4" ]]; then + obfs="random_head" + elif [[ ${obfs} == "5" ]]; then + obfs="tls1.2_ticket_auth" + else + obfs="tls1.2_ticket_auth" + fi + echo && echo -e " 混淆 : ${Red_font_prefix}${obfs}${Font_color_suffix}" && echo +} +set_config_like(){ + echo "请输入 ShadowsocksR 的链接(SS/SSR链接皆可,如 ss://xxxx ssr://xxxx)" + read -e -p "(默认回车取消):" Like + [[ -z "${Like}" ]] && echo "已取消..." && exit 1 + echo && echo -e " 链接 : ${Red_font_prefix}${Like}${Font_color_suffix}" && echo +} +set_config_user(){ + echo -e "请输入选择输入方式 + ${Green_font_prefix}1.${Font_color_suffix} 输入ShadowsocksR账号全部信息(Shadowsocks原版也可以) + ${Green_font_prefix}2.${Font_color_suffix} 输入ShadowsocksR账号的 SSR链接(Shadowsocks原版也可以)" + read -e -p "(默认:2):" enter_type + [[ -z "${enter_type}" ]] && enter_type="2" + if [[ ${enter_type} == "1" ]]; then + echo -e "下面依次开始输入要检测可用性的 ShadowsocksR账号信息。" && echo + set_config_ip + set_config_port + set_config_password + set_config_method + set_config_protocol + set_config_obfs + return 1 + elif [[ ${enter_type} == "2" ]]; then + set_config_like + return 2 + else + set_config_like + return 2 + fi +} +GO(){ + echo -e "========== 开始记录测试信息 [$(date '+%Y-%m-%d %H:%M:%S')]==========\n" >> ${log_file} +} +exit_GG(){ + echo -e "========== 记录测试信息结束 [$(date '+%Y-%m-%d %H:%M:%S')]==========\n\n" >> ${log_file} + exit 0 +} +Get_Like(){ + [[ ! -e ${config_file} ]] && echo -e "${Error} 配置文件不存在!(${config_file})" | tee -a ${log_file} && exit_GG + Like=$(cat "${config_file}") + [[ -z ${Like} ]] && echo -e "${Error} 获取SS/SSR账号信息失败或配置文件为空 !" | tee -a ${log_file} && exit_GG + Like_num=$(echo -e "${Like}"|wc -l) +} +Analysis_Config(){ + Config_info_base64=$(echo -e "${Like}"|sed -n "$1"p) + Config_info_base64_determine=$(echo -e ${Config_info_base64}|cut -c 1-6) + if [[ "${Config_info_base64_determine}" == "ssr://" ]]; then + Config_info=$(echo -e "${Config_info_base64}"|cut -c 7-2000|base64 -d) + if [[ -z ${Config_info} ]]; then + echo -e "${Error} Base64解密失败 [${Config_info_base64}] !" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + continue + fi + fi + ssr_config + else + Config_info=$(echo -e "${Config_info_base64}"|cut -c 6-2000|base64 -d) + if [[ -z ${Config_info} ]]; then + echo -e "${Error} Base64解密失败 [${Config_info_base64}] !" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + continue + fi + fi + ss_config + fi +} +ss_config(){ + zuo=$(echo -e "${Config_info}"|awk -F "@" '{print $1}') + you=$(echo -e "${Config_info}"|awk -F "@" '{print $2}') + port=$(echo -e "${you}"|awk -F ":" '{print $NF}') + ip=$(echo -e "${you}"|awk -F ":${port}" '{print $1}') + if [[ $(echo -e "${ip}"|wc -L) -le 8 ]]; then + echo -e "${Error} 错误,IP格式错误或为 ipv6地址[ ${ip} ]" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + continue + fi + fi + method=$(echo -e "${zuo}"|awk -F ":" '{print $1}') + passwd=$(echo -e "${zuo}"|awk -F ":" '{print $2}') + protocol="origin" + obfs="plain" + if [[ -z ${ip} ]] || [[ -z ${port} ]] || [[ -z ${method} ]] || [[ -z ${passwd} ]] || [[ -z ${protocol} ]] || [[ -z ${obfs} ]]; then + echo -e "${Error} 错误,有部分 账号参数为空![ ${ip} ,${port} ,${method} ,${passwd} ,${protocol} ,${obfs} ]" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + continue + fi + fi +} +ssr_config(){ + zuo=$(echo -e "${Config_info}"|awk -F "/?" '{print $1}') + passwd_base64=$(echo -e "${zuo}"|awk -F ":" '{print $NF}') + zuo=$(echo -e "${Config_info}"|awk -F ":${passwd_base64}" '{print $1}') + obfs=$(echo -e "${zuo}"|awk -F ":" '{print $NF}') + zuo=$(echo -e "${Config_info}"|awk -F ":${obfs}" '{print $1}') + method=$(echo -e "${zuo}"|awk -F ":" '{print $NF}') + zuo=$(echo -e "${Config_info}"|awk -F ":${method}" '{print $1}') + protocol=$(echo -e "${zuo}"|awk -F ":" '{print $NF}') + zuo=$(echo -e "${Config_info}"|awk -F ":${protocol}" '{print $1}') + port=$(echo -e "${zuo}"|awk -F ":" '{print $NF}') + ip=$(echo -e "${Config_info}"|awk -F ":${port}" '{print $1}') + if [[ $(echo -e "${ip}"|wc -L) -le 8 ]]; then + echo -e "${Error} 错误,IP格式错误[ ${ip} ]" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + Continue_if + fi + fi + passwd=$(echo -e "${passwd_base64}"|base64 -d) + [[ ${debug} == [Yy] ]] && echo -e "${ip}\n${port}\n${method}\n${passwd}\n${protocol}\n${obfs}\n" + if [[ -z ${ip} ]] || [[ -z ${port} ]] || [[ -z ${method} ]] || [[ -z ${passwd} ]] || [[ -z ${protocol} ]] || [[ -z ${obfs} ]]; then + echo -e "${Error} 错误,有部分 账号参数为空![ ${ip} ,${port} ,${method} ,${passwd} ,${protocol} ,${obfs} ]" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + continue + fi + fi +} +Start_Client(){ + nohup python "${SSR_folder}/local.py" -b "127.0.0.1" -l "${local_port}" -s "${ip}" -p "${port}" -k "${passwd}" -m "${method}" -O "${protocol}" -o "${obfs}" > /dev/null 2>&1 & + sleep 2s + PID=$(ps -ef |grep -v grep | grep "local.py" | grep "${local_port}" |awk '{print $2}') + if [[ -z ${PID} ]]; then + echo -e "${Error} ShadowsocksR客户端 启动失败,请检查 !" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + continue + fi + fi +} +Socks5_test(){ + Test_results=$(curl --socks5 127.0.0.1:${local_port} -k -m ${Timeout} -s "${Test_URL}") + if [[ -z ${Test_results} ]]; then + echo -e "${Error} [${ip}] 检测失败,账号不可用 !" | tee -a ${log_file} + Config_Status="false" + else + echo -e "${Info} [${ip}] 检测成功,账号可用 !" | tee -a ${log_file} + Config_Status="true" + fi + kill -9 ${PID} + PID=$(ps -ef |grep -v grep | grep "local.py" | grep "${local_port}" |awk '{print $2}') + if [[ ! -z ${PID} ]]; then + echo -e "${Error} ShadowsocksR客户端 停止失败,请检查 !" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + continue + fi + fi + echo "---------------------------------------------------------" +} +rand(){ + min=1000 + max=$((2000-$min+1)) + num=$(date +%s%N) + echo $(($num%$max+$min)) +} +Test(){ + GO + Get_Like + cd ${SSR_folder} + local_port=$(rand) + for((integer = 1; integer <= "${Like_num}"; integer++)) + do + Analysis_Config "${integer}" + Start_Client + Socks5_test + done + exit_GG +} +Test_add(){ + GO + cd ${SSR_folder} + local_port=$(rand) + set_config_user + [[ $? == 2 ]] && analysis_type="add" && Analysis_Config "1" + Start_Client + Socks5_test + exit_GG +} +View_log(){ + [[ ! -e ${log_file} ]] && echo -e "${Error} 找不到 日志文件!(${log_file})" + cat "${log_file}" +} +action=$1 +debug=$2 +if [[ ${1} == "t" ]]; then + Test +elif [[ ${1} == "a" ]]; then + Test_add +elif [[ ${1} == "log" ]]; then + View_log +fi \ No newline at end of file diff --git a/ssr_ip_check.sh b/ssr_ip_check.sh new file mode 100644 index 0000000..9703942 --- /dev/null +++ b/ssr_ip_check.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS 6+/Debian 7+/Ubuntu 14.04+ +# Description: ShadowsocksR Port-IP Check +# Version: 1.0.6 +# Author: Toyo +# Blog: https://doub.io/ss-jc50/ +#================================================= +IP_threshold=3 +# IP阈值 +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" +Yellow_font_prefix="\033[33m" && Purple_font_prefix="\033[35m" +Sky_blue_font_prefix="\033[36m" && Blue_font_prefix="\033[34m" +Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" +# —————————————————————————————— +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + #bit=`uname -m` +} +check_pid(){ + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + [[ -z ${PID} ]] && echo -e "${Error} ShadowsocksR服务端没有运行,请检查 !" && exit 1 +} +scan_port_centos(){ + port=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $4}' |awk -F ":" '{print $NF}' |sort -u` + port_num=`echo "${port}" |wc -l` + [[ -z ${port} ]] && echo -e "${Error} 没有发现正在链接的端口 !" && exit 1 + [[ ${port_num} = 0 ]] && echo -e "${Error} 没有发现正在链接的端口 !" && exit 1 +} +scan_port_debian(){ + port=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $4}' |awk -F ":" '{print $NF}' |sort -u` + port_num=`echo "${port}" |wc -l` + [[ -z ${port} ]] && echo -e "${Error} 没有发现正在链接的端口 !" && exit 1 + [[ ${port_num} = 0 ]] && echo -e "${Error} 没有发现正在链接的端口 !" && exit 1 +} +scan_ip_centos(){ + ip=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + ip_num=`echo "${ip}" |wc -l` + [[ -z ${ip} ]] && echo -e "${Error} 没有发现正在链接的IP !" && exit 1 + [[ ${ip_num} = 0 ]] && echo -e "${Error} 没有发现正在链接的IP !" && exit 1 +} +scan_ip_debian(){ + ip=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + ip_num=`echo "${ip}" |wc -l` + [[ -z ${ip} ]] && echo -e "${Error} 没有发现正在链接的IP !" && exit 1 + [[ ${ip_num} = 0 ]] && echo -e "${Error} 没有发现正在链接的IP !" && exit 1 +} +check_threshold_centos(){ + for((integer = ${port_num}; integer >= 1; integer--)) + do + port_check=`echo "${port}" |sed -n "$integer"p` + ip_check_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep "${port_check}" | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u` + ip_num=`echo "${ip_check_1}" |wc -l` + if [[ ${action_2} == "y" ]]; then + get_IP_address + else + ip_check=`echo -e "\n${ip_check_1}"` + fi + [[ ${ip_num} -ge ${IP_threshold} ]] && echo -e " 端口: ${Red_font_prefix}${port_check}${Font_color_suffix} ,IP总数: ${Red_font_prefix}${ip_num}${Font_color_suffix} ,IP: ${Sky_blue_font_prefix}$(echo "${ip_check}")${Font_color_suffix}" + ip_check="" + done +} +check_threshold_debian(){ + [[ ${action_2} == "y" ]] && echo -e "${Tip} 检测IP归属地(ipip.net),如果IP较多,可能时间会比较长..." + for((integer = ${port_num}; integer >= 1; integer--)) + do + port_check=`echo "${port}" |sed -n "$integer"p` + ip_check_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep "${port_check}" |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u` + ip_num=`echo "${ip_check_1}" |wc -l` + if [[ ${action_2} == "y" ]]; then + get_IP_address + else + ip_check=`echo -e "\n${ip_check_1}"` + fi + [[ ${ip_num} -ge ${IP_threshold} ]] && echo -e " 端口: ${Red_font_prefix}${port_check}${Font_color_suffix} ,IP总数: ${Red_font_prefix}${ip_num}${Font_color_suffix} ,IP: ${Sky_blue_font_prefix}$(echo "${ip_check}")${Font_color_suffix}" + ip_check="" + done +} +get_IP_address(){ + #echo "port_check=${port_check}" + #echo "ip_check_1=${ip_check_1}" + if [[ ${ip_num} -ge ${IP_threshold} ]]; then + if [[ ! -z ${ip_check_1} ]]; then + #echo "ip_num=${ip_num}" + for((integer_1 = ${ip_num}; integer_1 >= 1; integer_1--)) + do + IP=`echo "${ip_check_1}" |sed -n "$integer_1"p` + #echo "IP=${IP}" + IP_address=`wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g'` + #echo "IP_address=${IP_address}" + ip_check="${ip_check}\n${IP}(${IP_address})" + #echo "ip_check=${ip_check}" + # echo "${IP}(${IP_address})" + sleep 1s + done + fi + fi +} +c_ssr(){ + check_pid + if [[ ${release} == "centos" ]]; then + scan_port_centos + echo -e "当前时间:${Yellow_font_prefix}$(date "+%Y-%m-%d %H:%M:%S %u %Z")${Font_color_suffix}\n" + check_threshold_centos + else + scan_port_debian + echo -e "当前时间:${Yellow_font_prefix}$(date "+%Y-%m-%d %H:%M:%S %u %Z")${Font_color_suffix}\n" + check_threshold_debian + fi +} +a_ssr(){ + check_pid + IP_threshold=1 + if [[ ${release} == "centos" ]]; then + scan_port_centos + scan_ip_centos + echo -e "当前时间:${Yellow_font_prefix}$(date "+%Y-%m-%d %H:%M:%S %u %Z")${Font_color_suffix} ,当前链接的端口共 ${Red_font_prefix}${port_num}${Font_color_suffix} ,当前链接的IP共 ${Red_font_prefix}${ip_num}${Font_color_suffix} \n" + check_threshold_centos + else + scan_port_debian + scan_ip_debian + echo -e "当前时间:${Yellow_font_prefix}$(date "+%Y-%m-%d %H:%M:%S %u %Z")${Font_color_suffix} ,当前链接的端口共 ${Red_font_prefix}${port_num}${Font_color_suffix} ,当前链接的IP共 ${Red_font_prefix}${ip_num}${Font_color_suffix} \n" + check_threshold_debian + fi +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && [[ ${release} != "centos" ]] && echo -e "${Error} 本脚本不支持当前系统 ${release} !" && exit 1 +action=$1 +action_2=$2 +[[ -z $1 ]] && action=c +case "$action" in + c|a) + ${action}_ssr + ;; + *) + echo -e "输入错误 ! + 用法: + c 检查并显示 超过IP阈值的端口 + a 显示当前 所有端口IP连接信息 + y 显示IP归属地(这是第二个参数如:bash ssr_ip_check.sh a y)" + ;; +esac \ No newline at end of file diff --git a/ssr_mujson_clear.sh b/ssr_mujson_clear.sh new file mode 100644 index 0000000..9ddf846 --- /dev/null +++ b/ssr_mujson_clear.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS 6+/Debian 7+/Ubuntu 14.04+ +# Description: ShadowsocksR mujson mode traffic clear script +# Version: 1.0.1 +# Author: Toyo +#================================================= +SSR_file="/usr/local/shadowsocksr" +# 这里填写 mujson_mgr.py 文件的上层绝对路径 +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Font_color_suffix="\033[0m" && Info="${Green_font_prefix}[信息]${Font_color_suffix}" && Error="${Red_font_prefix}[错误]${Font_color_suffix}" && Tip="${Green_font_prefix}[注意]${Font_color_suffix}" +check_ssr(){ + [[ ! -e ${SSR_file} ]] && echo -e "${Error} mujson_mgr.py 文件不存在或变量设定错误 !" && exit 1 +} +scan_port(){ + cd "${SSR_file}" + port_all=$(python "mujson_mgr.py" -l) + [[ -z ${port_all} ]] && echo -e "${Error} 没有发现任何端口(用户) !" && exit 1 + port_num=$(echo "${port_all}"|wc -l) + [[ ${port_num} = 0 ]] && echo -e "${Error} 没有发现任何端口(用户) !" && exit 1 +} +clear_traffic(){ + for((integer = 1; integer <= ${port_num}; integer++)) + do + port=$(echo -e "${port_all}"|sed -n "${integer}p"|awk '{print $NF}') + [[ -z ${port} ]] && echo -e "${Error} 获取的端口(用户)为空 !" && exit 1 + result=$(python "mujson_mgr.py" -c -p "${port}") + echo -e "${Info} 端口[${port}] 流量已清零 !" + done + echo -e "${Info} 所有端口(用户)流量已清零 !" +} +c_ssr(){ + check_ssr + scan_port + clear_traffic +} +action=$1 +[[ -z $1 ]] && action=c +case "$action" in + c) + ${action}_ssr + ;; + *) + echo -e "输入错误 ! + 用法: c 清空 所有用户已使用流量" + ;; +esac \ No newline at end of file diff --git a/ssr_old.sh b/ssr_old.sh new file mode 100644 index 0000000..fd756ee --- /dev/null +++ b/ssr_old.sh @@ -0,0 +1,1854 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS 6/Debian/Ubuntu 14.04+ +# Description: Install the ShadowsocksR server +# Version: 1.2.9 +# Author: Toyo +# Blog: https://doub.io/ss-jc42/ +#================================================= + +#ssr_pid="/var/run/shadowsocks.pid" +ssr_file="/etc/shadowsocksr" +ssr_ss_file="/etc/shadowsocksr/shadowsocks" +config_file="/etc/shadowsocksr/config.json" +config_user_file="/etc/shadowsocksr/user-config.json" +Libsodiumr_file="/root/libsodium" +Libsodiumr_ver="1.0.11" +auto_restart_cron="auto_restart_cron.sh" +Green_font_prefix="\033[32m" +Red_font_prefix="\033[31m" +Green_background_prefix="\033[42;37m" +Red_background_prefix="\033[41;37m" +Font_color_suffix="\033[0m" + +Separator_1="——————————————————————————————" +# 脚本文字变量(Translation) +Language(){ + if [[ ! -e "${PWD}/lang_en" ]]; then + Word_default="默认" + Word_unlimited="无限" + Word_user="用户" + Word_port="端口" + Word_pass="密码" + Word_method="加密" + Word_protocol="协议" + Word_obfs="混淆" + Word_ss_like=" SS 链接" + Word_ss_qr_code=" SS 二维码" + Word_ssr_like=" SSR 链接" + Word_ssr_qr_code=" SSR 二维码" + Word_single_port="单端口" + Word_multi_port="多端口" + Word_current_mode="当前模式" + Word_current_status="当前状态" + Word_number_of_devices="设备数" + Word_number_of_devices_limit="设备数限制" + Word_single_threaded_speed_limit="单线程限速" + Word_port_total_speed_limit="端口总限速" + Word_the_installation_is_complete="安装完成" + Word_installation_failed="安装失败" + Word_uninstall_is_complete="卸载完成" + Word_uninstall_cancelled="卸载已取消..." + Word_canceled="已取消..." + Word_cancel="取消" + Word_startup_failed="启动失败" + Word_stop_failing="停止失败" + Word_stopped="已停止" + Word_installed="已安装" + Word_not_installed="未安装" + Word_has_started="已启动" + Word_have_not_started="未启动" + Word_running="正在运行" + Word_not_running="没有运行" + Word_info="信息" + Word_error="错误" + Word_Prompt="提示" + Word_timing_interval="定时间隔" + Word_and="并" + Word_but="但" + Word_serverspeeder="锐速" + + Info_switch_single_port_mode="你确定要切换模式为 ${Word_single_port} ?[y/N]" + Info_switch_multi_port_mode="你确定要切换模式为 ${Word_multi_port} ?[y/N]" + Info_input_port="请输入ShadowsocksR ${Word_port} [1-65535]" + Info_input_pass="请输入ShadowsocksR ${Word_pass}" + Info_input_method="请输入数字 来选择ShadowsocksR ${Word_method}" + Info_input_protocol="请输入数字 来选择ShadowsocksR ${Word_protocol}( auth_aes128_* 以后的协议不再支持 兼容原版 )" + Info_input_number_of_devices="请输入 ShadowsocksR账号欲限制的设备数 (${Green_font_prefix} auth_* 系列协议 不兼容原版才有效 ${Font_color_suffix})" + Prompt_number_of_devices="${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix}该设备数限制,指的是每个端口同一时间能链接的客户端数量(多端口模式,每个端口都是独立计算)。" + Info_input_obfs="请输入数字 来选择ShadowsocksR ${Word_obfs}" + Info_protocol_compatible="是否设置 协议 兼容原版 ( _compatible )? [Y/n] :" + Info_obfs_compatible="是否设置 混淆 兼容原版 ( _compatible )? [Y/n] :" + Info_protocol_obfs_compatible="是否设置 协议/混淆 兼容原版 ( _compatible )? [Y/n] :" + Info_input_single_threaded_speed_limit="请输入 你要设置的每个端口 单线程 限速上限(单位:KB/S)" + Prompt_input_single_threaded_speed_limit="${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix}这个指的是,每个端口 单线程的限速上限,多线程即无效。" + Info_total_port_speed_limit="请输入 你要设置的每个端口 总速度 限速上限(单位:KB/S)" + Prompt_total_port_speed_limit="${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix}这个指的是,每个端口 总速度 限速上限,单个端口整体限速。" + + Info_input_modify_the_type="请输入数字 来选择你要修改的类型 : +1. 修改 ${Word_port}/${Word_pass} +2. 修改 ${Word_method}/${Word_protocol}/${Word_obfs}" + info_input_select_user_id_modified="请选择并输入 你要修改的用户前面的数字 :" + Info_input_select_user_id_del="请选择并输入 你要删除的用户前面的数字 :" + Prompt_method_protocol_obfs_modified="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ShadowsocksR ${Word_method}/${Word_protocol}/${Word_obfs}已修改!" + + Info_jq_installation_is_complete="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} JSON解析器 JQ 安装完成,继续..." + Info_jq_is_installed="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} 检测到 JSON解析器 JQ 已安装,继续..." + Info_uninstall_ssr="确定要卸载 ShadowsocksR ? [y/N]" + Info_uninstall_server_speeder="确定要卸载 ${Word_serverspeeder} ? [y/N]" + Info_install_bbr="确定要安装 BBR ? [y/n]" + Info_install_bbr_0="${Green_font_prefix} [安装前 请注意] ${Font_color_suffix} +1. 安装开启BBR,需要更换内核,存在更换失败等风险(重启后无法开机) +2. 本脚本仅支持 Debian / Ubuntu 系统更换内核,OpenVZ虚拟化 不支持更换内核 ! +3. Debian 更换内核过程中会提示 [ 是否终止卸载内核 ] ,请选择 ${Green_font_prefix} NO ${Font_color_suffix} +4. 安装BBR并重启后,需要重新运行脚本开启BBR ${Green_font_prefix} bash bbr.sh start ${Font_color_suffix}" + Info_input_set_crontab_interval="请输入ShadowsocksR 定时重启的间隔" + Info_input_set_crontab_interval_default="每天凌晨2点0分 [0 2 * * *]" + Info_set_crontab_interval_0="${Green_font_prefix} 格式说明 : ${Font_color_suffix} + 格式: ${Green_font_prefix} * * * * * ${Font_color_suffix},分别对应 ${Green_font_prefix} 分钟 小时 日 月 星期 ${Font_color_suffix} + 示例: ${Green_font_prefix} 30 2 * * * ${Font_color_suffix},每天 凌晨2点30分时 重启一次 + 示例: ${Green_font_prefix} 30 2 */3 * * ${Font_color_suffix},每隔3天 凌晨2点30分时 重启一次 + 示例: ${Green_font_prefix} 30 */2 * * * ${Font_color_suffix},每天 每隔两小时 在30分时 重启一次" + Info_no_cron_installed="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} 检测到没有安装 corn ,开始安装..." + Info_input_set_cron="请输入数字 来选择你要做什么 +1. 添加 定时任务 +2. 删除 定时任务 + ${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix}暂时只能添加设置一个定时重启任务。" + Info_set_corn_status="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} corn 当前没有定时重启任务 !" + Info_set_corn_del_success="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} corn 删除定时重启任务成功 !" + Info_set_corn_add_success="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ShadowsocksR 定时重启任务添加成功 !" + Info_limit_the_number_of_devices="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ShadowsocksR 设备数限制 已修改 !" + Info_port_speed_limit="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ShadowsocksR 端口限速 已修改 !" + Info_switch_language_english="Are you sure you want to switch the script language to English ? [y/n]" + Info_switch_language_chinese="确定要切换脚本语言为 中文 ? [y/n]" + Info_switch_language_1="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} Re-run the script to see the language after switching !" + + Errpr_input_num_error="${Red_font_prefix}[${Word_error}]${Font_color_suffix} 请输入正确的数字 !" + Error_not_install_ssr="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} 没有发现安装ShadowsocksR,请检查 !" + Error_ssr_installed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR已安装 !" + Error_no_multi_port_users_were_found="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} 没有发现 多端口用户,请检查 !" + Error_jq_installation_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} JSON解析器 JQ 安装失败 !" + Error_does_not_support_the_system="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} 本脚本不支持当前系统 !" + Error_ssr_download_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR 下载失败 !" + Error_ssr_failed_to_start="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR 启动失败 !" + Error_the_current_mode_is_single_port="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} 当前模式为 单端口,请检查 !" + Error_the_current_mode_is_multi_port="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} 当前模式为 多端口,请检查 !" + Error_multi_port_user_remaining_one="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} 当前多端口用户 仅剩一个,无法删除 !" + Error_startup_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR 启动失败, 请检查日志 !" + Error_no_log_found="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} 没有找到日志文件,请检查 !" + Error_server_speeder_installed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ${Word_serverspeeder} 已安装 !" + Error_server_speeder_installation_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ${Word_serverspeeder} 安装失败 !" + Error_server_speeder_not_installed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ${Word_serverspeeder} 没有安装,请检查 !" + Error_cron_installation_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} corn 安装失败 !" + Error_set_corn_del_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} corn 删除定时重启任务失败 !" + Error_set_corn_add_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR 定时重启任务添加失败 !" + Error_set_corn_Write_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR 定时重启脚本写入失败 !" + Error_limit_the_number_of_devices_1="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR当前协议为 兼容原版(_compatible),限制设备数无效 !" + Error_limit_the_number_of_devices_2="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR当前协议为 原版(origin),限制设备数无效 !" + + Prompt_method_libsodium="${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix}chacha20*等加密方式 需要安装 libsodium 支持库,否则会启动失败 !" + Prompt_any_key="请按任意键继续,如有配置错误请使用 Ctrl+C 退出。" + Prompt_check_if_the_configuration_is_incorrect="请检查Shadowsocks账号配置是否有误 !" + Prompt_your_account_configuration="你的ShadowsocksR 账号配置 :" + Prompt_ssr_status_on="ShadowsocksR 正在运行 !" + Prompt_ssr_status_off="ShadowsocksR 没有运行 !" + Prompt_tip="${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix} + 浏览器中,打开二维码链接,就可以看到二维码图片。 + 协议和混淆后面的[ _compatible ],指的是兼容原版Shadowsocks协议/混淆。" + Prompt_total_number_of_users="当前用户配置总数为:" + Prompt_total_number_of_ip="当前链接的IP总数为:" + Prompt_the_currently_connected_ip="当前连接的IP:" + Prompt_total_number_of_ip_number="IP数量:" + Prompt_modify_multi_port_user="多端口用户已修改 !" + Prompt_add_multi_port_user="多端口用户已添加 !" + Prompt_del_multi_port_user="多端口用户已删除 !" + Prompt_log="使用 ${Red_font_prefix} Ctrl+C ${Font_color_suffix} 键退出查看日志 !" + Prompt_switch_language_chinese=" The current scripting language: English" + Prompt_switch_language_english=" 当前脚本语言为: 中文" + +#菜单 + Menu_prompt_1="请输入一个数字来选择对应的选项" + Menu_prompt_2="(请输入数字 0-27): " + Menu_prompt_3="请选择并输入数字 0-27" + Menu_options="${Green_font_prefix} 1. ${Font_color_suffix}安装 ShadowsocksR +${Green_font_prefix} 2. ${Font_color_suffix}安装 libsodium(chacha20) +${Green_font_prefix} 3. ${Font_color_suffix}显示 单/多端口 账号信息 +${Green_font_prefix} 4. ${Font_color_suffix}显示 单/多端口 连接信息 +${Green_font_prefix} 5. ${Font_color_suffix}修改 单端口用户配置 +${Green_font_prefix} 6. ${Font_color_suffix}手动 修改 用户配置 +${Green_font_prefix} 7. ${Font_color_suffix}卸载 ShadowsocksR +${Green_font_prefix} 8. ${Font_color_suffix}更新 ShadowsocksR +—————————————————— +${Green_font_prefix} 9. ${Font_color_suffix}切换 单/多端口 模式 +${Green_font_prefix} 10. ${Font_color_suffix}添加 多端口用户配置 +${Green_font_prefix} 11. ${Font_color_suffix}修改 多端口用户配置 +${Green_font_prefix} 12. ${Font_color_suffix}删除 多端口用户配置 +—————————————————— +${Green_font_prefix} 13. ${Font_color_suffix}启动 ShadowsocksR +${Green_font_prefix} 14. ${Font_color_suffix}停止 ShadowsocksR +${Green_font_prefix} 15. ${Font_color_suffix}重启 ShadowsocksR +${Green_font_prefix} 16. ${Font_color_suffix}查看 ShadowsocksR 状态 +${Green_font_prefix} 17. ${Font_color_suffix}查看 ShadowsocksR 日志 +—————————————————— +${Green_font_prefix} 18. ${Font_color_suffix}安装 ${Word_serverspeeder} +${Green_font_prefix} 19. ${Font_color_suffix}停止 ${Word_serverspeeder} +${Green_font_prefix} 20. ${Font_color_suffix}重启 ${Word_serverspeeder} +${Green_font_prefix} 21. ${Font_color_suffix}查看 ${Word_serverspeeder} 状态 +${Green_font_prefix} 22. ${Font_color_suffix}卸载 ${Word_serverspeeder} +——————————————————" + Menu_options_bbr="${Green_font_prefix} 23. ${Font_color_suffix}安装 BBR(需更换内核, 存在风险)" + Menu_options_other="${Green_font_prefix} 24. ${Font_color_suffix}封禁 BT/PT/垃圾邮件(SPAM) +${Green_font_prefix} 25. ${Font_color_suffix}设置 ShadowsocksR 定时重启 +${Green_font_prefix} 26. ${Font_color_suffix}设置 ShadowsocksR 设备数限制 +${Green_font_prefix} 27. ${Font_color_suffix}设置 ShadowsocksR 速度限制 +—————————————————— +${Green_font_prefix} 0. ${Font_color_suffix}The scripting language is English + 注意事项: ${Word_serverspeeder}/BBR 不支持 OpenVZ !" + else + Word_default="default" + Word_unlimited="unlimited" + Word_user="user" + Word_port="port" + Word_pass="pass" + Word_method="method" + Word_protocol="protocol" + Word_obfs="obfs" + Word_ss_like=" SS Like" + Word_ss_qr_code=" SS QRcode" + Word_ssr_like=" SSR Like" + Word_ssr_qr_code=" SSR QRcode" + Word_single_port="single_port" + Word_multi_port="multi_port" + Word_current_mode="Current_mode" + Word_current_status="Current_status" + Word_number_of_devices="number of devices" + Word_number_of_devices_limit="number of devices limit" + Word_single_threaded_speed_limit="single-threaded speed limit" + Word_port_total_speed_limit="port total speed limit" + Word_the_installation_is_complete="The installation is complete" + Word_installation_failed="Installation failed" + Word_uninstall_is_complete="Uninstall is complete" + Word_uninstall_cancelled="Uninstall cancelled..." + Word_canceled="Canceled..." + Word_cancel="cancel" + Word_startup_failed="Startup failed" + Word_stop_failing="Stop failing" + Word_stopped="Stopped" + Word_installed="Installed" + Word_not_installed="Not installed" + Word_has_started="Has started" + Word_have_not_started="Have not started" + Word_running="Running" + Word_not_running="Not running" + Word_info="Info" + Word_error="Error" + Word_Prompt="Prompt" + Word_timing_interval="Timing interval" + Word_and="and" + Word_but="but" + Word_serverspeeder="ServerSpeeder" + + Info_switch_single_port_mode="Are you sure you want to switch mode to ${Word_single_port} ?[y/N]" + Info_switch_multi_port_mode="Are you sure you want to switch mode to Word_multi_port ?[y/N]" + Info_input_port="Please enter ShadowsocksR ${Word_port} [1-65535]" + Info_input_pass="Please enter ShadowsocksR ${Word_pass}" + Info_input_method="Please enter the number to select ShadowsocksR ${Word_method}" + Info_input_protocol="Please enter the number to select ShadowsocksR ${Word_protocol}( auth_aes128_* 以后的协议不再支持 兼容原版 )" + Info_input_number_of_devices="Please enter the number of devices that ShadowsocksR ports want to restrict (${Green_font_prefix} Auth_ * protocol is not compatible with the original version is valid! ${Font_color_suffix})" + Prompt_number_of_devices="${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix}The number of devices is limited, referring to the number of clients that can be linked per port (multi_port mode, each port is independently calculated)." + Info_input_obfs="Please enter the number to select ShadowsocksR ${Word_obfs}" + Info_protocol_compatible="It is compatible with the original set protocol? ( _compatible ) [Y/n] :" + Info_obfs_compatible="It is compatible with the original set obfs? ( _compatible ) [Y/n] :" + Info_protocol_obfs_compatible="It is compatible with the original set protocol / obfs? ( _compatible ) [Y/n] :" + Info_input_single_threaded_speed_limit="Please enter the maximum speed of each port you want to set for a single thread (in KB / S)" + Prompt_input_single_threaded_speed_limit="${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix}This refers to the limit of each port single-threaded limit, multi-threaded that is invalid." + Info_total_port_speed_limit="Please enter the maximum speed limit for each port you want to set (in KB / S)" + Prompt_total_port_speed_limit="${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix}This refers to the total speed limit per port, the overall speed limit for a single port." + + Info_input_modify_the_type="Please enter a number to select the type you want to modify : +1. Modify ${Word_port}/${Word_pass} +2. Modify ${Word_method}/${Word_protocol}/${Word_obfs}" + info_input_select_user_id_modified="Please select and enter the user ID you want to modify :" + Info_input_select_user_id_del="Please select and enter the user ID you want to delete :" + Prompt_method_protocol_obfs_modified="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ShadowsocksR ${Word_method}/${Word_protocol}/${Word_obfs} has been modified!" + + Info_jq_installation_is_complete="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} JSON parser JQ has been installed, continue ..." + Info_jq_is_installed="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} JSON parser JQ installed, continues ..." + Info_uninstall_ssr="Sure you want to uninstall ShadowsocksR ? [y/N]" + Info_uninstall_server_speeder="Sure you want to uninstall ${Word_serverspeeder} ? [y/N]" + Info_install_bbr="Sure you want to install the BBR ? [y/n]" + Info_install_bbr_0="${Green_font_prefix} [Before installation, please note the following points] ${Font_color_suffix} +1. Install BBR, need to replace the kernel, there is a risk of replacement failure (can not boot) ! +2. This script only supports Debian / Ubuntu system replacement kernel, OpenVZ virtualization does not support the replacement of the kernel ! +3. In the process of replacing the kernel, you will be prompted to [ terminate the uninstall kernel ], Please select [${Green_font_prefix} NO ${Font_color_suffix}]! +4. After installing BBR and restart, you need to re-run the script to open BBR [${Green_font_prefix} bash bbr.sh start ${Font_color_suffix}] !" + Info_input_set_crontab_interval="Please enter the interval at which ShadowsocksR reboots regularly" + Info_input_set_crontab_interval_default="Every morning at 2:30 am [0 2 * * *]" + Info_set_crontab_interval_0="${Green_font_prefix} Format Description : ${Font_color_suffix} + Format: ${Green_font_prefix} * * * * * ${Font_color_suffix}, corresponding to ${Green_font_prefix} minutes / hour / day / month / week ${Font_color_suffix} + Example: ${Green_font_prefix}30 2 * * * ${Font_color_suffix}, every day, 2:30 am, restart once + Example: ${Green_font_prefix}30 2 * / 3 * * ${Font_color_suffix}, every 3 days, 2:30 am, restart once + Example: ${Green_font_prefix}30 * / 2 * * * ${Font_color_suffix}, every day, every two hours at 30 minutes, restart once" + Info_no_cron_installed="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} Detected no installation of corn, started to install ..." + Info_input_set_cron="Please enter a number to choose what you want to do +1. Add a timed task +2. Delete the timed task + ${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix}Currently only add a regular restart task." + Info_set_corn_status="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} There are currently no scheduled reboot task !" + Info_set_corn_del_success="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} Corn Remove the timing reboot mission success !" + Info_set_corn_add_success="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} Timed restart task was added successfully !" + Info_limit_the_number_of_devices="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ShadowsocksR device limit has been modified !" + Info_port_speed_limit="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ShadowsocksR port speed limit has been modified !" + Info_switch_language_english="Are you sure you want to switch the script language to English ? [y/n]" + Info_switch_language_chinese="确定要切换脚本语言为 中文 ? [y/n]" + Info_switch_language_1="${Green_font_prefix} [${Word_info}] ${Font_color_suffix} 重新运行脚本即可看到切换后的语言 !" + + Errpr_input_num_error="${Red_font_prefix}[${Word_error}]${Font_color_suffix} Please enter the correct number !" + Error_not_install_ssr="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} No installation ShadowsocksR, please check !" + Error_ssr_installed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR is installed !" + Error_no_multi_port_users_were_found="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} Do not find multi_port users, please check !" + Error_jq_installation_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} JSON parser JQ installation failed !" + Error_does_not_support_the_system="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} This script does not support the current system !" + Error_ssr_download_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR download failed !" + Error_ssr_failed_to_start="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR failed to start !" + Error_the_current_mode_is_single_port="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} The current mode is single port, please check !" + Error_the_current_mode_is_multi_port="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} The current mode is multi_port, please check !" + Error_multi_port_user_remaining_one="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} The current multi_port users only one, can not be deleted !" + Error_startup_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR failed to start, please check the log !" + Error_no_log_found="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} Did not find the log file, please check it out !" + Error_server_speeder_installed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ${Word_serverspeeder} installed !" + Error_server_speeder_installation_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ${Word_serverspeeder} installation failed !" + Error_server_speeder_not_installed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ${Word_serverspeeder} is not installed, please check !" + Error_cron_installation_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} Corn installation failed !" + Error_set_corn_del_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} Delete the scheduled reboot task fails !" + Error_set_corn_add_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} Timed restart task failed to add !" + Error_set_corn_Write_failed="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} Timed restart script write failed !" + Error_limit_the_number_of_devices_1="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} The current protocol is compatible with the original (_compatible), limit the number of devices is invalid !" + Error_limit_the_number_of_devices_2="${Red_font_prefix} [${Word_error}] ${Font_color_suffix} The current agreement is the original (origin), limit the number of devices is invalid !" + + Prompt_method_libsodium="${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix} Chacha20-* and other encryption methods need to install libsodium support library, otherwise it will fail to start !" + Prompt_any_key="Please press any key to continue, if the configuration error please use Ctrl + C exit." + Prompt_check_if_the_configuration_is_incorrect="请检查Shadowsocks账号配置是否有误 !" + Prompt_your_account_configuration="Your ShadowsocksR account configuration :" + Prompt_ssr_status_on="ShadowsocksR is running !" + Prompt_ssr_status_off="ShadowsocksR is not running !" + Prompt_tip="${Green_font_prefix} ${Word_Prompt}: ${Font_color_suffix} + Browser, open the QRcode link, you can see the QRcode picture. + Protocols and confusion behind [_compatible], referring to the original compatible Shadowsocks protocol / obfs." + Prompt_total_number_of_users="Current total number of users:" + Prompt_total_number_of_ip="The total number of currently linked IPs is:" + Prompt_the_currently_connected_ip="The currently connected IP:" + Prompt_total_number_of_ip_number="IP number:" + Prompt_modify_multi_port_user="multi_port users have modified !" + Prompt_add_multi_port_user="multi_port users have added !" + Prompt_del_multi_port_user="multi_port user has been deleted !" + Prompt_log="Use ${Red_font_prefix} Ctrl+C ${Font_color_suffix} to exit View Log !" + Prompt_switch_language_chinese=" The current scripting language: English" + Prompt_switch_language_english=" 当前脚本语言为: 中文" + +#菜单 + Menu_prompt_1="Please enter a number to select the corresponding option" + Menu_prompt_2="(Please enter numbers 0-27): " + Menu_prompt_3="Please select and enter numbers 0-27 !" + Menu_options="${Green_font_prefix} 1. ${Font_color_suffix}Install Shadowsocks +${Green_font_prefix} 2. ${Font_color_suffix}Install libsodium (chacha20) +${Green_font_prefix} 3. ${Font_color_suffix}Display account information +${Green_font_prefix} 4. ${Font_color_suffix}Display connection information +${Green_font_prefix} 5. ${Font_color_suffix}Modify single-port user configuration +${Green_font_prefix} 6. ${Font_color_suffix}Manually modify user profiles +${Green_font_prefix} 7. ${Font_color_suffix}Uninstall Shadowsocks +${Green_font_prefix} 8. ${Font_color_suffix}Update Shadowsocks +—————————————————— +${Green_font_prefix} 9. ${Font_color_suffix}Switch single / multi port mode +${Green_font_prefix} 10. ${Font_color_suffix}Add a multi_port user configuration +${Green_font_prefix} 11. ${Font_color_suffix}Modify multi_port user configuration +${Green_font_prefix} 12. ${Font_color_suffix}Remove the multi_port user configuration +—————————————————— +${Green_font_prefix} 13. ${Font_color_suffix}Start Shadowsocks +${Green_font_prefix} 14. ${Font_color_suffix}Stop Shadowsocks +${Green_font_prefix} 15. ${Font_color_suffix}Restart Shadowsocks +${Green_font_prefix} 16. ${Font_color_suffix}View the ShadowsocksR state +${Green_font_prefix} 17. ${Font_color_suffix}View the ShadowsocksR log +—————————————————— +${Green_font_prefix} 18. ${Font_color_suffix}Install ${Word_serverspeeder} +${Green_font_prefix} 19. ${Font_color_suffix}Stop ${Word_serverspeeder} +${Green_font_prefix} 20. ${Font_color_suffix}Restart ${Word_serverspeeder} +${Green_font_prefix} 21. ${Font_color_suffix}View the ${Word_serverspeeder} state +${Green_font_prefix} 22. ${Font_color_suffix}Uninstall ${Word_serverspeeder} +——————————————————" + Menu_options_bbr="${Green_font_prefix} 23. ${Font_color_suffix}Install BBR(Need to replace the kernel, there is a risk)" + Menu_options_other="${Green_font_prefix} 24. ${Font_color_suffix}Banned BT/PT/SPAM +${Green_font_prefix} 25. ${Font_color_suffix}Set ShadowsocksR scheduled reboot +${Green_font_prefix} 26. ${Font_color_suffix}Set the ShadowsocksR device limit +${Green_font_prefix} 27. ${Font_color_suffix}Set the ShadowsocksR speed limit +—————————————————— +${Green_font_prefix} 0. ${Font_color_suffix}切换 脚本语言为中文 + Note: ${Word_serverspeeder} / BBR does not support OpenVZ !" + fi + Menu_status_1=" ${Word_current_status}: ${Green_font_prefix} ${Word_installed} ${Font_color_suffix} ${Word_and} ${Green_font_prefix} ${Word_has_started} ${Font_color_suffix}" + Menu_status_2=" ${Word_current_status}: ${Green_font_prefix} ${Word_installed} ${Font_color_suffix} ${Word_but} ${Red_font_prefix} ${Word_have_not_started} ${Font_color_suffix}" + Menu_status_3=" ${Word_current_status}: ${Red_font_prefix} ${Word_not_installed} ${Font_color_suffix}" + Menu_mode_1=" ${Word_current_mode}: ${Green_font_prefix} ${Word_single_port} ${Font_color_suffix}" + Menu_mode_2=" ${Word_current_mode}: ${Green_font_prefix} ${Word_multi_port} ${Font_color_suffix}" +} +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + #bit=`uname -m` +} +SSR_install_status(){ + [[ ! -e $config_user_file ]] && echo -e "${Error_not_install_ssr}" && exit 1 +} +#获取IP +getIP(){ + ip=`curl -m 10 -s "ipinfo.io/ip"` + #ip=`wget -qO- -t1 -T2 ipinfo.io/ip` + [[ -z "$ip" ]] && ip="VPS_IP" +} +#获取用户账号信息 +getUser(){ + port=`jq '.server_port' ${config_user_file}` + password=`jq '.password' ${config_user_file} | sed 's/^.//;s/.$//'` + method=`jq '.method' ${config_user_file} | sed 's/^.//;s/.$//'` + protocol=`jq '.protocol' ${config_user_file} | sed 's/^.//;s/.$//'` + obfs=`jq '.obfs' ${config_user_file} | sed 's/^.//;s/.$//'` + protocol_param=`jq '.protocol_param' ${config_user_file} | sed 's/^.//;s/.$//'` + speed_limit_per_con=`jq '.speed_limit_per_con' ${config_user_file}` + speed_limit_per_user=`jq '.speed_limit_per_user' ${config_user_file}` +} +# 设置 端口和密码 +set_port_pass(){ + #设置端口 + while true + do + echo -e "${Info_input_port}" + stty erase '^H' && read -p "(${Word_default}: 2333):" ssport + [[ -z "$ssport" ]] && ssport="2333" + expr ${ssport} + 0 &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ssport} -ge 1 ]] && [[ ${ssport} -le 65535 ]]; then + echo && echo ${Separator_1} && echo -e " ${Word_port} : ${Green_font_prefix}${ssport}${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo -e "${Errpr_input_num_error}" + fi + else + echo -e "${Errpr_input_num_error}" + fi + done + #设置密码 + echo "${Info_input_pass}:" + stty erase '^H' && read -p "(${Word_default}: doub.io):" sspwd + [[ -z "${sspwd}" ]] && sspwd="doub.io" + echo && echo ${Separator_1} && echo -e " ${Word_pass} : ${Green_font_prefix}${sspwd}${Font_color_suffix}" && echo ${Separator_1} && echo +} +# 设置 加密方式、协议和混淆等 +set_others(){ + #设置加密方式 + echo "${Info_input_method}" + echo " 1. rc4-md5" + echo " 2. aes-128-ctr" + echo " 3. aes-256-ctr" + echo " 4. aes-256-cfb" + echo " 5. aes-256-cfb8" + echo " 6. camellia-256-cfb" + echo " 7. chacha20" + echo " 8. chacha20-ietf" + echo -e "${Prompt_method_libsodium}" + echo + stty erase '^H' && read -p "(${Word_default}: 2. aes-128-ctr):" ssmethod + [[ -z "${ssmethod}" ]] && ssmethod="2" + if [[ ${ssmethod} == "1" ]]; then + ssmethod="rc4-md5" + elif [[ ${ssmethod} == "2" ]]; then + ssmethod="aes-128-ctr" + elif [[ ${ssmethod} == "3" ]]; then + ssmethod="aes-256-ctr" + elif [[ ${ssmethod} == "4" ]]; then + ssmethod="aes-256-cfb" + elif [[ ${ssmethod} == "5" ]]; then + ssmethod="aes-256-cfb8" + elif [[ ${ssmethod} == "6" ]]; then + ssmethod="camellia-256-cfb" + elif [[ ${ssmethod} == "7" ]]; then + ssmethod="chacha20" + elif [[ ${ssmethod} == "8" ]]; then + ssmethod="chacha20-ietf" + else + ssmethod="aes-128-ctr" + fi + echo && echo ${Separator_1} && echo -e " ${Word_method} : ${Green_font_prefix}${ssmethod}${Font_color_suffix}" && echo ${Separator_1} && echo + #设置协议 + echo "${Info_input_protocol}" + echo " 1. origin" + echo " 2. auth_sha1_v4" + echo " 3. auth_aes128_md5" + echo " 4. auth_aes128_sha1" + echo + stty erase '^H' && read -p "(${Word_default}: 2. auth_sha1_v4):" ssprotocol + [[ -z "${ssprotocol}" ]] && ssprotocol="2" + if [[ ${ssprotocol} == "1" ]]; then + ssprotocol="origin" + elif [[ ${ssprotocol} == "2" ]]; then + ssprotocol="auth_sha1_v4" + elif [[ ${ssprotocol} == "3" ]]; then + ssprotocol="auth_aes128_md5" + elif [[ ${ssprotocol} == "4" ]]; then + ssprotocol="auth_aes128_sha1" + else + ssprotocol="auth_sha1_v4" + fi + echo && echo ${Separator_1} && echo -e " ${Word_protocol} : ${Green_font_prefix}${ssprotocol}${Font_color_suffix}" && echo ${Separator_1} && echo + #设置混淆 + echo "${Info_input_obfs}" + echo " 1. plain" + echo " 2. http_simple" + echo " 3. http_post" + echo " 4. random_head" + echo " 5. tls1.2_ticket_auth" + echo + stty erase '^H' && read -p "(${Word_default}: 5. tls1.2_ticket_auth):" ssobfs + [[ -z "${ssobfs}" ]] && ssobfs="5" + if [[ ${ssobfs} == "1" ]]; then + ssobfs="plain" + elif [[ ${ssobfs} == "2" ]]; then + ssobfs="http_simple" + elif [[ ${ssobfs} == "3" ]]; then + ssobfs="http_post" + elif [[ ${ssobfs} == "4" ]]; then + ssobfs="random_head" + elif [[ ${ssobfs} == "5" ]]; then + ssobfs="tls1.2_ticket_auth" + else + ssobfs="tls1.2_ticket_auth" + fi + echo && echo ${Separator_1} && echo -e " ${Word_obfs} : ${Green_font_prefix}${ssobfs}${Font_color_suffix}" && echo ${Separator_1} && echo + #询问是否设置 ${Word_obfs} 兼容原版 + if [[ ${ssprotocol} != "origin" ]]; then + if [[ ${ssobfs} != "plain" ]]; then + if [[ ${ssprotocol} == "verify_sha1" ]] || [[ ${ssprotocol} == "auth_sha1_v2" ]] || [[ ${ssprotocol} == "auth_sha1_v4" ]]; then + stty erase '^H' && read -p "${Info_protocol_obfs_compatible}" yn1 + [[ -z "${yn1}" ]] && yn1="y" + [[ $yn1 == [Yy] ]] && ssobfs=${ssobfs}"_compatible" && ssprotocol=${ssprotocol}"_compatible" + else + stty erase '^H' && read -p "${Info_obfs_compatible}" yn1 + [[ -z "${yn1}" ]] && yn1="y" + [[ $yn1 == [Yy] ]] && ssobfs=${ssobfs}"_compatible" + fi + else + if [[ ${ssprotocol} == "verify_sha1" ]] || [[ ${ssprotocol} == "auth_sha1_v2" ]] || [[ ${ssprotocol} == "auth_sha1_v4" ]]; then + stty erase '^H' && read -p "${Info_protocol_compatible}" yn1 + [[ -z "${yn1}" ]] && yn1="y" + [[ $yn1 == [Yy] ]] && ssprotocol=${ssprotocol}"_compatible" + fi + fi + else + if [[ ${ssobfs} != "plain" ]]; then + stty erase '^H' && read -p "${Info_obfs_compatible}" yn1 + [[ -z "${yn1}" ]] && yn1="y" + [[ $yn1 == [Yy] ]] && ssobfs=${ssobfs}"_compatible" + fi + fi + if [[ ${ssprotocol} != "origin" ]]; then + while true + do + echo + echo -e "${Info_input_number_of_devices}" + echo -e "${Prompt_number_of_devices}" + stty erase '^H' && read -p "(${Word_default}: ${Word_unlimited}):" ssprotocol_param + [[ -z "$ssprotocol_param" ]] && ssprotocol_param="" && break + expr ${ssprotocol_param} + 0 &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ssprotocol_param} -ge 1 ]] && [[ ${ssprotocol_param} -le 99999 ]]; then + echo && echo ${Separator_1} && echo -e " ${Word_number_of_devices} : ${Green_font_prefix}${ssprotocol_param}${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo "${Errpr_input_num_error}" + fi + else + echo "${Errpr_input_num_error}" + fi + done + fi + # 设置单线程限速 + while true + do + echo + echo -e "${Info_input_single_threaded_speed_limit}" + echo -e "${Prompt_input_single_threaded_speed_limit}" + stty erase '^H' && read -p "(${Word_default}: ${Word_unlimited}):" ssspeed_limit_per_con + [[ -z "$ssspeed_limit_per_con" ]] && ssspeed_limit_per_con=0 && break + expr ${ssspeed_limit_per_con} + 0 &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ssspeed_limit_per_con} -ge 1 ]] && [[ ${ssspeed_limit_per_con} -le 99999 ]]; then + echo && echo ${Separator_1} && echo -e " ${Word_single_threaded_speed_limit} : ${Green_font_prefix}${ssspeed_limit_per_con} KB/S${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo "${Errpr_input_num_error}" + fi + else + echo "${Errpr_input_num_error}" + fi + done + # 设置端口总限速 + while true + do + echo + echo -e "${Info_total_port_speed_limit}" + echo -e "${Prompt_total_port_speed_limit}" + stty erase '^H' && read -p "(${Word_default}: ${Word_unlimited}):" ssspeed_limit_per_user + [[ -z "$ssspeed_limit_per_user" ]] && ssspeed_limit_per_user=0 && break + expr ${ssspeed_limit_per_user} + 0 &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ssspeed_limit_per_user} -ge 1 ]] && [[ ${ssspeed_limit_per_user} -le 99999 ]]; then + echo && echo ${Separator_1} && echo -e " ${Word_port_total_speed_limit} : ${Green_font_prefix}${ssspeed_limit_per_user} KB/S${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo "${Errpr_input_num_error}" + fi + else + echo "${Errpr_input_num_error}" + fi + done +} +#设置用户账号信息 +setUser(){ + set_port_pass + set_others + #最后确认 + [[ "${ssprotocol_param}" == "" ]] && ssprotocol_param="0(${Word_unlimited})" + echo && echo ${Separator_1} + echo " ${Prompt_check_if_the_configuration_is_incorrect}" && echo + echo -e " ${Word_port}\t : ${Green_font_prefix}${ssport}${Font_color_suffix}" + echo -e " ${Word_pass}\t : ${Green_font_prefix}${sspwd}${Font_color_suffix}" + echo -e " ${Word_method}\t : ${Green_font_prefix}${ssmethod}${Font_color_suffix}" + echo -e " ${Word_protocol}\t : ${Green_font_prefix}${ssprotocol}${Font_color_suffix}" + echo -e " ${Word_obfs}\t : ${Green_font_prefix}${ssobfs} ${Font_color_suffix}" + echo -e " ${Word_number_of_devices_limit} : ${Green_font_prefix}${ssprotocol_param}${Font_color_suffix}" + echo -e " ${Word_number_of_devices_limit} : ${Green_font_prefix}${ssspeed_limit_per_con} KB/S${Font_color_suffix}" + echo -e " ${Word_port_total_speed_limit} : ${Green_font_prefix}${ssspeed_limit_per_user} KB/S${Font_color_suffix}" + echo ${Separator_1} && echo + stty erase '^H' && read -p "${Prompt_any_key}" var + [[ "${ssprotocol_param}" = "0(${Word_unlimited})" ]] && ssprotocol_param="" +} +ss_link_qr(){ + SSbase64=`echo -n "${method}:${password}@${ip}:${port}" | base64 | sed ':a;N;s/\n/ /g;ta' | sed 's/ //g'` + SSurl="ss://"${SSbase64} + SSQRcode="http://doub.pw/qr/qr.php?text="${SSurl} + ss_link="${Word_ss_like} : ${Green_font_prefix}${SSurl}${Font_color_suffix} \n${Word_ss_qr_code} : ${Green_font_prefix}${SSQRcode}${Font_color_suffix}" +} +ssr_link_qr(){ + SSRprotocol=`echo ${protocol} | sed 's/_compatible//g'` + SSRobfs=`echo ${obfs} | sed 's/_compatible//g'` + SSRPWDbase64=`echo -n "${password}" | base64 | sed ':a;N;s/\n/ /g;ta' | sed 's/ //g'` + SSRbase64=`echo -n "${ip}:${port}:${SSRprotocol}:${method}:${SSRobfs}:${SSRPWDbase64}" | base64 | sed ':a;N;s/\n/ /g;ta' | sed 's/ //g'` + SSRurl="ssr://"${SSRbase64} + SSRQRcode="http://doub.pw/qr/qr.php?text="${SSRurl} + ssr_link="${Word_ssr_like} : ${Green_font_prefix}${SSRurl}${Font_color_suffix} \n${Word_ssr_qr_code} : ${Green_font_prefix}${SSRQRcode}${Font_color_suffix} \n " +} +ss_link_qr_1(){ + SSbase64=`echo -n "${method}:${user_password}@${ip}:${user_port}" | base64 | sed ':a;N;s/\n/ /g;ta' | sed 's/ //g'` + #echo -e "${user_port}" && echo -e "${user_password}" && echo -e "${SSbase64}" + SSurl="ss://"${SSbase64} + SSQRcode="http://doub.pw/qr/qr.php?text="${SSurl} + ss_link="${Word_ss_like} : ${Green_font_prefix}${SSurl}${Font_color_suffix} \n${Word_ss_qr_code} : ${Green_font_prefix}${SSQRcode}${Font_color_suffix}" +} +ssr_link_qr_1(){ + SSRprotocol=`echo ${protocol} | sed 's/_compatible//g'` + SSRobfs=`echo ${obfs} | sed 's/_compatible//g'` + SSRPWDbase64=`echo -n "${user_password}" | base64 | sed ':a;N;s/\n/ /g;ta' | sed 's/ //g'` + SSRbase64=`echo -n "${ip}:${user_port}:${SSRprotocol}:${method}:${SSRobfs}:${SSRPWDbase64}" | base64 | sed ':a;N;s/\n/ /g;ta' | sed 's/ //g'` + #echo -e "${user_port}" && echo -e "${user_password}" && echo -e "${SSRbase64}" + SSRurl="ssr://"${SSRbase64} + SSRQRcode="http://doub.pw/qr/qr.php?text="${SSRurl} + ssr_link="${Word_ssr_like} : ${Green_font_prefix}${SSRurl}${Font_color_suffix} \n${Word_ssr_qr_code} : ${Green_font_prefix}${SSRQRcode}${Font_color_suffix} \n " +} +#显示用户账号信息 +viewUser(){ + SSR_install_status + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + if [[ -z "${PID}" ]]; then + ssr_status="${Red_font_prefix} ${Word_current_status}: ${Font_color_suffix} ShadowsocksR ${Word_not_running} !" + else + ssr_status="${Green_font_prefix} ${Word_current_status}: ${Font_color_suffix} ShadowsocksR ${Word_running} !" + fi + getIP + now_mode=`jq '.port_password' ${config_user_file}` + if [[ "${now_mode}" = "null" ]]; then + getUser + SSprotocol=`echo ${protocol} | awk -F "_" '{print $NF}'` + SSobfs=`echo ${obfs} | awk -F "_" '{print $NF}'` + if [[ ${protocol} = "origin" ]]; then + if [[ ${obfs} = "plain" ]]; then + ss_link_qr + ssr_link="" + else + if [[ ${SSobfs} != "compatible" ]]; then + ss_link="" + else + ss_link_qr + fi + fi + else + if [[ ${SSprotocol} != "compatible" ]]; then + ss_link="" + else + if [[ ${SSobfs} != "compatible" ]]; then + if [[ ${SSobfs} = "plain" ]]; then + ss_link_qr + else + ss_link="" + fi + else + ss_link_qr + fi + fi + fi + ssr_link_qr + [[ -z ${protocol_param} ]] && protocol_param="0(${Word_unlimited})" + clear + echo "===================================================" + echo + echo -e " ${Prompt_your_account_configuration}" + echo + echo -e " I P\t : ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " ${Word_port}\t : ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " ${Word_pass}\t : ${Green_font_prefix}${password}${Font_color_suffix}" + echo -e " ${Word_method}\t : ${Green_font_prefix}${method}${Font_color_suffix}" + echo -e " ${Word_protocol}\t : ${Green_font_prefix}${protocol}${Font_color_suffix}" + echo -e " ${Word_obfs}\t : ${Green_font_prefix}${obfs}${Font_color_suffix}" + echo -e " ${Word_number_of_devices_limit} : ${Green_font_prefix}${protocol_param}${Font_color_suffix}" + echo -e " ${Word_number_of_devices_limit} : ${Green_font_prefix}${speed_limit_per_con} KB/S${Font_color_suffix}" + echo -e " ${Word_port_total_speed_limit} : ${Green_font_prefix}${speed_limit_per_user} KB/S${Font_color_suffix}" + echo -e "${ss_link}" + echo -e "${ssr_link}" + echo -e "${Prompt_tip}" + echo + echo -e ${ssr_status} + echo + echo "===================================================" + else + getUser + [[ -z ${protocol_param} ]] && protocol_param="0(${Word_unlimited})" + clear + echo "===================================================" + echo + echo -e " ${Prompt_your_account_configuration}" + echo + echo -e " I P\t : ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " ${Word_method}\t : ${Green_font_prefix}${method}${Font_color_suffix}" + echo -e " ${Word_protocol}\t : ${Green_font_prefix}${protocol}${Font_color_suffix}" + echo -e " ${Word_obfs}\t : ${Green_font_prefix}${obfs}${Font_color_suffix}" + echo -e " ${Word_number_of_devices_limit} : ${Green_font_prefix}${protocol_param}${Font_color_suffix}" + echo -e " ${Word_number_of_devices_limit} : ${Green_font_prefix}${speed_limit_per_con} KB/S${Font_color_suffix}" + echo -e " ${Word_port_total_speed_limit} : ${Green_font_prefix}${speed_limit_per_user} KB/S${Font_color_suffix}" + echo + user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + [[ ${socat_total} = "0" ]] && echo -e "${Red_font_prefix} [${Word_error}] ${Font_color_suffix} 没有发现 多端口用户,请检查 !" && exit 1 + user_id=0 + check_sys + if [[ ${release} = "centos" ]]; then + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + user_password=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $2}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + user_id=$[$user_id+1] + #echo -e ${user_port} && echo -e ${user_password} && echo -e ${user_id} + SSprotocol=`echo ${protocol} | awk -F "_" '{print $NF}'` + SSobfs=`echo ${obfs} | awk -F "_" '{print $NF}'` + if [[ ${protocol} = "origin" ]]; then + if [[ ${obfs} = "plain" ]]; then + ss_link_qr_1 + ssr_link="" + else + if [[ ${SSobfs} != "compatible" ]]; then + ss_link="" + else + ss_link_qr_1 + fi + fi + else + if [[ ${SSprotocol} != "compatible" ]]; then + ss_link="" + else + if [[ ${SSobfs} != "compatible" ]]; then + if [[ ${SSobfs} = "plain" ]]; then + ss_link_qr_1 + else + ss_link="" + fi + else + ss_link_qr_1 + fi + fi + fi + ssr_link_qr_1 + echo -e " ——————————${Green_font_prefix} ${Word_user} ${user_id} ${Font_color_suffix} ——————————" + echo -e " ${Word_port}\t : ${Green_font_prefix}${user_port}${Font_color_suffix}" + echo -e " ${Word_pass}\t : ${Green_font_prefix}${user_password}${Font_color_suffix}" + echo -e "${ss_link}" + echo -e "${ssr_link}" + done + else + for((integer = ${user_total}; integer >= 1; integer--)) + do + user_port=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + user_password=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $2}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + user_id=$[$user_id+1] + + SSprotocol=`echo ${protocol} | awk -F "_" '{print $NF}'` + SSobfs=`echo ${obfs} | awk -F "_" '{print $NF}'` + if [[ ${protocol} = "origin" ]]; then + if [[ ${obfs} = "plain" ]]; then + ss_link_qr_1 + ssr_link="" + else + if [[ ${SSobfs} != "compatible" ]]; then + ss_link="" + else + ss_link_qr_1 + fi + fi + else + if [[ ${SSprotocol} != "compatible" ]]; then + ss_link="" + else + if [[ ${SSobfs} != "compatible" ]]; then + if [[ ${SSobfs} = "plain" ]]; then + ss_link_qr_1 + else + ss_link="" + fi + else + ss_link_qr_1 + fi + fi + fi + ssr_link_qr_1 + echo -e " —————————— ${Green_font_prefix} ${Word_user} ${user_id} ${Font_color_suffix} ——————————" + echo -e " ${Word_port}\t : ${Green_font_prefix}${user_port}${Font_color_suffix}" + echo -e " ${Word_pass}\t : ${Green_font_prefix}${user_password}${Font_color_suffix}" + echo -e "${ss_link}" + echo -e "${ssr_link}" + done + fi + echo -e "${Prompt_tip}" + echo + echo -e ${ssr_status} + echo + echo "===================================================" + fi +} +debian_apt(){ + apt-get update + apt-get install -y python-pip python-m2crypto curl unzip vim git gcc build-essential make +} +centos_yum(){ + yum update + yum install -y python-pip python-m2crypto curl unzip vim git gcc make +} +JQ_install(){ + JQ_ver=`jq -V` + if [[ -z ${JQ_ver} ]]; then + #wget --no-check-certificate -N "https://softs.pw/Bash/other/jq-1.5.tar.gz" + wget --no-check-certificate -N "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/jq-1.5.tar.gz" + tar -xzf jq-1.5.tar.gz && cd jq-1.5 + ./configure --disable-maintainer-mode && make && make install + ldconfig + cd .. && rm -rf jq-1.5.tar.gz && rm -rf jq-1.5 + JQ_ver=`jq -V` + [[ -z ${JQ_ver} ]]&& echo -e "${Error_jq_installation_failed}" && exit 1 + echo -e "${Info_jq_installation_is_complete}" + else + echo -e "${Info_jq_is_installed}" + fi +} +rc.local_ss_set(){ +#添加开机启动 + if [[ ${release} = "centos" ]]; then + chmod +x /etc/rc.d/rc.local + #sed -i '/cd \/etc\/shadowsocksr\/shadowsocks\//d' /etc/rc.d/rc.local + #sed -i '/nohup python server.py a >> ssserver.log 2>&1 &/d' /etc/rc.d/rc.local + sed -i '/shadowsocksr/d' /etc/rc.d/rc.local + sed -i '/python server.py/d' /etc/rc.d/rc.local + echo -e "cd ${ssr_ss_file} && nohup python server.py a >> ssserver.log 2>&1 &" >> /etc/rc.d/rc.local + else + chmod +x /etc/rc.local + sed -i '$d' /etc/rc.local + #sed -i '/cd \/etc\/shadowsocksr\/shadowsocks\//d' /etc/rc.local + #sed -i '/nohup python server.py a >> ssserver.log 2>&1 &/d' /etc/rc.local + sed -i '/shadowsocksr/d' /etc/rc.local + sed -i '/python server.py/d' /etc/rc.local + echo -e "cd ${ssr_ss_file} && nohup python server.py a >> ssserver.log 2>&1 &" >> /etc/rc.local + echo -e "exit 0" >> /etc/rc.local + fi +} +rc.local_ss_del(){ + if [[ ${release} = "centos" ]]; then + #sed -i '/cd \/etc\/shadowsocksr\/shadowsocks\//d' /etc/rc.d/rc.local + #sed -i '/nohup python server.py a >> ssserver.log 2>&1 &/d' /etc/rc.d/rc.local + sed -i '/shadowsocksr/d' /etc/rc.d/rc.local + sed -i '/python server.py/d' /etc/rc.d/rc.local + else + #sed -i '/cd \/etc\/shadowsocksr\/shadowsocks\//d' /etc/rc.local + #sed -i '/nohup python server.py a >> ssserver.log 2>&1 &/d' /etc/rc.local + sed -i '/shadowsocksr/d' /etc/rc.local + sed -i '/python server.py/d' /etc/rc.local + fi +} +rc.local_serverspeed_set(){ +#添加开机启动 + if [[ ${release} = "centos" ]]; then + chmod +x /etc/rc.d/rc.local + sed -i '/serverspeeder/d' /etc/rc.d/rc.local + echo -e "/serverspeeder/bin/serverSpeeder.sh start" >> /etc/rc.d/rc.local + else + chmod +x /etc/rc.local + sed -i '$d' /etc/rc.local + sed -i '/serverspeeder/d' /etc/rc.local + echo -e "/serverspeeder/bin/serverSpeeder.sh start" >> /etc/rc.local + echo -e "exit 0" >> /etc/rc.local + fi +} +rc.local_serverspeed_del(){ + if [[ ${release} = "centos" ]]; then + sed -i '/serverspeeder/d' /etc/rc.d/rc.local + else + sed -i '/serverspeeder/d' /etc/rc.local + fi +} +iptables_add(){ + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssport} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssport} -j ACCEPT +} +iptables_del(){ + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT +} +iptables_set(){ + #删除旧端口的防火墙规则,添加新端口的规则 + iptables_del + iptables_add +} +set_config_port_pass(){ + sed -i 's/"server_port": '$(echo ${port})'/"server_port": '$(echo ${ssport})'/g' ${config_user_file} + sed -i 's/"password": "'$(echo ${password})'"/"password": "'$(echo ${sspwd})'"/g' ${config_user_file} +} +set_config_method_obfs_protocol(){ + sed -i 's/"method": "'$(echo ${method})'"/"method": "'$(echo ${ssmethod})'"/g' ${config_user_file} + sed -i 's/"obfs": "'$(echo ${obfs})'"/"obfs": "'$(echo ${ssobfs})'"/g' ${config_user_file} + sed -i 's/"protocol": "'$(echo ${protocol})'"/"protocol": "'$(echo ${ssprotocol})'"/g' ${config_user_file} +} +set_config_protocol_param(){ + sed -i 's/"protocol_param": "'$(echo ${protocol_param})'"/"protocol_param": "'$(echo ${ssprotocol_param})'"/g' ${config_user_file} +} +set_config_speed_limit_per(){ + sed -i 's/"speed_limit_per_con": '$(echo ${speed_limit_per_con})'/"speed_limit_per_con": '$(echo ${ssspeed_limit_per_con})'/g' ${config_user_file} + sed -i 's/"speed_limit_per_user": '$(echo ${speed_limit_per_user})'/"speed_limit_per_user": '$(echo ${ssspeed_limit_per_user})'/g' ${config_user_file} +} +#安装ShadowsocksR +installSSR(){ + [[ -e $config_user_file ]] && echo -e "${Error_ssr_installed}" && exit 1 + setUser + check_sys + # 系统判断 + if [[ ${release} = "debian" ]]; then + debian_apt + elif [[ ${release} = "ubuntu" ]]; then + debian_apt + elif [[ ${release} = "centos" ]]; then + centos_yum + else + echo -e "${Error_does_not_support_the_system}" && exit 1 + fi + #修改DNS为8.8.8.8 + echo "nameserver 8.8.8.8" > /etc/resolv.conf + echo "nameserver 8.8.4.4" >> /etc/resolv.conf + cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + JQ_install + cd /etc + #git config --global http.sslVerify false + env GIT_SSL_NO_VERIFY=true git clone -b manyuser https://github.com/shadowsocksr/shadowsocksr.git + [[ ! -e ${config_file} ]] && echo -e "${Error_ssr_download_failed}" && exit 1 + cp ${config_file} ${config_user_file} + #修改配置文件的密码 端口 加密方式 + cat > ${config_user_file}<<-EOF +{ + "server": "0.0.0.0", + "server_ipv6": "::", + "server_port": ${ssport}, + "local_address": "127.0.0.1", + "local_port": 1080, + "password": "${sspwd}", + "timeout": 120, + "udp_timeout": 60, + "method": "${ssmethod}", + "protocol": "${ssprotocol}", + "protocol_param": "${ssprotocol_param}", + "obfs": "${ssobfs}", + "obfs_param": "", + "speed_limit_per_con": ${ssspeed_limit_per_con}, + "speed_limit_per_user": ${ssspeed_limit_per_user}, + "dns_ipv6": false, + "connect_verbose_info": 0, + "redirect": "", + "fast_open": false +} +EOF + + #添加新端口的规则 + iptables_add + rc.local_ss_set + #启动SSR服务端,并判断是否启动成功 + cd ${ssr_ss_file} + nohup python server.py a >> ssserver.log 2>&1 & + sleep 2s + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + if [[ ! -z "${PID}" ]]; then + viewUser + echo + echo -e "ShadowsocksR ${Word_the_installation_is_complete} !" + echo -e "https://doub.io/ss-jc42/" + echo + echo "############################################################" + else + echo -e "${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR ${Word_startup_failed} !" + fi +} +installLibsodium(){ + # 系统判断 + check_sys + if [[ ${release} != "debian" ]]; then + if [[ ${release} != "ubuntu" ]]; then + if [[ ${release} != "centos" ]]; then + echo -e "${Error_does_not_support_the_system}" && exit 1 + fi + fi + fi + if [[ ${release} != "centos" ]]; then + apt-get update && apt-get install -y gcc build-essential make + cd /root + wget --no-check-certificate -O libsodium.tar.gz https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz + tar -xzf libsodium.tar.gz && mv libsodium-${Libsodiumr_ver} libsodium && cd libsodium + ./configure --disable-maintainer-mode && make -j2 && make install + ldconfig + cd .. && rm -rf libsodium.tar.gz && rm -rf libsodium + else + yum update && yum install epel-release -y && yum install libsodium -y + fi + echo ${Separator_1} && echo + echo -e "Libsodium ${Word_the_installation_is_complete} !" + echo -e "https://doub.io/ss-jc42/" + echo && echo ${Separator_1} +} +#修改单端口用户配置 +modifyUser(){ + SSR_install_status + now_mode=`jq '.port_password' ${config_user_file}` + [[ "${now_mode}" != "null" ]] && echo -e "${Error_the_current_mode_is_multi_port}" && exit 1 + getUser + setUser + #修改配置文件的密码 ${Word_port} 加密方式 + set_config_port_pass + set_config_method_obfs_protocol + set_config_protocol_param + set_config_speed_limit_per + iptables_set + RestartSSR +} +#手动修改用户配置 +manuallyModifyUser(){ + SSR_install_status + port=`jq '.server_port' ${config_user_file}` + vi $config_user_file + ssport=`jq '.server_port' ${config_user_file}` + iptables_set + RestartSSR +} +#卸载ShadowsocksR +UninstallSSR(){ + [[ ! -e $config_file ]] && echo -e "${Error_not_install_ssr}" && exit 1 + echo "${Info_uninstall_ssr}" + echo + stty erase '^H' && read -p "(${Word_default}: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then +#停止ShadowsocksR服务端并删除防火墙规则,删除Shadowsocks文件夹。 + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + [[ ! -z "${PID}" ]] && kill -9 ${PID} + cron_ssr=`crontab -l | grep "${ssr_file}/${auto_restart_cron}" | wc -l` + if [[ ${cron_ssr} > "0" ]]; then + crontab -l > ${ssr_file}"/crontab.bak" + sed -i "/\/etc\/shadowsocksr\/${auto_restart_cron}/d" ${ssr_file}"/crontab.bak" + crontab ${ssr_file}"/crontab.bak" + rm -rf ${ssr_file}"/crontab.bak" + fi + now_mode=`jq '.port_password' ${config_user_file}` + if [[ "${now_mode}" = "null" ]]; then + port=`jq '.server_port' ${config_user_file}` + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + else + user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + for((integer = 1; integer <= ${user_total}; integer++)) + do + port=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + iptables_del + done + fi +#取消开机启动 + check_sys + rc.local_ss_del + rm -rf ${ssr_file} && rm -rf ${Libsodiumr_file} && rm -rf ${Libsodiumr_file}.tar.gz + echo && echo " ShadowsocksR ${Word_uninstall_is_complete} !" && echo + else + echo && echo "${Word_uninstall_cancelled}" && echo + fi +} +# 更新ShadowsocksR +UpdateSSR(){ + SSR_install_status + cd ${ssr_file} + git pull + RestartSSR +} +# 切换 单/多端口模式 +Port_mode_switching(){ + SSR_install_status + now_mode=`jq '.port_password' ${config_user_file}` + if [[ "${now_mode}" = "null" ]]; then + echo + echo -e " ${Word_current_mode}: ${Green_font_prefix} ${Word_single_port} ${Font_color_suffix}" + echo + echo -e "${Info_switch_multi_port_mode}" + echo + stty erase '^H' && read -p "(${Word_default}: n):" mode_yn + [[ -z ${mode_yn} ]] && mode_yn="n" + if [[ ${mode_yn} == [Yy] ]]; then + port=`jq '.server_port' ${config_user_file}` + setUser + iptables_set + cat > ${config_user_file}<<-EOF +{ + "server": "0.0.0.0", + "server_ipv6": "::", + "local_address": "127.0.0.1", + "local_port": 1080, + "port_password":{ + "${ssport}":"${sspwd}" + }, + "timeout": 120, + "udp_timeout": 60, + "method": "${ssmethod}", + "protocol": "${ssprotocol}", + "protocol_param": "${ssprotocol_param}", + "obfs": "${ssobfs}", + "obfs_param": "", + "speed_limit_per_con": ${ssspeed_limit_per_con}, + "speed_limit_per_user": ${ssspeed_limit_per_user}, + "dns_ipv6": false, + "connect_verbose_info": 0, + "redirect": "", + "fast_open": false +} +EOF + RestartSSR + else + echo && echo " ${Word_canceled}" && echo + fi + else + echo + echo -e " ${Word_current_mode}: ${Green_font_prefix} ${Word_multi_port} ${Font_color_suffix}" + echo + echo -e "${Info_switch_single_port_mode}" + echo + stty erase '^H' && read -p "(${Word_default}: n):" mode_yn + [[ -z ${mode_yn} ]] && mode_yn="n" + if [[ ${mode_yn} == [Yy] ]]; then + user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + for((integer = 1; integer <= ${user_total}; integer++)) + do + port=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + iptables_del + done + setUser + iptables_add + cat > ${config_user_file}<<-EOF +{ + "server": "0.0.0.0", + "server_ipv6": "::", + "server_port": ${ssport}, + "local_address": "127.0.0.1", + "local_port": 1080, + "password": "${sspwd}", + "timeout": 120, + "udp_timeout": 60, + "method": "${ssmethod}", + "protocol": "${ssprotocol}", + "protocol_param": "${ssprotocol_param}", + "obfs": "${ssobfs}", + "obfs_param": "", + "speed_limit_per_con": ${ssspeed_limit_per_con}, + "speed_limit_per_user": ${ssspeed_limit_per_user}, + "dns_ipv6": false, + "connect_verbose_info": 0, + "redirect": "", + "fast_open": false +} +EOF + RestartSSR + else + echo && echo " ${Word_canceled}" && echo + fi + fi +} +List_multi_port_user(){ + user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + [[ ${socat_total} = "0" ]] && echo -e "${Error_no_multi_port_users_were_found}" && exit 1 + user_list_all="" + user_id=0 + check_sys + if [[ ${release} = "centos" ]]; then + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + user_password=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $2}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + user_id=$[$user_id+1] + user_list_all=${user_list_all}${user_id}". ${Word_port}: "${user_port}" ${Word_pass}: "${user_password}"\n" + done + else + for((integer = ${user_total}; integer >= 1; integer--)) + do + user_port=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + user_password=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $2}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + user_id=$[$user_id+1] + user_list_all=${user_list_all}${user_id}". ${Word_port}: "${user_port}" ${Word_pass}: "${user_password}"\n" + done + fi + echo + echo -e "${Prompt_total_number_of_users} ${Green_font_prefix} "${user_total}" ${Font_color_suffix} " + echo -e ${user_list_all} +} +# 添加 多端口用户配置 +Add_multi_port_user(){ + SSR_install_status + now_mode=`jq '.port_password' ${config_user_file}` + [[ "${now_mode}" = "null" ]] && echo -e "${Error_the_current_mode_is_single_port}" && exit 1 + set_port_pass + sed -i "7 i \" \"${ssport}\":\"${sspwd}\"," ${config_user_file} + sed -i "7s/^\"//" ${config_user_file} + iptables_add + RestartSSR + echo -e "${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ${Prompt_add_multi_port_user} ${Green_font_prefix} [${Word_port}: ${ssport} , ${Word_pass}: ${sspwd}] ${Font_color_suffix} " +} +# 修改 多端口用户配置 +Modify_multi_port_user(){ + SSR_install_status + now_mode=`jq '.port_password' ${config_user_file}` + [[ "${now_mode}" = "null" ]] && echo -e "${Error_the_current_mode_is_single_port}" && exit 1 + echo -e "${Info_input_modify_the_type}" + stty erase '^H' && read -p "(${Word_default}: ${Word_cancel}):" modify_type + [[ -z "${modify_type}" ]] && exit 1 + if [[ ${modify_type} == "1" ]]; then + List_multi_port_user + while true + do + echo -e "${info_input_select_user_id_modified}" + stty erase '^H' && read -p "(${Word_default}: ${Word_cancel}):" del_user_num + [[ -z "${del_user_num}" ]] && exit 1 + expr ${del_user_num} + 0 &>/dev/null + if [ $? -eq 0 ]; then + if [[ ${del_user_num} -ge 1 ]] && [[ ${del_user_num} -le ${user_total} ]]; then + set_port_pass + del_user_num_3=$[ $del_user_num + 6] + port=`sed -n "${del_user_num_3}p" ${config_user_file} | awk -F ":" '{print $1}' | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + password=`sed -n "${del_user_num_3}p" ${config_user_file} | awk -F ":" '{print $2}' | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + sed -i 's/"'$(echo ${port})'":"'$(echo ${password})'"/"'$(echo ${ssport})'":"'$(echo ${sspwd})'"/g' ${config_user_file} + iptables_set + RestartSSR + echo -e "${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ${Prompt_modify_multi_port_user} ${Green_font_prefix} ${del_user_num} ${Font_color_suffix} " + break + else + echo "${Errpr_input_num_error}" + fi + else + echo "${Errpr_input_num_error}" + fi + done + elif [[ ${modify_type} == "2" ]]; then + set_others + getUser + set_config_method_obfs_protocol + set_config_protocol_param + set_config_speed_limit_per + RestartSSR + echo -e "${Prompt_method_protocol_obfs_modified}" + fi +} +# 删除 多端口用户配置 +Del_multi_port_user(){ + SSR_install_status + now_mode=`jq '.port_password' ${config_user_file}` + [[ "${now_mode}" = "null" ]] && echo -e "${Error_the_current_mode_is_single_port}" && exit 1 + List_multi_port_user + user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + [[ "${user_total}" -le "1" ]] && echo -e "${Error_multi_port_user_remaining_one}" && exit 1 + while true + do + echo -e "${Info_input_select_user_id_del}" + stty erase '^H' && read -p "(${Word_default}: ${Word_cancel}):" del_user_num + [[ -z "${del_user_num}" ]] && exit 1 + expr ${del_user_num} + 0 &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${del_user_num} -ge 1 ]] && [[ ${del_user_num} -le ${user_total} ]]; then + del_user_num_4=$[ $del_user_num + 6] + port=`sed -n "${del_user_num_4}p" ${config_user_file} | awk -F ":" '{print $1}' | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + iptables_del + del_user_num_1=$[ $del_user_num + 6 ] + sed -i "${del_user_num_1}d" ${config_user_file} + if [[ ${del_user_num} = ${user_total} ]]; then + del_user_num_1=$[ $del_user_num_1 - 1 ] + sed -i "${del_user_num_1}s/,$//g" ${config_user_file} + fi + RestartSSR + echo -e "${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ${Prompt_del_multi_port_user} ${Green_font_prefix} ${del_user_num} ${Font_color_suffix} " + break + else + echo "${Errpr_input_num_error}" + fi + else + echo "${Errpr_input_num_error}" + fi + done +} +# 显示用户连接信息 +View_user_connection_info(){ + SSR_install_status + check_sys + if [[ ${release} = "debian" ]]; then + debian_View_user_connection_info + elif [[ ${release} = "ubuntu" ]]; then + debian_View_user_connection_info + elif [[ ${release} = "centos" ]]; then + centos_View_user_connection_info + fi +} +debian_View_user_connection_info(){ + now_mode=`jq '.port_password' ${config_user_file}` + if [[ "${now_mode}" = "null" ]]; then + now_mode="${Word_single_port}" && user_total="1" + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |wc -l` + user_port=`jq '.server_port' ${config_user_file}` + user_IP=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep "${user_port}" |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u` + user_IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep "${user_port}" |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |wc -l` + user_list_all="1. ${Word_port}: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, ${Prompt_total_number_of_ip_number} ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, ${Prompt_the_currently_connected_ip} ${Green_font_prefix}"${user_IP}"${Font_color_suffix}\n" + echo -e "${Word_current_mode} ${Green_font_prefix} "${now_mode}" ${Font_color_suffix} 。" + echo -e ${user_list_all} + else + now_mode="${Word_multi_port}" && user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |wc -l` + user_list_all="" + user_id=0 + for((integer = ${user_total}; integer >= 1; integer--)) + do + user_port=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + user_IP=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep "${user_port}" |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u` + user_IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep "${user_port}" |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |wc -l` + user_id=$[$user_id+1] + user_list_all=${user_list_all}${user_id}". ${Word_port}: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, ${Prompt_total_number_of_ip_number} ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, ${Prompt_the_currently_connected_ip} ${Green_font_prefix}"${user_IP}"${Font_color_suffix}\n" + done + echo -e "${Word_current_mode} ${Green_font_prefix} "${now_mode}" ${Font_color_suffix} ,${Word_current_mode} ${Green_font_prefix} "${user_total}" ${Font_color_suffix} ,${Prompt_total_number_of_ip} ${Green_font_prefix} "${IP_total}" ${Font_color_suffix} " + echo -e ${user_list_all} + fi +} +centos_View_user_connection_info(){ + now_mode=`jq '.port_password' ${config_user_file}` + if [[ "${now_mode}" = "null" ]]; then + now_mode="${Word_single_port}" && user_total="1" + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $4}' |sort -u |wc -l` + user_port=`jq '.server_port' ${config_user_file}` + user_IP=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep "${user_port}" | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u` + user_IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep "${user_port}" | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |wc -l` + user_list_all="1. ${Word_port}: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, ${Prompt_total_number_of_ip_number} ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, ${Prompt_the_currently_connected_ip} ${Green_font_prefix}"${user_IP}"${Font_color_suffix}\n" + echo -e "${Word_current_mode} ${Green_font_prefix} "${now_mode}" ${Font_color_suffix} 。" + echo -e ${user_list_all} + else + now_mode="${Word_multi_port}" && user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $4}' |sort -u |wc -l` + user_list_all="" + user_id=0 + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` + user_IP=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep "${user_port}" | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u` + user_IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep "${user_port}" | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |wc -l` + user_id=$[$user_id+1] + user_list_all=${user_list_all}${user_id}". ${Word_port}: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, ${Prompt_total_number_of_ip_number} ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, ${Prompt_the_currently_connected_ip} ${Green_font_prefix}"${user_IP}"${Font_color_suffix}\n" + done + echo -e "${Word_current_mode} ${Green_font_prefix} "${now_mode}" ${Font_color_suffix} ,${Word_current_mode} ${Green_font_prefix} "${user_total}" ${Font_color_suffix} ,${Prompt_total_number_of_ip} ${Green_font_prefix} "${IP_total}" ${Font_color_suffix} " + echo -e ${user_list_all} + fi +} +SSR_start(){ + cd ${ssr_ss_file} + nohup python server.py a > ssserver.log 2>&1 & + sleep 2s + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + if [[ ! -z "${PID}" ]]; then + viewUser + echo ${Separator_1} && echo && echo -e " ShadowsocksR ${Word_has_started} !" && echo && echo ${Separator_1} + else + echo -e "${Error_startup_failed}" + fi +} +#启动ShadowsocksR +StartSSR(){ + SSR_install_status + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + [[ ! -z ${PID} ]] && echo -e "${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR ${Word_running} !" && exit 1 + SSR_start +} +#停止ShadowsocksR +StopSSR(){ + SSR_install_status + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + [[ -z $PID ]] && echo -e "${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR ${Word_not_running} !" && exit 1 + kill -9 ${PID} && sleep 2s + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + if [[ -z "${PID}" ]]; then + echo ${Separator_1} && echo && echo -e " ShadowsocksR ${Word_stopped} !" && echo && echo ${Separator_1} + else + echo -e "${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR ${Word_stop_failing} !" + fi +} +#重启ShadowsocksR +RestartSSR(){ + SSR_install_status + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + [[ ! -z "${PID}" ]] && kill -9 ${PID} + SSR_start +} +#查看 ShadowsocksR 日志 +TailSSR(){ + [[ ! -e ${ssr_ss_file}"/ssserver.log" ]] && echo -e "${Error_no_log_found}" && exit 1 + echo && echo -e "${Prompt_log}" && echo + tail -f ${ssr_ss_file}"/ssserver.log" +} +#查看 ShadowsocksR 状态 +StatusSSR(){ + SSR_install_status + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + if [[ -z "${PID}" ]]; then + echo ${Separator_1} && echo && echo -e " ShadowsocksR ${Word_not_running} !" && echo && echo ${Separator_1} + else + echo ${Separator_1} && echo && echo -e " ShadowsocksR ${Word_running} (PID: ${PID}) !" && echo && echo ${Separator_1} + fi +} +#安装锐速 +installServerSpeeder(){ + [[ -e "/serverspeeder" ]] && echo -e "${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ${Word_serverspeeder} ${Word_installed} !" && exit 1 + cd /root + #借用91yun.rog的开心版锐速 + wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder-all.sh + bash serverspeeder-all.sh + sleep 2s + PID=`ps -ef |grep -v grep |grep "serverspeeder" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + check_sys + rc.local_serverspeed_set + echo -e "${Green_font_prefix} [${Word_info}] ${Font_color_suffix} ${Word_serverspeeder} ${Word_the_installation_is_complete} !" && exit 1 + else + echo -e "${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ${Word_serverspeeder} ${Word_installation_failed} !" && exit 1 + fi +} +#查看锐速状态 +StatusServerSpeeder(){ + [[ ! -e "/serverspeeder" ]] && echo -e "${Error_server_speeder_not_installed}" && exit 1 + /serverspeeder/bin/serverSpeeder.sh status +} +#停止锐速 +StopServerSpeeder(){ + [[ ! -e "/serverspeeder" ]] && echo -e "${Error_server_speeder_not_installed}" && exit 1 + /serverspeeder/bin/serverSpeeder.sh stop +} +#重启锐速 +RestartServerSpeeder(){ + [[ ! -e "/serverspeeder" ]] && echo -e "${Error_server_speeder_not_installed}" && exit 1 + /serverspeeder/bin/serverSpeeder.sh restart +} +#卸载锐速 +UninstallServerSpeeder(){ + [[ ! -e "/serverspeeder" ]] && echo -e "${Error_server_speeder_not_installed}" && exit 1 + echo "${Info_uninstall_server}" + echo + stty erase '^H' && read -p "(${Word_default}: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + rm -rf /root/serverspeeder-all.sh + rm -rf /root/91yunserverspeeder + rm -rf /root/91yunserverspeeder.tar.gz + check_sys + rc.local_serverspeed_del + chattr -i /serverspeeder/etc/apx* + /serverspeeder/bin/serverSpeeder.sh uninstall -f + echo && echo "${Word_serverspeeder} ${Word_uninstall_is_complete} !" && echo + else + echo && echo "${Word_uninstall_cancelled}" && echo + fi +} +BanBTPTSPAM(){ + wget -4qO- raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/Get_Out_Spam.sh | bash +} +InstallBBR(){ + echo -e "${Info_install_bbr_0}" + echo + echo "${Info_install_bbr}" + stty erase '^H' && read -p "(${Word_default}: ${Word_cancel}):" unyn + [[ -z ${unyn} ]] && echo "${Word_canceled}" && exit 1 + if [[ ${unyn} == [Yy] ]]; then + wget -N --no-check-certificate https://softs.pw/Bash/bbr.sh && chmod +x bbr.sh && bash bbr.sh + fi +} +SetCrontab_interval(){ + echo -e "${Info_set_crontab_interval_0}" + echo "${Info_input_set_crontab_interval}" + stty erase '^H' && read -p "(${Word_default}: ${Info_input_set_crontab_interval_default} ):" crontab_interval + [[ -z "${crontab_interval}" ]] && crontab_interval="0 2 * * *" + echo + echo "——————————————————————————————" + echo -e " ${Word_timing_interval} : ${Red_font_prefix} ${crontab_interval} ${Font_color_suffix}" + echo "——————————————————————————————" + echo +} +SetCrontab(){ + SSR_install_status + check_sys + if [[ ${release} = "centos" ]]; then + corn_status=`service crond status` + else + corn_status=`service cron status` + fi + if [[ -z ${corn_status} ]]; then + echo -e "${Info_no_cron_installed}" + if [[ ${release} = "centos" ]]; then + yum update && yum install crond -y + else + apt-get update && apt-get install cron -y + fi + if [[ ${release} = "centos" ]]; then + corn_status=`service crond status` + else + corn_status=`service cron status` + fi + [[ -z ${corn_status} ]] && echo -e "${Error_cron_installation_failed}" && exit 1 + fi + echo -e "${Info_input_set_cron}" + echo + stty erase '^H' && read -p "(${Word_default} :${Word_cancel}):" setcron_select + [[ -z "${setcron_select}" ]] && exit 1 + if [[ ${setcron_select} != "1" ]]; then + if [[ ${setcron_select} != "2" ]]; then + exit 1 + fi + fi + cron_ssr=`crontab -l | grep "${ssr_file}/${auto_restart_cron}" | wc -l` + if [[ ${cron_ssr} > "0" ]]; then + crontab -l > ${ssr_file}"/crontab.bak" + sed -i "/\/etc\/shadowsocksr\/${auto_restart_cron}/d" ${ssr_file}"/crontab.bak" + crontab ${ssr_file}"/crontab.bak" + rm -rf ${ssr_file}"/crontab.bak" + cron_ssr=`crontab -l | grep "${ssr_file}/${auto_restart_cron}" | wc -l` + if [[ ${cron_ssr} > "0" ]]; then + echo -e "${Error_set_corn_del_failed}" && exit 1 + fi + else + if [[ ${setcron_select} == "2" ]]; then + echo -e "${Info_set_corn_status}" && exit 1 + fi + fi + if [[ ${setcron_select} == "2" ]]; then + echo -e "${Info_set_corn_del_success}" && exit 1 + fi + SetCrontab_interval + cat > ${ssr_file}"/"${auto_restart_cron}<<-EOF +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +server_ss_file="/etc/shadowsocksr/shadowsocks/" +server_file=${server_ss_file}"server.py" +config_user_file="/etc/shadowsocksr/user-config.json" + +[ ! -e $config_user_file ] && exit 1 +PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` +[ ! -z "${PID}" ] && kill -9 ${PID} +cd ${server_ss_file} +nohup python server.py a >> ssserver.log 2>&1 & +sleep 2s +PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` +if [ ! -z "${PID}" ]; then + echo -e " ShadowsocksR 重启完成 !" +else + echo -e "${Red_font_prefix} [${Word_error}] ${Font_color_suffix} ShadowsocksR 启动失败 !" +fi +EOF + if [[ -s ${ssr_file}"/"${auto_restart_cron} ]]; then + chmod +x ${ssr_file}"/"${auto_restart_cron} + crontab -l > ${ssr_file}"/crontab.bak" + echo "${crontab_interval} /bin/bash ${ssr_file}/${auto_restart_cron}" >> ${ssr_file}"/crontab.bak" + crontab ${ssr_file}"/crontab.bak" + rm -rf ${ssr_file}"/crontab.bak" + cron_ssr=`crontab -l | grep "${ssr_file}/${auto_restart_cron}" | wc -l` + if [[ ${cron_ssr} > "0" ]]; then + cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + if [[ ${release} = "centos" ]]; then + service crond restart + else + service cron restart + fi + echo -e "${Info_set_corn_add_success}" + else + echo -e "${Error_set_corn_add_failed}" && exit 1 + fi + + else + rm -rf ${ssr_file}"/"${auto_restart_cron} + echo -e "${Error_set_corn_Write_failed}" + fi +} +# 设置设备数 +Client_limit(){ + SSR_install_status + getUser + if [[ ${protocol} != "origin" ]]; then + protocol_1=`echo ${protocol} | sed 's/_compatible//g'` + if [[ ${protocol} == ${protocol_1} ]]; then + while true + do + echo + echo -e "${Info_input_number_of_devices}" + echo -e "${Prompt_number_of_devices}" + stty erase '^H' && read -p "(${Word_default}: ${Word_unlimited}):" ssprotocol_param + [[ -z "$ssprotocol_param" ]] && ssprotocol_param="" && break + expr ${ssprotocol_param} + 0 &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ssprotocol_param} -ge 1 ]] && [[ ${ssprotocol_param} -le 99999 ]]; then + echo && echo ${Separator_1} && echo -e " ${Word_number_of_devices} : ${Green_font_prefix}${ssprotocol_param}${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo "${Errpr_input_num_error}" + fi + else + echo "${Errpr_input_num_error}" + fi + done + else + echo -e "${Error_limit_the_number_of_devices_1}" && exit 1 + fi + else + echo -e "${Error_limit_the_number_of_devices_2}" && exit 1 + fi + set_config_protocol_param + RestartSSR + echo -e "${Info_limit_the_number_of_devices}" +} +Speed_limit(){ + SSR_install_status + # 设置单线程限速 + while true + do + echo + echo -e "${Info_input_single_threaded_speed_limit}" + echo -e "${Prompt_input_single_threaded_speed_limit}" + stty erase '^H' && read -p "(${Word_default}: ${Word_unlimited}):" ssspeed_limit_per_con + [[ -z "$ssspeed_limit_per_con" ]] && ssspeed_limit_per_con=0 && break + expr ${ssspeed_limit_per_con} + 0 &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ssspeed_limit_per_con} -ge 1 ]] && [[ ${ssspeed_limit_per_con} -le 99999 ]]; then + echo && echo ${Separator_1} && echo -e " ${Word_single_threaded_speed_limit} : ${Green_font_prefix}${ssspeed_limit_per_con} KB/S ${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo "${Errpr_input_num_error}" + fi + else + echo "${Errpr_input_num_error}" + fi + done + # 设置端口总限速 + while true + do + echo + echo -e "${Info_total_port_speed_limit}" + echo -e "${Prompt_total_port_speed_limit}" + stty erase '^H' && read -p "(${Word_default}: ${Word_unlimited}):" ssspeed_limit_per_user + [[ -z "$ssspeed_limit_per_user" ]] && ssspeed_limit_per_user=0 && break + expr ${ssspeed_limit_per_user} + 0 &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${ssspeed_limit_per_user} -ge 1 ]] && [[ ${ssspeed_limit_per_user} -le 99999 ]]; then + echo && echo ${Separator_1} && echo -e " ${Word_port_total_speed_limit} : ${Green_font_prefix}${ssspeed_limit_per_user} KB/S ${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo "${Errpr_input_num_error}" + fi + else + echo "${Errpr_input_num_error}" + fi + done + getUser + set_config_speed_limit_per + RestartSSR + echo -e "${Info_port_speed_limit}" +} +Switch_language(){ + if [[ ! -e "${PWD}/lang_en" ]]; then + echo -e "${Prompt_switch_language_english}" + echo && echo -e "${Info_switch_language_english}" + stty erase '^H' && read -p "(${Word_default}: ${Word_cancel}):" unyn + [[ -z ${unyn} ]] && echo "${Word_canceled}" && exit 1 + if [[ ${unyn} == [Yy] ]]; then + echo "lang_en" > "${PWD}/lang_en" + echo -e "${Info_switch_language_1}" && exit 1 + fi + else + echo -e "${Prompt_switch_language_chinese}" + echo && echo -e "${Info_switch_language_chinese}" + stty erase '^H' && read -p "(${Word_default}: ${Word_cancel}):" unyn + [[ -z ${unyn} ]] && echo "${Word_canceled}" && exit 1 + if [[ ${unyn} == [Yy] ]]; then + rm -rf "${PWD}/lang_en" + echo -e "${Info_switch_language_1}" && exit 1 + fi + fi +} +Language +#菜单判断 +echo +echo && echo "${Menu_prompt_1}" && echo +echo -e "${Menu_options}" +check_sys +[[ ${release} != "centos" ]] && echo -e "${Menu_options_bbr}" +echo -e "${Menu_options_other}" +if [[ -e $config_user_file ]]; then + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` + if [[ ! -z "${PID}" ]]; then + echo -e "${Menu_status_1}" + else + echo -e "${Menu_status_2}" + fi + now_mode_1=`jq '.port_password' ${config_user_file}` + if [[ "${now_mode_1}" = "null" ]]; then + echo -e "${Menu_mode_1}" + else + echo -e "${Menu_mode_2}" + fi +else + echo -e "${Menu_status_3}" +fi +echo +stty erase '^H' && read -p "${Menu_prompt_2}" num + +case "$num" in + 1) + installSSR + ;; + 2) + installLibsodium + ;; + 3) + viewUser + ;; + 4) + View_user_connection_info + ;; + 5) + modifyUser + ;; + 6) + manuallyModifyUser + ;; + 7) + UninstallSSR + ;; + 8) + UpdateSSR + ;; + 9) + Port_mode_switching + ;; + 10) + Add_multi_port_user + ;; + 11) + Modify_multi_port_user + ;; + 12) + Del_multi_port_user + ;; + 13) + StartSSR + ;; + 14) + StopSSR + ;; + 15) + RestartSSR + ;; + 16) + StatusSSR + ;; + 17) + TailSSR + ;; + 18) + installServerSpeeder + ;; + 19) + StopServerSpeeder + ;; + 20) + RestartServerSpeeder + ;; + 21) + StatusServerSpeeder + ;; + 22) + UninstallServerSpeeder + ;; + 23) + InstallBBR + ;; + 24) + BanBTPTSPAM + ;; + 25) + SetCrontab + ;; + 26) + Client_limit + ;; + 27) + Speed_limit + ;; + 0) + Switch_language + ;; + *) + echo "${Menu_prompt_3}" + ;; +esac \ No newline at end of file diff --git a/ssrmu.sh b/ssrmu.sh new file mode 100644 index 0000000..cb1d5f4 --- /dev/null +++ b/ssrmu.sh @@ -0,0 +1,1878 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS 6+/Debian 6+/Ubuntu 14.04+ +# Description: Install the ShadowsocksR mudbjson server +# Version: 1.0.26 +# Author: Toyo +# Blog: https://doub.io/ss-jc60/ +#================================================= + +sh_ver="1.0.26" +filepath=$(cd "$(dirname "$0")"; pwd) +file=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +ssr_folder="/usr/local/shadowsocksr" +config_file="${ssr_folder}/config.json" +config_user_file="${ssr_folder}/user-config.json" +config_user_api_file="${ssr_folder}/userapiconfig.py" +config_user_mudb_file="${ssr_folder}/mudb.json" +ssr_log_file="${ssr_folder}/ssserver.log" +Libsodiumr_file="/usr/local/lib/libsodium.so" +Libsodiumr_ver_backup="1.0.15" +Server_Speeder_file="/serverspeeder/bin/serverSpeeder.sh" +LotServer_file="/appex/bin/serverSpeeder.sh" +BBR_file="${file}/bbr.sh" +jq_file="${ssr_folder}/jq" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" +Separator_1="——————————————————————————————" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} 当前账号非ROOT(或没有ROOT权限),无法继续操作,请使用${Green_background_prefix} sudo su ${Font_color_suffix}来获取临时ROOT权限(执行后会提示输入当前账号的密码)。" && exit 1 +} +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_pid(){ + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` +} +check_crontab(){ + [[ ! -e "/usr/bin/crontab" ]] && echo -e "${Error} 缺少依赖 Crontab ,请尝试手动安装 CentOS: yum install crond -y , Debian/Ubuntu: apt-get install cron -y !" && exit 1 +} +SSR_installation_status(){ + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} 没有发现 ShadowsocksR 文件夹,请检查 !" && exit 1 +} +Server_Speeder_installation_status(){ + [[ ! -e ${Server_Speeder_file} ]] && echo -e "${Error} 没有安装 锐速(Server Speeder),请检查 !" && exit 1 +} +LotServer_installation_status(){ + [[ ! -e ${LotServer_file} ]] && echo -e "${Error} 没有安装 LotServer,请检查 !" && exit 1 +} +BBR_installation_status(){ + if [[ ! -e ${BBR_file} ]]; then + echo -e "${Error} 没有发现 BBR脚本,开始下载..." + cd "${file}" + if ! wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/bbr.sh; then + echo -e "${Error} BBR 脚本下载失败 !" && exit 1 + else + echo -e "${Info} BBR 脚本下载完成 !" + chmod +x bbr.sh + fi + fi +} +# 设置 防火墙规则 +Add_iptables(){ + if [[ ! -z "${ssr_port}" ]]; then + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + fi +} +Del_iptables(){ + if [[ ! -z "${port}" ]]; then + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + fi +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + chkconfig --level 2345 iptables on + chkconfig --level 2345 ip6tables on + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules\n/sbin/ip6tables-restore < /etc/ip6tables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +# 读取 配置信息 +Get_IP(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi +} +Get_User_info(){ + Get_user_port=$1 + user_info_get=$(python mujson_mgr.py -l -p "${Get_user_port}") + match_info=$(echo "${user_info_get}"|grep -w "### user ") + if [[ -z "${match_info}" ]]; then + echo -e "${Error} 用户信息获取失败 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} " && exit 1 + fi + user_name=$(echo "${user_info_get}"|grep -w "user :"|awk -F "user : " '{print $NF}') + port=$(echo "${user_info_get}"|grep -w "port :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + password=$(echo "${user_info_get}"|grep -w "passwd :"|awk -F "passwd : " '{print $NF}') + method=$(echo "${user_info_get}"|grep -w "method :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + protocol=$(echo "${user_info_get}"|grep -w "protocol :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + protocol_param=$(echo "${user_info_get}"|grep -w "protocol_param :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + [[ -z ${protocol_param} ]] && protocol_param="0(无限)" + obfs=$(echo "${user_info_get}"|grep -w "obfs :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + #transfer_enable=$(echo "${user_info_get}"|grep -w "transfer_enable :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}'|awk -F "ytes" '{print $1}'|sed 's/KB/ KB/;s/MB/ MB/;s/GB/ GB/;s/TB/ TB/;s/PB/ PB/') + #u=$(echo "${user_info_get}"|grep -w "u :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + #d=$(echo "${user_info_get}"|grep -w "d :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + forbidden_port=$(echo "${user_info_get}"|grep -w "forbidden_port :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + [[ -z ${forbidden_port} ]] && forbidden_port="无限制" + speed_limit_per_con=$(echo "${user_info_get}"|grep -w "speed_limit_per_con :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + speed_limit_per_user=$(echo "${user_info_get}"|grep -w "speed_limit_per_user :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + Get_User_transfer "${port}" +} +Get_User_transfer(){ + transfer_port=$1 + #echo "transfer_port=${transfer_port}" + all_port=$(${jq_file} '.[]|.port' ${config_user_mudb_file}) + #echo "all_port=${all_port}" + port_num=$(echo "${all_port}"|grep -nw "${transfer_port}"|awk -F ":" '{print $1}') + #echo "port_num=${port_num}" + port_num_1=$(echo $((${port_num}-1))) + #echo "port_num_1=${port_num_1}" + transfer_enable_1=$(${jq_file} ".[${port_num_1}].transfer_enable" ${config_user_mudb_file}) + #echo "transfer_enable_1=${transfer_enable_1}" + u_1=$(${jq_file} ".[${port_num_1}].u" ${config_user_mudb_file}) + #echo "u_1=${u_1}" + d_1=$(${jq_file} ".[${port_num_1}].d" ${config_user_mudb_file}) + #echo "d_1=${d_1}" + transfer_enable_Used_2_1=$(echo $((${u_1}+${d_1}))) + #echo "transfer_enable_Used_2_1=${transfer_enable_Used_2_1}" + transfer_enable_Used_1=$(echo $((${transfer_enable_1}-${transfer_enable_Used_2_1}))) + #echo "transfer_enable_Used_1=${transfer_enable_Used_1}" + + if [[ ${transfer_enable_1} -lt 1024 ]]; then + transfer_enable="${transfer_enable_1} B" + elif [[ ${transfer_enable_1} -lt 1048576 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1024'}') + transfer_enable="${transfer_enable} KB" + elif [[ ${transfer_enable_1} -lt 1073741824 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1048576'}') + transfer_enable="${transfer_enable} MB" + elif [[ ${transfer_enable_1} -lt 1099511627776 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1073741824'}') + transfer_enable="${transfer_enable} GB" + elif [[ ${transfer_enable_1} -lt 1125899906842624 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1099511627776'}') + transfer_enable="${transfer_enable} TB" + fi + #echo "transfer_enable=${transfer_enable}" + if [[ ${u_1} -lt 1024 ]]; then + u="${u_1} B" + elif [[ ${u_1} -lt 1048576 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1024'}') + u="${u} KB" + elif [[ ${u_1} -lt 1073741824 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1048576'}') + u="${u} MB" + elif [[ ${u_1} -lt 1099511627776 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1073741824'}') + u="${u} GB" + elif [[ ${u_1} -lt 1125899906842624 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1099511627776'}') + u="${u} TB" + fi + #echo "u=${u}" + if [[ ${d_1} -lt 1024 ]]; then + d="${d_1} B" + elif [[ ${d_1} -lt 1048576 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1024'}') + d="${d} KB" + elif [[ ${d_1} -lt 1073741824 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1048576'}') + d="${d} MB" + elif [[ ${d_1} -lt 1099511627776 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1073741824'}') + d="${d} GB" + elif [[ ${d_1} -lt 1125899906842624 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1099511627776'}') + d="${d} TB" + fi + #echo "d=${d}" + if [[ ${transfer_enable_Used_1} -lt 1024 ]]; then + transfer_enable_Used="${transfer_enable_Used_1} B" + elif [[ ${transfer_enable_Used_1} -lt 1048576 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1024'}') + transfer_enable_Used="${transfer_enable_Used} KB" + elif [[ ${transfer_enable_Used_1} -lt 1073741824 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1048576'}') + transfer_enable_Used="${transfer_enable_Used} MB" + elif [[ ${transfer_enable_Used_1} -lt 1099511627776 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1073741824'}') + transfer_enable_Used="${transfer_enable_Used} GB" + elif [[ ${transfer_enable_Used_1} -lt 1125899906842624 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1099511627776'}') + transfer_enable_Used="${transfer_enable_Used} TB" + fi + #echo "transfer_enable_Used=${transfer_enable_Used}" + if [[ ${transfer_enable_Used_2_1} -lt 1024 ]]; then + transfer_enable_Used_2="${transfer_enable_Used_2_1} B" + elif [[ ${transfer_enable_Used_2_1} -lt 1048576 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1024'}') + transfer_enable_Used_2="${transfer_enable_Used_2} KB" + elif [[ ${transfer_enable_Used_2_1} -lt 1073741824 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1048576'}') + transfer_enable_Used_2="${transfer_enable_Used_2} MB" + elif [[ ${transfer_enable_Used_2_1} -lt 1099511627776 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1073741824'}') + transfer_enable_Used_2="${transfer_enable_Used_2} GB" + elif [[ ${transfer_enable_Used_2_1} -lt 1125899906842624 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1099511627776'}') + transfer_enable_Used_2="${transfer_enable_Used_2} TB" + fi + #echo "transfer_enable_Used_2=${transfer_enable_Used_2}" +} +Get_User_transfer_all(){ + if [[ ${transfer_enable_Used_233} -lt 1024 ]]; then + transfer_enable_Used_233_2="${transfer_enable_Used_233} B" + elif [[ ${transfer_enable_Used_233} -lt 1048576 ]]; then + transfer_enable_Used_233_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_233}'/'1024'}') + transfer_enable_Used_233_2="${transfer_enable_Used_233_2} KB" + elif [[ ${transfer_enable_Used_233} -lt 1073741824 ]]; then + transfer_enable_Used_233_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_233}'/'1048576'}') + transfer_enable_Used_233_2="${transfer_enable_Used_233_2} MB" + elif [[ ${transfer_enable_Used_233} -lt 1099511627776 ]]; then + transfer_enable_Used_233_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_233}'/'1073741824'}') + transfer_enable_Used_233_2="${transfer_enable_Used_233_2} GB" + elif [[ ${transfer_enable_Used_233} -lt 1125899906842624 ]]; then + transfer_enable_Used_233_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_233}'/'1099511627776'}') + transfer_enable_Used_233_2="${transfer_enable_Used_233_2} TB" + fi +} +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g;s/+/-/g;s/\//_/g') + echo -e "${date}" +} +ss_link_qr(){ + SSbase64=$(urlsafe_base64 "${method}:${password}@${ip}:${port}") + SSurl="ss://${SSbase64}" + SSQRcode="http://doub.pw/qr/qr.php?text=${SSurl}" + ss_link=" SS 链接 : ${Green_font_prefix}${SSurl}${Font_color_suffix} \n SS 二维码 : ${Green_font_prefix}${SSQRcode}${Font_color_suffix}" +} +ssr_link_qr(){ + SSRprotocol=$(echo ${protocol} | sed 's/_compatible//g') + SSRobfs=$(echo ${obfs} | sed 's/_compatible//g') + SSRPWDbase64=$(urlsafe_base64 "${password}") + SSRbase64=$(urlsafe_base64 "${ip}:${port}:${SSRprotocol}:${method}:${SSRobfs}:${SSRPWDbase64}") + SSRurl="ssr://${SSRbase64}" + SSRQRcode="http://doub.pw/qr/qr.php?text=${SSRurl}" + ssr_link=" SSR 链接 : ${Red_font_prefix}${SSRurl}${Font_color_suffix} \n SSR 二维码 : ${Red_font_prefix}${SSRQRcode}${Font_color_suffix} \n " +} +ss_ssr_determine(){ + protocol_suffix=`echo ${protocol} | awk -F "_" '{print $NF}'` + obfs_suffix=`echo ${obfs} | awk -F "_" '{print $NF}'` + if [[ ${protocol} = "origin" ]]; then + if [[ ${obfs} = "plain" ]]; then + ss_link_qr + ssr_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + ss_link="" + else + ss_link_qr + fi + fi + else + if [[ ${protocol_suffix} != "compatible" ]]; then + ss_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + if [[ ${obfs_suffix} = "plain" ]]; then + ss_link_qr + else + ss_link="" + fi + else + ss_link_qr + fi + fi + fi + ssr_link_qr +} +# 显示 配置信息 +View_User(){ + SSR_installation_status + List_port_user + while true + do + echo -e "请输入要查看账号信息的用户 端口" + read -e -p "(默认: 取消):" View_user_port + [[ -z "${View_user_port}" ]] && echo -e "已取消..." && exit 1 + View_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${View_user_port}"',') + if [[ ! -z ${View_user} ]]; then + Get_User_info "${View_user_port}" + View_User_info + break + else + echo -e "${Error} 请输入正确的端口 !" + fi + done +} +View_User_info(){ + ip=$(cat ${config_user_api_file}|grep "SERVER_PUB_ADDR = "|awk -F "[']" '{print $2}') + [[ -z "${ip}" ]] && Get_IP + ss_ssr_determine + clear && echo "===================================================" && echo + echo -e " 用户 [${user_name}] 的配置信息:" && echo + echo -e " I P\t : ${Green_font_prefix}${ip}${Font_color_suffix}" + echo -e " 端口\t : ${Green_font_prefix}${port}${Font_color_suffix}" + echo -e " 密码\t : ${Green_font_prefix}${password}${Font_color_suffix}" + echo -e " 加密\t : ${Green_font_prefix}${method}${Font_color_suffix}" + echo -e " 协议\t : ${Red_font_prefix}${protocol}${Font_color_suffix}" + echo -e " 混淆\t : ${Red_font_prefix}${obfs}${Font_color_suffix}" + echo -e " 设备数限制 : ${Green_font_prefix}${protocol_param}${Font_color_suffix}" + echo -e " 单线程限速 : ${Green_font_prefix}${speed_limit_per_con} KB/S${Font_color_suffix}" + echo -e " 用户总限速 : ${Green_font_prefix}${speed_limit_per_user} KB/S${Font_color_suffix}" + echo -e " 禁止的端口 : ${Green_font_prefix}${forbidden_port} ${Font_color_suffix}" + echo + echo -e " 已使用流量 : 上传: ${Green_font_prefix}${u}${Font_color_suffix} + 下载: ${Green_font_prefix}${d}${Font_color_suffix} = ${Green_font_prefix}${transfer_enable_Used_2}${Font_color_suffix}" + echo -e " 剩余的流量 : ${Green_font_prefix}${transfer_enable_Used} ${Font_color_suffix}" + echo -e " 用户总流量 : ${Green_font_prefix}${transfer_enable} ${Font_color_suffix}" + echo -e "${ss_link}" + echo -e "${ssr_link}" + echo -e " ${Green_font_prefix} 提示: ${Font_color_suffix} + 在浏览器中,打开二维码链接,就可以看到二维码图片。 + 协议和混淆后面的[ _compatible ],指的是 兼容原版协议/混淆。" + echo && echo "===================================================" +} +# 设置 配置信息 +Set_config_user(){ + echo "请输入要设置的用户 用户名(请勿重复, 用于区分, 不支持中文、空格, 会报错 !)" + read -e -p "(默认: doubi):" ssr_user + [[ -z "${ssr_user}" ]] && ssr_user="doubi" + ssr_user=$(echo "${ssr_user}"|sed 's/ //g') + echo && echo ${Separator_1} && echo -e " 用户名 : ${Green_font_prefix}${ssr_user}${Font_color_suffix}" && echo ${Separator_1} && echo +} +Set_config_port(){ + while true + do + echo -e "请输入要设置的用户 端口(请勿重复, 用于区分)" + read -e -p "(默认: 2333):" ssr_port + [[ -z "$ssr_port" ]] && ssr_port="2333" + echo $((${ssr_port}+0)) &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_port} -ge 1 ]] && [[ ${ssr_port} -le 65535 ]]; then + echo && echo ${Separator_1} && echo -e " 端口 : ${Green_font_prefix}${ssr_port}${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo -e "${Error} 请输入正确的数字(1-65535)" + fi + else + echo -e "${Error} 请输入正确的数字(1-65535)" + fi + done +} +Set_config_password(){ + echo "请输入要设置的用户 密码" + read -e -p "(默认: doub.io):" ssr_password + [[ -z "${ssr_password}" ]] && ssr_password="doub.io" + echo && echo ${Separator_1} && echo -e " 密码 : ${Green_font_prefix}${ssr_password}${Font_color_suffix}" && echo ${Separator_1} && echo +} +Set_config_method(){ + echo -e "请选择要设置的用户 加密方式 + + ${Green_font_prefix} 1.${Font_color_suffix} none + ${Tip} 如果使用 auth_chain_* 系列协议,建议加密方式选择 none (该系列协议自带 RC4 加密),混淆随意 + + ${Green_font_prefix} 2.${Font_color_suffix} rc4 + ${Green_font_prefix} 3.${Font_color_suffix} rc4-md5 + ${Green_font_prefix} 4.${Font_color_suffix} rc4-md5-6 + + ${Green_font_prefix} 5.${Font_color_suffix} aes-128-ctr + ${Green_font_prefix} 6.${Font_color_suffix} aes-192-ctr + ${Green_font_prefix} 7.${Font_color_suffix} aes-256-ctr + + ${Green_font_prefix} 8.${Font_color_suffix} aes-128-cfb + ${Green_font_prefix} 9.${Font_color_suffix} aes-192-cfb + ${Green_font_prefix}10.${Font_color_suffix} aes-256-cfb + + ${Green_font_prefix}11.${Font_color_suffix} aes-128-cfb8 + ${Green_font_prefix}12.${Font_color_suffix} aes-192-cfb8 + ${Green_font_prefix}13.${Font_color_suffix} aes-256-cfb8 + + ${Green_font_prefix}14.${Font_color_suffix} salsa20 + ${Green_font_prefix}15.${Font_color_suffix} chacha20 + ${Green_font_prefix}16.${Font_color_suffix} chacha20-ietf + ${Tip} salsa20/chacha20-*系列加密方式,需要额外安装依赖 libsodium ,否则会无法启动ShadowsocksR !" && echo + read -e -p "(默认: 5. aes-128-ctr):" ssr_method + [[ -z "${ssr_method}" ]] && ssr_method="5" + if [[ ${ssr_method} == "1" ]]; then + ssr_method="none" + elif [[ ${ssr_method} == "2" ]]; then + ssr_method="rc4" + elif [[ ${ssr_method} == "3" ]]; then + ssr_method="rc4-md5" + elif [[ ${ssr_method} == "4" ]]; then + ssr_method="rc4-md5-6" + elif [[ ${ssr_method} == "5" ]]; then + ssr_method="aes-128-ctr" + elif [[ ${ssr_method} == "6" ]]; then + ssr_method="aes-192-ctr" + elif [[ ${ssr_method} == "7" ]]; then + ssr_method="aes-256-ctr" + elif [[ ${ssr_method} == "8" ]]; then + ssr_method="aes-128-cfb" + elif [[ ${ssr_method} == "9" ]]; then + ssr_method="aes-192-cfb" + elif [[ ${ssr_method} == "10" ]]; then + ssr_method="aes-256-cfb" + elif [[ ${ssr_method} == "11" ]]; then + ssr_method="aes-128-cfb8" + elif [[ ${ssr_method} == "12" ]]; then + ssr_method="aes-192-cfb8" + elif [[ ${ssr_method} == "13" ]]; then + ssr_method="aes-256-cfb8" + elif [[ ${ssr_method} == "14" ]]; then + ssr_method="salsa20" + elif [[ ${ssr_method} == "15" ]]; then + ssr_method="chacha20" + elif [[ ${ssr_method} == "16" ]]; then + ssr_method="chacha20-ietf" + else + ssr_method="aes-128-ctr" + fi + echo && echo ${Separator_1} && echo -e " 加密 : ${Green_font_prefix}${ssr_method}${Font_color_suffix}" && echo ${Separator_1} && echo +} +Set_config_protocol(){ + echo -e "请选择要设置的用户 协议插件 + + ${Green_font_prefix}1.${Font_color_suffix} origin + ${Green_font_prefix}2.${Font_color_suffix} auth_sha1_v4 + ${Green_font_prefix}3.${Font_color_suffix} auth_aes128_md5 + ${Green_font_prefix}4.${Font_color_suffix} auth_aes128_sha1 + ${Green_font_prefix}5.${Font_color_suffix} auth_chain_a + ${Green_font_prefix}6.${Font_color_suffix} auth_chain_b + ${Tip} 如果使用 auth_chain_* 系列协议,建议加密方式选择 none (该系列协议自带 RC4 加密),混淆随意" && echo + read -e -p "(默认: 3. auth_aes128_md5):" ssr_protocol + [[ -z "${ssr_protocol}" ]] && ssr_protocol="3" + if [[ ${ssr_protocol} == "1" ]]; then + ssr_protocol="origin" + elif [[ ${ssr_protocol} == "2" ]]; then + ssr_protocol="auth_sha1_v4" + elif [[ ${ssr_protocol} == "3" ]]; then + ssr_protocol="auth_aes128_md5" + elif [[ ${ssr_protocol} == "4" ]]; then + ssr_protocol="auth_aes128_sha1" + elif [[ ${ssr_protocol} == "5" ]]; then + ssr_protocol="auth_chain_a" + elif [[ ${ssr_protocol} == "6" ]]; then + ssr_protocol="auth_chain_b" + else + ssr_protocol="auth_aes128_md5" + fi + echo && echo ${Separator_1} && echo -e " 协议 : ${Green_font_prefix}${ssr_protocol}${Font_color_suffix}" && echo ${Separator_1} && echo + if [[ ${ssr_protocol} != "origin" ]]; then + if [[ ${ssr_protocol} == "auth_sha1_v4" ]]; then + read -e -p "是否设置 协议插件兼容原版(_compatible)?[Y/n]" ssr_protocol_yn + [[ -z "${ssr_protocol_yn}" ]] && ssr_protocol_yn="y" + [[ $ssr_protocol_yn == [Yy] ]] && ssr_protocol=${ssr_protocol}"_compatible" + echo + fi + fi +} +Set_config_obfs(){ + echo -e "请选择要设置的用户 混淆插件 + + ${Green_font_prefix}1.${Font_color_suffix} plain + ${Green_font_prefix}2.${Font_color_suffix} http_simple + ${Green_font_prefix}3.${Font_color_suffix} http_post + ${Green_font_prefix}4.${Font_color_suffix} random_head + ${Green_font_prefix}5.${Font_color_suffix} tls1.2_ticket_auth + ${Tip} 如果使用 ShadowsocksR 代理游戏,建议选择 混淆兼容原版或 plain 混淆,然后客户端选择 plain,否则会增加延迟 ! + 另外, 如果你选择了 tls1.2_ticket_auth,那么客户端可以选择 tls1.2_ticket_fastauth,这样即能伪装又不会增加延迟 ! + 如果你是在日本、美国等热门地区搭建,那么选择 plain 混淆可能被墙几率更低 !" && echo + read -e -p "(默认: 1. plain):" ssr_obfs + [[ -z "${ssr_obfs}" ]] && ssr_obfs="1" + if [[ ${ssr_obfs} == "1" ]]; then + ssr_obfs="plain" + elif [[ ${ssr_obfs} == "2" ]]; then + ssr_obfs="http_simple" + elif [[ ${ssr_obfs} == "3" ]]; then + ssr_obfs="http_post" + elif [[ ${ssr_obfs} == "4" ]]; then + ssr_obfs="random_head" + elif [[ ${ssr_obfs} == "5" ]]; then + ssr_obfs="tls1.2_ticket_auth" + else + ssr_obfs="plain" + fi + echo && echo ${Separator_1} && echo -e " 混淆 : ${Green_font_prefix}${ssr_obfs}${Font_color_suffix}" && echo ${Separator_1} && echo + if [[ ${ssr_obfs} != "plain" ]]; then + read -e -p "是否设置 混淆插件兼容原版(_compatible)?[Y/n]" ssr_obfs_yn + [[ -z "${ssr_obfs_yn}" ]] && ssr_obfs_yn="y" + [[ $ssr_obfs_yn == [Yy] ]] && ssr_obfs=${ssr_obfs}"_compatible" + echo + fi +} +Set_config_protocol_param(){ + while true + do + echo -e "请输入要设置的用户 欲限制的设备数 (${Green_font_prefix} auth_* 系列协议 不兼容原版才有效 ${Font_color_suffix})" + echo -e "${Tip} 设备数限制:每个端口同一时间能链接的客户端数量(多端口模式,每个端口都是独立计算),建议最少 2个。" + read -e -p "(默认: 无限):" ssr_protocol_param + [[ -z "$ssr_protocol_param" ]] && ssr_protocol_param="" && echo && break + echo $((${ssr_protocol_param}+0)) &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_protocol_param} -ge 1 ]] && [[ ${ssr_protocol_param} -le 9999 ]]; then + echo && echo ${Separator_1} && echo -e " 设备数限制 : ${Green_font_prefix}${ssr_protocol_param}${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo -e "${Error} 请输入正确的数字(1-9999)" + fi + else + echo -e "${Error} 请输入正确的数字(1-9999)" + fi + done +} +Set_config_speed_limit_per_con(){ + while true + do + echo -e "请输入要设置的用户 单线程 限速上限(单位:KB/S)" + echo -e "${Tip} 单线程限速:每个端口 单线程的限速上限,多线程即无效。" + read -e -p "(默认: 无限):" ssr_speed_limit_per_con + [[ -z "$ssr_speed_limit_per_con" ]] && ssr_speed_limit_per_con=0 && echo && break + echo $((${ssr_speed_limit_per_con}+0)) &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_con} -ge 1 ]] && [[ ${ssr_speed_limit_per_con} -le 131072 ]]; then + echo && echo ${Separator_1} && echo -e " 单线程限速 : ${Green_font_prefix}${ssr_speed_limit_per_con} KB/S${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo -e "${Error} 请输入正确的数字(1-131072)" + fi + else + echo -e "${Error} 请输入正确的数字(1-131072)" + fi + done +} +Set_config_speed_limit_per_user(){ + while true + do + echo + echo -e "请输入要设置的用户 总速度 限速上限(单位:KB/S)" + echo -e "${Tip} 端口总限速:每个端口 总速度 限速上限,单个端口整体限速。" + read -e -p "(默认: 无限):" ssr_speed_limit_per_user + [[ -z "$ssr_speed_limit_per_user" ]] && ssr_speed_limit_per_user=0 && echo && break + echo $((${ssr_speed_limit_per_user}+0)) &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_user} -ge 1 ]] && [[ ${ssr_speed_limit_per_user} -le 131072 ]]; then + echo && echo ${Separator_1} && echo -e " 用户总限速 : ${Green_font_prefix}${ssr_speed_limit_per_user} KB/S${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo -e "${Error} 请输入正确的数字(1-131072)" + fi + else + echo -e "${Error} 请输入正确的数字(1-131072)" + fi + done +} +Set_config_transfer(){ + while true + do + echo + echo -e "请输入要设置的用户 可使用的总流量上限(单位: GB, 1-838868 GB)" + read -e -p "(默认: 无限):" ssr_transfer + [[ -z "$ssr_transfer" ]] && ssr_transfer="838868" && echo && break + echo $((${ssr_transfer}+0)) &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_transfer} -ge 1 ]] && [[ ${ssr_transfer} -le 838868 ]]; then + echo && echo ${Separator_1} && echo -e " 用户总流量 : ${Green_font_prefix}${ssr_transfer} GB${Font_color_suffix}" && echo ${Separator_1} && echo + break + else + echo -e "${Error} 请输入正确的数字(1-838868)" + fi + else + echo -e "${Error} 请输入正确的数字(1-838868)" + fi + done +} +Set_config_forbid(){ + echo "请输入要设置的用户 禁止访问的端口" + echo -e "${Tip} 禁止的端口:例如不允许访问 25端口,用户就无法通过SSR代理访问 邮件端口25了,如果禁止了 80,443 那么用户将无法正常访问 http/https 网站。 +封禁单个端口格式: 25 +封禁多个端口格式: 23,465 +封禁 端口段格式: 233-266 +封禁多种格式端口: 25,465,233-666 (不带冒号:)" + read -e -p "(默认为空 不禁止访问任何端口):" ssr_forbid + [[ -z "${ssr_forbid}" ]] && ssr_forbid="" + echo && echo ${Separator_1} && echo -e " 禁止的端口 : ${Green_font_prefix}${ssr_forbid}${Font_color_suffix}" && echo ${Separator_1} && echo +} +Set_config_enable(){ + user_total=$(echo $((${user_total}-1))) + for((integer = 0; integer <= ${user_total}; integer++)) + do + echo -e "integer=${integer}" + port_jq=$(${jq_file} ".[${integer}].port" "${config_user_mudb_file}") + echo -e "port_jq=${port_jq}" + if [[ "${ssr_port}" == "${port_jq}" ]]; then + enable=$(${jq_file} ".[${integer}].enable" "${config_user_mudb_file}") + echo -e "enable=${enable}" + [[ "${enable}" == "null" ]] && echo -e "${Error} 获取当前端口[${ssr_port}]的禁用状态失败 !" && exit 1 + ssr_port_num=$(cat "${config_user_mudb_file}"|grep -n '"port": '${ssr_port}','|awk -F ":" '{print $1}') + echo -e "ssr_port_num=${ssr_port_num}" + [[ "${ssr_port_num}" == "null" ]] && echo -e "${Error} 获取当前端口[${ssr_port}]的行数失败 !" && exit 1 + ssr_enable_num=$(echo $((${ssr_port_num}-5))) + echo -e "ssr_enable_num=${ssr_enable_num}" + break + fi + done + if [[ "${enable}" == "1" ]]; then + echo -e "端口 [${ssr_port}] 的账号状态为:${Green_font_prefix}启用${Font_color_suffix} , 是否切换为 ${Red_font_prefix}禁用${Font_color_suffix} ?[Y/n]" + read -e -p "(默认: Y):" ssr_enable_yn + [[ -z "${ssr_enable_yn}" ]] && ssr_enable_yn="y" + if [[ "${ssr_enable_yn}" == [Yy] ]]; then + ssr_enable="0" + else + echo "取消..." && exit 0 + fi + elif [[ "${enable}" == "0" ]]; then + echo -e "端口 [${ssr_port}] 的账号状态为:${Green_font_prefix}禁用${Font_color_suffix} , 是否切换为 ${Red_font_prefix}启用${Font_color_suffix} ?[Y/n]" + read -e -p "(默认: Y):" ssr_enable_yn + [[ -z "${ssr_enable_yn}" ]] && ssr_enable_yn = "y" + if [[ "${ssr_enable_yn}" == [Yy] ]]; then + ssr_enable="1" + else + echo "取消..." && exit 0 + fi + else + echo -e "${Error} 当前端口的禁用状态异常[${enable}] !" && exit 1 + fi +} +Set_user_api_server_pub_addr(){ + addr=$1 + if [[ "${addr}" == "Modify" ]]; then + server_pub_addr=$(cat ${config_user_api_file}|grep "SERVER_PUB_ADDR = "|awk -F "[']" '{print $2}') + if [[ -z ${server_pub_addr} ]]; then + echo -e "${Error} 获取当前配置的 服务器IP或域名失败!" && exit 1 + else + echo -e "${Info} 当前配置的服务器IP或域名为: ${Green_font_prefix}${server_pub_addr}${Font_color_suffix}" + fi + fi + echo "请输入用户配置中要显示的 服务器IP或域名 (当服务器有多个IP时,可以指定用户配置中显示的IP或者域名)" + read -e -p "(默认自动检测外网IP):" ssr_server_pub_addr + if [[ -z "${ssr_server_pub_addr}" ]]; then + Get_IP + if [[ ${ip} == "VPS_IP" ]]; then + while true + do + read -e -p "${Error} 自动检测外网IP失败,请手动输入服务器IP或域名" ssr_server_pub_addr + if [[ -z "$ssr_server_pub_addr" ]]; then + echo -e "${Error} 不能为空!" + else + break + fi + done + else + ssr_server_pub_addr="${ip}" + fi + fi + echo && echo ${Separator_1} && echo -e " IP或域名 : ${Green_font_prefix}${ssr_server_pub_addr}${Font_color_suffix}" && echo ${Separator_1} && echo +} +Set_config_all(){ + lal=$1 + if [[ "${lal}" == "Modify" ]]; then + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Set_config_transfer + Set_config_forbid + else + Set_config_user + Set_config_port + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Set_config_transfer + Set_config_forbid + fi +} +# 修改 配置信息 +Modify_config_password(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -k "${ssr_password}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} 用户密码修改失败 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} 用户密码修改成功 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} (注意:可能需要十秒左右才会应用最新配置)" + fi +} +Modify_config_method(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -m "${ssr_method}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} 用户加密方式修改失败 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} 用户加密方式修改成功 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} (注意:可能需要十秒左右才会应用最新配置)" + fi +} +Modify_config_protocol(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -O "${ssr_protocol}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} 用户协议修改失败 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} 用户协议修改成功 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} (注意:可能需要十秒左右才会应用最新配置)" + fi +} +Modify_config_obfs(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -o "${ssr_obfs}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} 用户混淆修改失败 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} 用户混淆修改成功 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} (注意:可能需要十秒左右才会应用最新配置)" + fi +} +Modify_config_protocol_param(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -G "${ssr_protocol_param}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} 用户协议参数(设备数限制)修改失败 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} 用户议参数(设备数限制)修改成功 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} (注意:可能需要十秒左右才会应用最新配置)" + fi +} +Modify_config_speed_limit_per_con(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -s "${ssr_speed_limit_per_con}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} 用户单线程限速修改失败 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} 用户单线程限速修改成功 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} (注意:可能需要十秒左右才会应用最新配置)" + fi +} +Modify_config_speed_limit_per_user(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -S "${ssr_speed_limit_per_user}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} 用户端口总限速修改失败 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} 用户端口总限速修改成功 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} (注意:可能需要十秒左右才会应用最新配置)" + fi +} +Modify_config_connect_verbose_info(){ + sed -i 's/"connect_verbose_info": '"$(echo ${connect_verbose_info})"',/"connect_verbose_info": '"$(echo ${ssr_connect_verbose_info})"',/g' ${config_user_file} +} +Modify_config_transfer(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -t "${ssr_transfer}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} 用户总流量修改失败 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} 用户总流量修改成功 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} (注意:可能需要十秒左右才会应用最新配置)" + fi +} +Modify_config_forbid(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -f "${ssr_forbid}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} 用户禁止访问端口修改失败 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} 用户禁止访问端口修改成功 ${Green_font_prefix}[端口: ${ssr_port}]${Font_color_suffix} (注意:可能需要十秒左右才会应用最新配置)" + fi +} +Modify_config_enable(){ + sed -i "${ssr_enable_num}"'s/"enable": '"$(echo ${enable})"',/"enable": '"$(echo ${ssr_enable})"',/' ${config_user_mudb_file} +} +Modify_user_api_server_pub_addr(){ + sed -i "s/SERVER_PUB_ADDR = '${server_pub_addr}'/SERVER_PUB_ADDR = '${ssr_server_pub_addr}'/" ${config_user_api_file} +} +Modify_config_all(){ + Modify_config_password + Modify_config_method + Modify_config_protocol + Modify_config_obfs + Modify_config_protocol_param + Modify_config_speed_limit_per_con + Modify_config_speed_limit_per_user + Modify_config_transfer + Modify_config_forbid +} +Check_python(){ + python_ver=`python -h` + if [[ -z ${python_ver} ]]; then + echo -e "${Info} 没有安装Python,开始安装..." + if [[ ${release} == "centos" ]]; then + yum install -y python + else + apt-get install -y python + fi + fi +} +Centos_yum(){ + yum update + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + yum install -y vim unzip crond net-tools + else + yum install -y vim unzip crond + fi +} +Debian_apt(){ + apt-get update + cat /etc/issue |grep 9\..*>/dev/null + if [[ $? = 0 ]]; then + apt-get install -y vim unzip cron net-tools + else + apt-get install -y vim unzip cron + fi +} +# 下载 ShadowsocksR +Download_SSR(){ + cd "/usr/local" + wget -N --no-check-certificate "https://github.com/ToyoDAdoubi/shadowsocksr/archive/manyuser.zip" + #git config --global http.sslVerify false + #env GIT_SSL_NO_VERIFY=true git clone -b manyuser https://github.com/ToyoDAdoubi/shadowsocksr.git + #[[ ! -e ${ssr_folder} ]] && echo -e "${Error} ShadowsocksR服务端 下载失败 !" && exit 1 + [[ ! -e "manyuser.zip" ]] && echo -e "${Error} ShadowsocksR服务端 压缩包 下载失败 !" && rm -rf manyuser.zip && exit 1 + unzip "manyuser.zip" + [[ ! -e "/usr/local/shadowsocksr-manyuser/" ]] && echo -e "${Error} ShadowsocksR服务端 解压失败 !" && rm -rf manyuser.zip && exit 1 + mv "/usr/local/shadowsocksr-manyuser/" "/usr/local/shadowsocksr/" + [[ ! -e "/usr/local/shadowsocksr/" ]] && echo -e "${Error} ShadowsocksR服务端 重命名失败 !" && rm -rf manyuser.zip && rm -rf "/usr/local/shadowsocksr-manyuser/" && exit 1 + rm -rf manyuser.zip + cd "shadowsocksr" + cp "${ssr_folder}/config.json" "${config_user_file}" + cp "${ssr_folder}/mysql.json" "${ssr_folder}/usermysql.json" + cp "${ssr_folder}/apiconfig.py" "${config_user_api_file}" + [[ ! -e ${config_user_api_file} ]] && echo -e "${Error} ShadowsocksR服务端 apiconfig.py 复制失败 !" && exit 1 + sed -i "s/API_INTERFACE = 'sspanelv2'/API_INTERFACE = 'mudbjson'/" ${config_user_api_file} + server_pub_addr="127.0.0.1" + Modify_user_api_server_pub_addr + #sed -i "s/SERVER_PUB_ADDR = '127.0.0.1'/SERVER_PUB_ADDR = '${ip}'/" ${config_user_api_file} + sed -i 's/ \/\/ only works under multi-user mode//g' "${config_user_file}" + echo -e "${Info} ShadowsocksR服务端 下载完成 !" +} +Service_SSR(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/ssrmu_centos -O /etc/init.d/ssrmu; then + echo -e "${Error} ShadowsocksR服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/ssrmu + chkconfig --add ssrmu + chkconfig ssrmu on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/ssrmu_debian -O /etc/init.d/ssrmu; then + echo -e "${Error} ShadowsocksR服务 管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/ssrmu + update-rc.d -f ssrmu defaults + fi + echo -e "${Info} ShadowsocksR服务 管理脚本下载完成 !" +} +# 安装 JQ解析器 +JQ_install(){ + if [[ ! -e ${jq_file} ]]; then + cd "${ssr_folder}" + if [[ ${bit} = "x86_64" ]]; then + mv "jq-linux64" "jq" + #wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64" -O ${jq_file} + else + mv "jq-linux32" "jq" + #wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux32" -O ${jq_file} + fi + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ解析器 重命名失败,请检查 !" && exit 1 + chmod +x ${jq_file} + echo -e "${Info} JQ解析器 安装完成,继续..." + else + echo -e "${Info} JQ解析器 已安装,继续..." + fi +} +# 安装 依赖 +Installation_dependency(){ + if [[ ${release} == "centos" ]]; then + Centos_yum + else + Debian_apt + fi + [[ ! -e "/usr/bin/unzip" ]] && echo -e "${Error} 依赖 unzip(解压压缩包) 安装失败,多半是软件包源的问题,请检查 !" && exit 1 + Check_python + #echo "nameserver 8.8.8.8" > /etc/resolv.conf + #echo "nameserver 8.8.4.4" >> /etc/resolv.conf + \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + if [[ ${release} == "centos" ]]; then + /etc/init.d/crond restart + else + /etc/init.d/cron restart + fi +} +Install_SSR(){ + check_root + [[ -e ${ssr_folder} ]] && echo -e "${Error} ShadowsocksR 文件夹已存在,请检查( 如安装失败或者存在旧版本,请先卸载 ) !" && exit 1 + echo -e "${Info} 开始设置 ShadowsocksR账号配置..." + Set_user_api_server_pub_addr + Set_config_all + echo -e "${Info} 开始安装/配置 ShadowsocksR依赖..." + Installation_dependency + echo -e "${Info} 开始下载/安装 ShadowsocksR文件..." + Download_SSR + echo -e "${Info} 开始下载/安装 ShadowsocksR服务脚本(init)..." + Service_SSR + echo -e "${Info} 开始下载/安装 JSNO解析器 JQ..." + JQ_install + echo -e "${Info} 开始添加初始用户..." + Add_port_user "install" + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动 ShadowsocksR服务端..." + Start_SSR + Get_User_info "${ssr_port}" + View_User_info +} +Update_SSR(){ + SSR_installation_status + echo -e "因破娃暂停更新ShadowsocksR服务端,所以此功能临时禁用。" + #cd ${ssr_folder} + #git pull + #Restart_SSR +} +Uninstall_SSR(){ + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} 没有安装 ShadowsocksR,请检查 !" && exit 1 + echo "确定要 卸载ShadowsocksR?[y/N]" && echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z "${PID}" ]] && kill -9 ${PID} + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + if [[ ! -z ${user_info} ]]; then + for((integer = 1; integer <= ${user_total}; integer++)) + do + port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + Del_iptables + done + Save_iptables + fi + if [[ ! -z $(crontab -l | grep "ssrmu.sh") ]]; then + crontab_monitor_ssr_cron_stop + Clear_transfer_all_cron_stop + fi + if [[ ${release} = "centos" ]]; then + chkconfig --del ssrmu + else + update-rc.d -f ssrmu remove + fi + rm -rf ${ssr_folder} && rm -rf /etc/init.d/ssrmu + echo && echo " ShadowsocksR 卸载完成 !" && echo + else + echo && echo " 卸载已取消..." && echo + fi +} +Check_Libsodium_ver(){ + echo -e "${Info} 开始获取 libsodium 最新版本..." + Libsodiumr_ver=$(wget -qO- "https://github.com/jedisct1/libsodium/tags"|grep "/jedisct1/libsodium/releases/tag/"|head -1|sed -r 's/.*tag\/(.+)\">.*/\1/') + [[ -z ${Libsodiumr_ver} ]] && Libsodiumr_ver=${Libsodiumr_ver_backup} + echo -e "${Info} libsodium 最新版本为 ${Green_font_prefix}${Libsodiumr_ver}${Font_color_suffix} !" +} +Install_Libsodium(){ + if [[ -e ${Libsodiumr_file} ]]; then + echo -e "${Error} libsodium 已安装 , 是否覆盖安装(更新)?[y/N]" + read -e -p "(默认: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Nn] ]]; then + echo "已取消..." && exit 1 + fi + else + echo -e "${Info} libsodium 未安装,开始安装..." + fi + Check_Libsodium_ver + if [[ ${release} == "centos" ]]; then + yum update + echo -e "${Info} 安装依赖..." + yum -y groupinstall "Development Tools" + echo -e "${Info} 下载..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} 解压..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} 编译安装..." + ./configure --disable-maintainer-mode && make -j2 && make install + echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf + else + apt-get update + echo -e "${Info} 安装依赖..." + apt-get install -y build-essential + echo -e "${Info} 下载..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} 解压..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} 编译安装..." + ./configure --disable-maintainer-mode && make -j2 && make install + fi + ldconfig + cd .. && rm -rf libsodium-${Libsodiumr_ver}.tar.gz && rm -rf libsodium-${Libsodiumr_ver} + [[ ! -e ${Libsodiumr_file} ]] && echo -e "${Error} libsodium 安装失败 !" && exit 1 + echo && echo -e "${Info} libsodium 安装成功 !" && echo +} +# 显示 连接信息 +debian_View_user_connection_info(){ + format_1=$1 + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} 没有发现 用户,请检查 !" && exit 1 + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep ":${user_port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_info_233=$(python mujson_mgr.py -l|grep -w "${user_port}"|awk '{print $2}'|sed 's/\[//g;s/\]//g') + user_list_all=${user_list_all}"用户名: ${Green_font_prefix}"${user_info_233}"${Font_color_suffix}\t 端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "用户总数: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} 链接IP总数: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + echo -e "${user_list_all}" +} +centos_View_user_connection_info(){ + format_1=$1 + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} 没有发现 用户,请检查 !" && exit 1 + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep ":${user_port} "|grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_info_233=$(python mujson_mgr.py -l|grep -w "${user_port}"|awk '{print $2}'|sed 's/\[//g;s/\]//g') + user_list_all=${user_list_all}"用户名: ${Green_font_prefix}"${user_info_233}"${Font_color_suffix}\t 端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 链接IP总数: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}\t 当前链接IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "用户总数: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} 链接IP总数: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + echo -e "${user_list_all}" +} +View_user_connection_info(){ + SSR_installation_status + echo && echo -e "请选择要显示的格式: + ${Green_font_prefix}1.${Font_color_suffix} 显示 IP 格式 + ${Green_font_prefix}2.${Font_color_suffix} 显示 IP+IP归属地 格式" && echo + read -e -p "(默认: 1):" ssr_connection_info + [[ -z "${ssr_connection_info}" ]] && ssr_connection_info="1" + if [[ ${ssr_connection_info} == "1" ]]; then + View_user_connection_info_1 "" + elif [[ ${ssr_connection_info} == "2" ]]; then + echo -e "${Tip} 检测IP归属地(ipip.net),如果IP较多,可能时间会比较长..." + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} 请输入正确的数字(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + #echo "user_IP_1=${user_IP_1}" + if [[ ! -z ${user_IP_1} ]]; then + #echo "user_IP_total=${user_IP_total}" + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=`echo "${user_IP_1}" |sed -n "$integer_1"p` + #echo "IP=${IP}" + IP_address=`wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g'` + #echo "IP_address=${IP_address}" + user_IP="${user_IP}\n${IP}(${IP_address})" + #echo "user_IP=${user_IP}" + sleep 1s + done + fi +} +# 修改 用户配置 +Modify_port(){ + List_port_user + while true + do + echo -e "请输入要修改的用户 端口" + read -e -p "(默认: 取消):" ssr_port + [[ -z "${ssr_port}" ]] && echo -e "已取消..." && exit 1 + Modify_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${ssr_port}"',') + if [[ ! -z ${Modify_user} ]]; then + break + else + echo -e "${Error} 请输入正确的端口 !" + fi + done +} +Modify_Config(){ + SSR_installation_status + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 添加 用户配置 + ${Green_font_prefix}2.${Font_color_suffix} 删除 用户配置 +————— 修改 用户配置 ————— + ${Green_font_prefix}3.${Font_color_suffix} 修改 用户密码 + ${Green_font_prefix}4.${Font_color_suffix} 修改 加密方式 + ${Green_font_prefix}5.${Font_color_suffix} 修改 协议插件 + ${Green_font_prefix}6.${Font_color_suffix} 修改 混淆插件 + ${Green_font_prefix}7.${Font_color_suffix} 修改 设备数限制 + ${Green_font_prefix}8.${Font_color_suffix} 修改 单线程限速 + ${Green_font_prefix}9.${Font_color_suffix} 修改 用户总限速 + ${Green_font_prefix}10.${Font_color_suffix} 修改 用户总流量 + ${Green_font_prefix}11.${Font_color_suffix} 修改 用户禁用端口 + ${Green_font_prefix}12.${Font_color_suffix} 修改 全部配置 +————— 其他 ————— + ${Green_font_prefix}13.${Font_color_suffix} 修改 用户配置中显示的IP或域名 + + ${Tip} 用户的用户名和端口是无法修改,如果需要修改请使用脚本的 手动修改功能 !" && echo + read -e -p "(默认: 取消):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo "已取消..." && exit 1 + if [[ ${ssr_modify} == "1" ]]; then + Add_port_user + elif [[ ${ssr_modify} == "2" ]]; then + Del_port_user + elif [[ ${ssr_modify} == "3" ]]; then + Modify_port + Set_config_password + Modify_config_password + elif [[ ${ssr_modify} == "4" ]]; then + Modify_port + Set_config_method + Modify_config_method + elif [[ ${ssr_modify} == "5" ]]; then + Modify_port + Set_config_protocol + Modify_config_protocol + elif [[ ${ssr_modify} == "6" ]]; then + Modify_port + Set_config_obfs + Modify_config_obfs + elif [[ ${ssr_modify} == "7" ]]; then + Modify_port + Set_config_protocol_param + Modify_config_protocol_param + elif [[ ${ssr_modify} == "8" ]]; then + Modify_port + Set_config_speed_limit_per_con + Modify_config_speed_limit_per_con + elif [[ ${ssr_modify} == "9" ]]; then + Modify_port + Set_config_speed_limit_per_user + Modify_config_speed_limit_per_user + elif [[ ${ssr_modify} == "10" ]]; then + Modify_port + Set_config_transfer + Modify_config_transfer + elif [[ ${ssr_modify} == "11" ]]; then + Modify_port + Set_config_forbid + Modify_config_forbid + elif [[ ${ssr_modify} == "12" ]]; then + Modify_port + Set_config_all "Modify" + Modify_config_all + elif [[ ${ssr_modify} == "13" ]]; then + Set_user_api_server_pub_addr "Modify" + Modify_user_api_server_pub_addr + else + echo -e "${Error} 请输入正确的数字(1-13)" && exit 1 + fi +} +List_port_user(){ + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} 没有发现 用户,请检查 !" && exit 1 + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_username=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $2}'|sed 's/\[//g;s/\]//g') + Get_User_transfer "${user_port}" + transfer_enable_Used_233=$(echo $((${transfer_enable_Used_233}+${transfer_enable_Used_2_1}))) + user_list_all=${user_list_all}"用户名: ${Green_font_prefix} "${user_username}"${Font_color_suffix}\t 端口: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\t 流量使用情况(已用+剩余=总): ${Green_font_prefix}${transfer_enable_Used_2}${Font_color_suffix} + ${Green_font_prefix}${transfer_enable_Used}${Font_color_suffix} = ${Green_font_prefix}${transfer_enable}${Font_color_suffix}\n" + done + Get_User_transfer_all + echo && echo -e "=== 用户总数 ${Green_background_prefix} "${user_total}" ${Font_color_suffix}" + echo -e ${user_list_all} + echo -e "=== 当前所有用户已使用流量总和: ${Green_background_prefix} ${transfer_enable_Used_233_2} ${Font_color_suffix}\n" +} +Add_port_user(){ + lalal=$1 + if [[ "$lalal" == "install" ]]; then + match_add=$(python mujson_mgr.py -a -u "${ssr_user}" -p "${ssr_port}" -k "${ssr_password}" -m "${ssr_method}" -O "${ssr_protocol}" -G "${ssr_protocol_param}" -o "${ssr_obfs}" -s "${ssr_speed_limit_per_con}" -S "${ssr_speed_limit_per_user}" -t "${ssr_transfer}" -f "${ssr_forbid}"|grep -w "add user info") + else + while true + do + Set_config_all + match_port=$(python mujson_mgr.py -l|grep -w "port ${ssr_port}$") + [[ ! -z "${match_port}" ]] && echo -e "${Error} 该端口 [${ssr_port}] 已存在,请勿重复添加 !" && exit 1 + match_username=$(python mujson_mgr.py -l|grep -w "user \[${ssr_user}]") + [[ ! -z "${match_username}" ]] && echo -e "${Error} 该用户名 [${ssr_user}] 已存在,请勿重复添加 !" && exit 1 + match_add=$(python mujson_mgr.py -a -u "${ssr_user}" -p "${ssr_port}" -k "${ssr_password}" -m "${ssr_method}" -O "${ssr_protocol}" -G "${ssr_protocol_param}" -o "${ssr_obfs}" -s "${ssr_speed_limit_per_con}" -S "${ssr_speed_limit_per_user}" -t "${ssr_transfer}" -f "${ssr_forbid}"|grep -w "add user info") + if [[ -z "${match_add}" ]]; then + echo -e "${Error} 用户添加失败 ${Green_font_prefix}[用户名: ${ssr_user} , 端口: ${ssr_port}]${Font_color_suffix} " + break + else + Add_iptables + Save_iptables + echo -e "${Info} 用户添加成功 ${Green_font_prefix}[用户名: ${ssr_user} , 端口: ${ssr_port}]${Font_color_suffix} " + echo + read -e -p "是否继续 添加用户配置?[Y/n]:" addyn + [[ -z ${addyn} ]] && addyn="y" + if [[ ${addyn} == [Nn] ]]; then + Get_User_info "${ssr_port}" + View_User_info + break + else + echo -e "${Info} 继续 添加用户配置..." + fi + fi + done + fi +} +Del_port_user(){ + List_port_user + while true + do + echo -e "请输入要删除的用户 端口" + read -e -p "(默认: 取消):" del_user_port + [[ -z "${del_user_port}" ]] && echo -e "已取消..." && exit 1 + del_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${del_user_port}"',') + if [[ ! -z ${del_user} ]]; then + port=${del_user_port} + match_del=$(python mujson_mgr.py -d -p "${del_user_port}"|grep -w "delete user ") + if [[ -z "${match_del}" ]]; then + echo -e "${Error} 用户删除失败 ${Green_font_prefix}[端口: ${del_user_port}]${Font_color_suffix} " + else + Del_iptables + Save_iptables + echo -e "${Info} 用户删除成功 ${Green_font_prefix}[端口: ${del_user_port}]${Font_color_suffix} " + fi + break + else + echo -e "${Error} 请输入正确的端口 !" + fi + done +} +Manually_Modify_Config(){ + SSR_installation_status + vi ${config_user_mudb_file} + echo "是否现在重启ShadowsocksR?[Y/n]" && echo + read -e -p "(默认: y):" yn + [[ -z ${yn} ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + Restart_SSR + fi +} +Clear_transfer(){ + SSR_installation_status + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 清零 单个用户已使用流量 + ${Green_font_prefix}2.${Font_color_suffix} 清零 所有用户已使用流量(不可挽回) + ${Green_font_prefix}3.${Font_color_suffix} 启动 定时所有用户流量清零 + ${Green_font_prefix}4.${Font_color_suffix} 停止 定时所有用户流量清零 + ${Green_font_prefix}5.${Font_color_suffix} 修改 定时所有用户流量清零" && echo + read -e -p "(默认: 取消):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo "已取消..." && exit 1 + if [[ ${ssr_modify} == "1" ]]; then + Clear_transfer_one + elif [[ ${ssr_modify} == "2" ]]; then + echo "确定要 清零 所有用户已使用流量?[y/N]" && echo + read -e -p "(默认: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Yy] ]]; then + Clear_transfer_all + else + echo "取消..." + fi + elif [[ ${ssr_modify} == "3" ]]; then + check_crontab + Set_crontab + Clear_transfer_all_cron_start + elif [[ ${ssr_modify} == "4" ]]; then + check_crontab + Clear_transfer_all_cron_stop + elif [[ ${ssr_modify} == "5" ]]; then + check_crontab + Clear_transfer_all_cron_modify + else + echo -e "${Error} 请输入正确的数字(1-5)" && exit 1 + fi +} +Clear_transfer_one(){ + List_port_user + while true + do + echo -e "请输入要清零已使用流量的用户 端口" + read -e -p "(默认: 取消):" Clear_transfer_user_port + [[ -z "${Clear_transfer_user_port}" ]] && echo -e "已取消..." && exit 1 + Clear_transfer_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${Clear_transfer_user_port}"',') + if [[ ! -z ${Clear_transfer_user} ]]; then + match_clear=$(python mujson_mgr.py -c -p "${Clear_transfer_user_port}"|grep -w "clear user ") + if [[ -z "${match_clear}" ]]; then + echo -e "${Error} 用户已使用流量清零失败 ${Green_font_prefix}[端口: ${Clear_transfer_user_port}]${Font_color_suffix} " + else + echo -e "${Info} 用户已使用流量清零成功 ${Green_font_prefix}[端口: ${Clear_transfer_user_port}]${Font_color_suffix} " + fi + break + else + echo -e "${Error} 请输入正确的端口 !" + fi + done +} +Clear_transfer_all(){ + cd "${ssr_folder}" + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} 没有发现 用户,请检查 !" && exit 1 + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + match_clear=$(python mujson_mgr.py -c -p "${user_port}"|grep -w "clear user ") + if [[ -z "${match_clear}" ]]; then + echo -e "${Error} 用户已使用流量清零失败 ${Green_font_prefix}[端口: ${user_port}]${Font_color_suffix} " + else + echo -e "${Info} 用户已使用流量清零成功 ${Green_font_prefix}[端口: ${user_port}]${Font_color_suffix} " + fi + done + echo -e "${Info} 所有用户流量清零完毕 !" +} +Clear_transfer_all_cron_start(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh/d" "$file/crontab.bak" + echo -e "\n${Crontab_time} /bin/bash $file/ssrmu.sh clearall" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} 定时所有用户流量清零启动失败 !" && exit 1 + else + echo -e "${Info} 定时所有用户流量清零启动成功 !" + fi +} +Clear_transfer_all_cron_stop(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} 定时所有用户流量清零停止失败 !" && exit 1 + else + echo -e "${Info} 定时所有用户流量清零停止成功 !" + fi +} +Clear_transfer_all_cron_modify(){ + Set_crontab + Clear_transfer_all_cron_stop + Clear_transfer_all_cron_start +} +Set_crontab(){ + echo -e "请输入流量清零时间间隔 + === 格式说明 === + * * * * * 分别对应 分钟 小时 日份 月份 星期 + ${Green_font_prefix} 0 2 1 * * ${Font_color_suffix} 代表 每月1日2点0分 清零已使用流量 + ${Green_font_prefix} 0 2 15 * * ${Font_color_suffix} 代表 每月15日2点0分 清零已使用流量 + ${Green_font_prefix} 0 2 */7 * * ${Font_color_suffix} 代表 每7天2点0分 清零已使用流量 + ${Green_font_prefix} 0 2 * * 0 ${Font_color_suffix} 代表 每个星期日(7) 清零已使用流量 + ${Green_font_prefix} 0 2 * * 3 ${Font_color_suffix} 代表 每个星期三(3) 清零已使用流量" && echo + read -e -p "(默认: 0 2 1 * * 每月1日2点0分):" Crontab_time + [[ -z "${Crontab_time}" ]] && Crontab_time="0 2 1 * *" +} +Start_SSR(){ + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} ShadowsocksR 正在运行 !" && exit 1 + /etc/init.d/ssrmu start +} +Stop_SSR(){ + SSR_installation_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} ShadowsocksR 未运行 !" && exit 1 + /etc/init.d/ssrmu stop +} +Restart_SSR(){ + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/ssrmu stop + /etc/init.d/ssrmu start +} +View_Log(){ + SSR_installation_status + [[ ! -e ${ssr_log_file} ]] && echo -e "${Error} ShadowsocksR日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${ssr_log_file}${Font_color_suffix} 命令。" && echo + tail -f ${ssr_log_file} +} +# 锐速 +Configure_Server_Speeder(){ + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 安装 锐速 + ${Green_font_prefix}2.${Font_color_suffix} 卸载 锐速 +———————— + ${Green_font_prefix}3.${Font_color_suffix} 启动 锐速 + ${Green_font_prefix}4.${Font_color_suffix} 停止 锐速 + ${Green_font_prefix}5.${Font_color_suffix} 重启 锐速 + ${Green_font_prefix}6.${Font_color_suffix} 查看 锐速 状态 + + 注意: 锐速和LotServer不能同时安装/启动!" && echo + read -e -p "(默认: 取消):" server_speeder_num + [[ -z "${server_speeder_num}" ]] && echo "已取消..." && exit 1 + if [[ ${server_speeder_num} == "1" ]]; then + Install_ServerSpeeder + elif [[ ${server_speeder_num} == "2" ]]; then + Server_Speeder_installation_status + Uninstall_ServerSpeeder + elif [[ ${server_speeder_num} == "3" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} start + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "4" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} stop + elif [[ ${server_speeder_num} == "5" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} restart + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "6" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} status + else + echo -e "${Error} 请输入正确的数字(1-6)" && exit 1 + fi +} +Install_ServerSpeeder(){ + [[ -e ${Server_Speeder_file} ]] && echo -e "${Error} 锐速(Server Speeder) 已安装 !" && exit 1 + #借用91yun.rog的开心版锐速 + wget --no-check-certificate -qO /tmp/serverspeeder.sh https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder.sh + [[ ! -e "/tmp/serverspeeder.sh" ]] && echo -e "${Error} 锐速安装脚本下载失败 !" && exit 1 + bash /tmp/serverspeeder.sh + sleep 2s + PID=`ps -ef |grep -v grep |grep "serverspeeder" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + rm -rf /tmp/serverspeeder.sh + rm -rf /tmp/91yunserverspeeder + rm -rf /tmp/91yunserverspeeder.tar.gz + echo -e "${Info} 锐速(Server Speeder) 安装完成 !" && exit 1 + else + echo -e "${Error} 锐速(Server Speeder) 安装失败 !" && exit 1 + fi +} +Uninstall_ServerSpeeder(){ + echo "确定要卸载 锐速(Server Speeder)?[y/N]" && echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && echo && echo "已取消..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + chattr -i /serverspeeder/etc/apx* + /serverspeeder/bin/serverSpeeder.sh uninstall -f + echo && echo "锐速(Server Speeder) 卸载完成 !" && echo + fi +} +# LotServer +Configure_LotServer(){ + echo && echo -e "你要做什么? + ${Green_font_prefix}1.${Font_color_suffix} 安装 LotServer + ${Green_font_prefix}2.${Font_color_suffix} 卸载 LotServer +———————— + ${Green_font_prefix}3.${Font_color_suffix} 启动 LotServer + ${Green_font_prefix}4.${Font_color_suffix} 停止 LotServer + ${Green_font_prefix}5.${Font_color_suffix} 重启 LotServer + ${Green_font_prefix}6.${Font_color_suffix} 查看 LotServer 状态 + + 注意: 锐速和LotServer不能同时安装/启动!" && echo + read -e -p "(默认: 取消):" lotserver_num + [[ -z "${lotserver_num}" ]] && echo "已取消..." && exit 1 + if [[ ${lotserver_num} == "1" ]]; then + Install_LotServer + elif [[ ${lotserver_num} == "2" ]]; then + LotServer_installation_status + Uninstall_LotServer + elif [[ ${lotserver_num} == "3" ]]; then + LotServer_installation_status + ${LotServer_file} start + ${LotServer_file} status + elif [[ ${lotserver_num} == "4" ]]; then + LotServer_installation_status + ${LotServer_file} stop + elif [[ ${lotserver_num} == "5" ]]; then + LotServer_installation_status + ${LotServer_file} restart + ${LotServer_file} status + elif [[ ${lotserver_num} == "6" ]]; then + LotServer_installation_status + ${LotServer_file} status + else + echo -e "${Error} 请输入正确的数字(1-6)" && exit 1 + fi +} +Install_LotServer(){ + [[ -e ${LotServer_file} ]] && echo -e "${Error} LotServer 已安装 !" && exit 1 + #Github: https://github.com/0oVicero0/serverSpeeder_Install + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" + [[ ! -e "/tmp/appex.sh" ]] && echo -e "${Error} LotServer 安装脚本下载失败 !" && exit 1 + bash /tmp/appex.sh 'install' + sleep 2s + PID=`ps -ef |grep -v grep |grep "appex" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + echo -e "${Info} LotServer 安装完成 !" && exit 1 + else + echo -e "${Error} LotServer 安装失败 !" && exit 1 + fi +} +Uninstall_LotServer(){ + echo "确定要卸载 LotServer?[y/N]" && echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && echo && echo "已取消..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" && bash /tmp/appex.sh 'uninstall' + echo && echo "LotServer 卸载完成 !" && echo + fi +} +# BBR +Configure_BBR(){ + echo && echo -e " 你要做什么? + + ${Green_font_prefix}1.${Font_color_suffix} 安装 BBR +———————— + ${Green_font_prefix}2.${Font_color_suffix} 启动 BBR + ${Green_font_prefix}3.${Font_color_suffix} 停止 BBR + ${Green_font_prefix}4.${Font_color_suffix} 查看 BBR 状态" && echo +echo -e "${Green_font_prefix} [安装前 请注意] ${Font_color_suffix} +1. 安装开启BBR,需要更换内核,存在更换失败等风险(重启后无法开机) +2. 本脚本仅支持 Debian / Ubuntu 系统更换内核,OpenVZ和Docker 不支持更换内核 +3. Debian 更换内核过程中会提示 [ 是否终止卸载内核 ] ,请选择 ${Green_font_prefix} NO ${Font_color_suffix}" && echo + read -e -p "(默认: 取消):" bbr_num + [[ -z "${bbr_num}" ]] && echo "已取消..." && exit 1 + if [[ ${bbr_num} == "1" ]]; then + Install_BBR + elif [[ ${bbr_num} == "2" ]]; then + Start_BBR + elif [[ ${bbr_num} == "3" ]]; then + Stop_BBR + elif [[ ${bbr_num} == "4" ]]; then + Status_BBR + else + echo -e "${Error} 请输入正确的数字(1-4)" && exit 1 + fi +} +Install_BBR(){ + [[ ${release} = "centos" ]] && echo -e "${Error} 本脚本不支持 CentOS系统安装 BBR !" && exit 1 + BBR_installation_status + bash "${BBR_file}" +} +Start_BBR(){ + BBR_installation_status + bash "${BBR_file}" start +} +Stop_BBR(){ + BBR_installation_status + bash "${BBR_file}" stop +} +Status_BBR(){ + BBR_installation_status + bash "${BBR_file}" status +} +# 其他功能 +Other_functions(){ + echo && echo -e " 你要做什么? + + ${Green_font_prefix}1.${Font_color_suffix} 配置 BBR + ${Green_font_prefix}2.${Font_color_suffix} 配置 锐速(ServerSpeeder) + ${Green_font_prefix}3.${Font_color_suffix} 配置 LotServer(锐速母公司) + ${Tip} 锐速/LotServer/BBR 不支持 OpenVZ! + ${Tip} 锐速和LotServer不能共存! +———————————— + ${Green_font_prefix}4.${Font_color_suffix} 一键封禁 BT/PT/SPAM (iptables) + ${Green_font_prefix}5.${Font_color_suffix} 一键解封 BT/PT/SPAM (iptables) +———————————— + ${Green_font_prefix}6.${Font_color_suffix} 切换 ShadowsocksR日志输出模式 + —— 说明:SSR默认只输出错误日志,此项可切换为输出详细的访问日志。 + ${Green_font_prefix}7.${Font_color_suffix} 监控 ShadowsocksR服务端运行状态 + —— 说明:该功能适合于SSR服务端经常进程结束,启动该功能后会每分钟检测一次,当进程不存在则自动启动SSR服务端。" && echo + read -e -p "(默认: 取消):" other_num + [[ -z "${other_num}" ]] && echo "已取消..." && exit 1 + if [[ ${other_num} == "1" ]]; then + Configure_BBR + elif [[ ${other_num} == "2" ]]; then + Configure_Server_Speeder + elif [[ ${other_num} == "3" ]]; then + Configure_LotServer + elif [[ ${other_num} == "4" ]]; then + BanBTPTSPAM + elif [[ ${other_num} == "5" ]]; then + UnBanBTPTSPAM + elif [[ ${other_num} == "6" ]]; then + Set_config_connect_verbose_info + elif [[ ${other_num} == "7" ]]; then + Set_crontab_monitor_ssr + else + echo -e "${Error} 请输入正确的数字 [1-7]" && exit 1 + fi +} +# 封禁 BT PT SPAM +BanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh banall + rm -rf ban_iptables.sh +} +# 解封 BT PT SPAM +UnBanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh unbanall + rm -rf ban_iptables.sh +} +Set_config_connect_verbose_info(){ + SSR_installation_status + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ解析器 不存在,请检查 !" && exit 1 + connect_verbose_info=`${jq_file} '.connect_verbose_info' ${config_user_file}` + if [[ ${connect_verbose_info} = "0" ]]; then + echo && echo -e "当前日志模式: ${Green_font_prefix}简单模式(只输出错误日志)${Font_color_suffix}" && echo + echo -e "确定要切换为 ${Green_font_prefix}详细模式(输出详细连接日志+错误日志)${Font_color_suffix}?[y/N]" + read -e -p "(默认: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="1" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前日志模式: ${Green_font_prefix}详细模式(输出详细连接日志+错误日志)${Font_color_suffix}" && echo + echo -e "确定要切换为 ${Green_font_prefix}简单模式(只输出错误日志)${Font_color_suffix}?[y/N]" + read -e -p "(默认: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="0" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " 已取消..." && echo + fi + fi +} +Set_crontab_monitor_ssr(){ + SSR_installation_status + crontab_monitor_ssr_status=$(crontab -l|grep "ssrmu.sh monitor") + if [[ -z "${crontab_monitor_ssr_status}" ]]; then + echo && echo -e "当前监控模式: ${Green_font_prefix}未开启${Font_color_suffix}" && echo + echo -e "确定要开启为 ${Green_font_prefix}ShadowsocksR服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动SSR服务端)[Y/n]" + read -e -p "(默认: y):" crontab_monitor_ssr_status_ny + [[ -z "${crontab_monitor_ssr_status_ny}" ]] && crontab_monitor_ssr_status_ny="y" + if [[ ${crontab_monitor_ssr_status_ny} == [Yy] ]]; then + crontab_monitor_ssr_cron_start + else + echo && echo " 已取消..." && echo + fi + else + echo && echo -e "当前监控模式: ${Green_font_prefix}已开启${Font_color_suffix}" && echo + echo -e "确定要关闭为 ${Green_font_prefix}ShadowsocksR服务端运行状态监控${Font_color_suffix} 功能吗?(当进程关闭则自动启动SSR服务端)[y/N]" + read -e -p "(默认: n):" crontab_monitor_ssr_status_ny + [[ -z "${crontab_monitor_ssr_status_ny}" ]] && crontab_monitor_ssr_status_ny="n" + if [[ ${crontab_monitor_ssr_status_ny} == [Yy] ]]; then + crontab_monitor_ssr_cron_stop + else + echo && echo " 已取消..." && echo + fi + fi +} +crontab_monitor_ssr(){ + SSR_installation_status + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] 检测到 ShadowsocksR服务端 未运行 , 开始启动..." | tee -a ${ssr_log_file} + /etc/init.d/ssrmu start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] ShadowsocksR服务端 启动失败..." | tee -a ${ssr_log_file} && exit 1 + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] ShadowsocksR服务端 启动成功..." | tee -a ${ssr_log_file} && exit 1 + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] ShadowsocksR服务端 进程运行正常..." exit 0 + fi +} +crontab_monitor_ssr_cron_start(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh monitor/d" "$file/crontab.bak" + echo -e "\n* * * * * /bin/bash $file/ssrmu.sh monitor" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} ShadowsocksR服务端运行状态监控功能 启动失败 !" && exit 1 + else + echo -e "${Info} ShadowsocksR服务端运行状态监控功能 启动成功 !" + fi +} +crontab_monitor_ssr_cron_stop(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh monitor/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} ShadowsocksR服务端运行状态监控功能 停止失败 !" && exit 1 + else + echo -e "${Info} ShadowsocksR服务端运行状态监控功能 停止成功 !" + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssrmu.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/ssrmu" ]]; then + rm -rf /etc/init.d/ssrmu + Service_SSR + fi + cd "${file}" + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssrmu.sh" && chmod +x ssrmu.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +# 显示 菜单状态 +menu_status(){ + if [[ -e ${ssr_folder} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi + cd "${ssr_folder}" + else + echo -e " 当前状态: ${Red_font_prefix}未安装${Font_color_suffix}" + fi +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && [[ ${release} != "centos" ]] && echo -e "${Error} 本脚本不支持当前系统 ${release} !" && exit 1 +action=$1 +if [[ "${action}" == "clearall" ]]; then + Clear_transfer_all +elif [[ "${action}" == "monitor" ]]; then + crontab_monitor_ssr +else + echo -e " ShadowsocksR MuJSON一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + ---- Toyo | doub.io/ss-jc60 ---- + + ${Green_font_prefix}1.${Font_color_suffix} 安装 ShadowsocksR + ${Green_font_prefix}2.${Font_color_suffix} 更新 ShadowsocksR + ${Green_font_prefix}3.${Font_color_suffix} 卸载 ShadowsocksR + ${Green_font_prefix}4.${Font_color_suffix} 安装 libsodium(chacha20) +———————————— + ${Green_font_prefix}5.${Font_color_suffix} 查看 账号信息 + ${Green_font_prefix}6.${Font_color_suffix} 显示 连接信息 + ${Green_font_prefix}7.${Font_color_suffix} 设置 用户配置 + ${Green_font_prefix}8.${Font_color_suffix} 手动 修改配置 + ${Green_font_prefix}9.${Font_color_suffix} 配置 流量清零 +———————————— + ${Green_font_prefix}10.${Font_color_suffix} 启动 ShadowsocksR + ${Green_font_prefix}11.${Font_color_suffix} 停止 ShadowsocksR + ${Green_font_prefix}12.${Font_color_suffix} 重启 ShadowsocksR + ${Green_font_prefix}13.${Font_color_suffix} 查看 ShadowsocksR 日志 +———————————— + ${Green_font_prefix}14.${Font_color_suffix} 其他功能 + ${Green_font_prefix}15.${Font_color_suffix} 升级脚本 + " + menu_status + echo && read -e -p "请输入数字 [1-15]:" num +case "$num" in + 1) + Install_SSR + ;; + 2) + Update_SSR + ;; + 3) + Uninstall_SSR + ;; + 4) + Install_Libsodium + ;; + 5) + View_User + ;; + 6) + View_user_connection_info + ;; + 7) + Modify_Config + ;; + 8) + Manually_Modify_Config + ;; + 9) + Clear_transfer + ;; + 10) + Start_SSR + ;; + 11) + Stop_SSR + ;; + 12) + Restart_SSR + ;; + 13) + View_Log + ;; + 14) + Other_functions + ;; + 15) + Update_Shell + ;; + *) + echo -e "${Error} 请输入正确的数字 [1-15]" + ;; +esac +fi \ No newline at end of file diff --git a/ssrstatus.sh b/ssrstatus.sh new file mode 100644 index 0000000..1bda115 --- /dev/null +++ b/ssrstatus.sh @@ -0,0 +1,889 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS 6+/Debian 7+/Ubuntu 14.04+ +# Description: ShadowsocksR Status +# Version: 1.0.5 +# Author: Toyo +#================================================= + +sh_ver="1.0.5" +Timeout="10" +Test_URL="https://www.bing.com" +Web_file="/usr/local/SSRStatus" +SSR_folder="/root/shadowsocksr/shadowsocks" +filepath=$(cd "$(dirname "$0")"; pwd) +file=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +log_file="${file}/ssr_status.log" +config_file="${file}/ssr_status.conf" +JSON_file="/usr/local/SSRStatus/json/stats.json" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" && Error="${Red_font_prefix}[错误]${Font_color_suffix}" && Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + #bit=`uname -m` +} +check_installed_server_status(){ + [[ ! -e "${Web_file}" ]] && echo -e "${Error} SSRStatus Web网页文件没有安装,请检查 !" && exit 1 +} +set_config_ip(){ + echo "请输入 ShadowsocksR 账号服务器公网IP" + read -e -p "(默认取消):" ip + [[ -z "${ip}" ]] && echo "已取消..." && exit 1 + echo && echo -e " I P : ${Red_font_prefix}${ip}${Font_color_suffix}" && echo +} +set_config_port(){ + while true + do + echo -e "请输入 ShadowsocksR 账号端口" + read -e -p "(默认: 2333):" port + [[ -z "$port" ]] && port="2333" + echo $((${port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${port} -ge 1 ]] && [[ ${port} -le 65535 ]]; then + echo && echo -e " 端口 : ${Red_font_prefix}${port}${Font_color_suffix}" && echo + break + else + echo -e "${Error} 请输入正确的数字!" + fi + else + echo -e "${Error} 请输入正确的数字!" + fi + done +} +set_config_password(){ + echo "请输入 ShadowsocksR 账号密码" + read -e -p "(默认: doub.io):" passwd + [[ -z "${passwd}" ]] && passwd="doub.io" + echo && echo -e " 密码 : ${Red_font_prefix}${passwd}${Font_color_suffix}" && echo +} +set_config_method(){ + echo -e "请选择要设置的ShadowsocksR账号 加密方式 + ${Green_font_prefix} 1.${Font_color_suffix} none + + ${Green_font_prefix} 2.${Font_color_suffix} rc4 + ${Green_font_prefix} 3.${Font_color_suffix} rc4-md5 + ${Green_font_prefix} 4.${Font_color_suffix} rc4-md5-6 + + ${Green_font_prefix} 5.${Font_color_suffix} aes-128-ctr + ${Green_font_prefix} 6.${Font_color_suffix} aes-192-ctr + ${Green_font_prefix} 7.${Font_color_suffix} aes-256-ctr + + ${Green_font_prefix} 8.${Font_color_suffix} aes-128-cfb + ${Green_font_prefix} 9.${Font_color_suffix} aes-192-cfb + ${Green_font_prefix}10.${Font_color_suffix} aes-256-cfb + + ${Green_font_prefix}11.${Font_color_suffix} aes-128-cfb8 + ${Green_font_prefix}12.${Font_color_suffix} aes-192-cfb8 + ${Green_font_prefix}13.${Font_color_suffix} aes-256-cfb8 + + ${Green_font_prefix}14.${Font_color_suffix} salsa20 + ${Green_font_prefix}15.${Font_color_suffix} chacha20 + ${Green_font_prefix}16.${Font_color_suffix} chacha20-ietf + ${Tip} salsa20/chacha20-*系列加密方式,需要额外安装依赖 libsodium ,否则会无法启动ShadowsocksR !" && echo + read -e -p "(默认: 5. aes-128-ctr):" method + [[ -z "${method}" ]] && method="5" + if [[ ${method} == "1" ]]; then + method="none" + elif [[ ${method} == "2" ]]; then + method="rc4" + elif [[ ${method} == "3" ]]; then + method="rc4-md5" + elif [[ ${method} == "4" ]]; then + method="rc4-md5-6" + elif [[ ${method} == "5" ]]; then + method="aes-128-ctr" + elif [[ ${method} == "6" ]]; then + method="aes-192-ctr" + elif [[ ${method} == "7" ]]; then + method="aes-256-ctr" + elif [[ ${method} == "8" ]]; then + method="aes-128-cfb" + elif [[ ${method} == "9" ]]; then + method="aes-192-cfb" + elif [[ ${method} == "10" ]]; then + method="aes-256-cfb" + elif [[ ${method} == "11" ]]; then + method="aes-128-cfb8" + elif [[ ${method} == "12" ]]; then + method="aes-192-cfb8" + elif [[ ${method} == "13" ]]; then + method="aes-256-cfb8" + elif [[ ${method} == "14" ]]; then + method="salsa20" + elif [[ ${method} == "15" ]]; then + method="chacha20" + elif [[ ${method} == "16" ]]; then + method="chacha20-ietf" + else + method="aes-128-ctr" + fi + echo && echo ${Separator_1} && echo -e " 加密 : ${Red_font_prefix}${method}${Font_color_suffix}" && echo ${Separator_1} && echo +} +set_config_protocol(){ + echo -e "请选择ShadowsocksR账号 协议插件 + ${Green_font_prefix}1.${Font_color_suffix} origin + ${Green_font_prefix}2.${Font_color_suffix} auth_sha1_v4 + ${Green_font_prefix}3.${Font_color_suffix} auth_aes128_md5 + ${Green_font_prefix}4.${Font_color_suffix} auth_aes128_sha1 + ${Green_font_prefix}5.${Font_color_suffix} auth_chain_a" && echo + read -e -p "(默认: 2. auth_sha1_v4):" protocol + [[ -z "${protocol}" ]] && protocol="2" + if [[ ${protocol} == "1" ]]; then + protocol="origin" + elif [[ ${protocol} == "2" ]]; then + protocol="auth_sha1_v4" + elif [[ ${protocol} == "3" ]]; then + protocol="auth_aes128_md5" + elif [[ ${protocol} == "4" ]]; then + protocol="auth_aes128_sha1" + elif [[ ${protocol} == "5" ]]; then + protocol="auth_chain_a" + else + protocol="auth_sha1_v4" + fi + echo && echo -e " 协议 : ${Red_font_prefix}${protocol}${Font_color_suffix}" && echo +} +set_config_obfs(){ + echo -e "请选择ShadowsocksR账号 混淆插件 + ${Green_font_prefix}1.${Font_color_suffix} plain + ${Green_font_prefix}2.${Font_color_suffix} http_simple + ${Green_font_prefix}3.${Font_color_suffix} http_post + ${Green_font_prefix}4.${Font_color_suffix} random_head + ${Green_font_prefix}5.${Font_color_suffix} tls1.2_ticket_auth" && echo + read -e -p "(默认: 5. tls1.2_ticket_auth):" obfs + [[ -z "${obfs}" ]] && obfs="5" + if [[ ${obfs} == "1" ]]; then + obfs="plain" + elif [[ ${obfs} == "2" ]]; then + obfs="http_simple" + elif [[ ${obfs} == "3" ]]; then + obfs="http_post" + elif [[ ${obfs} == "4" ]]; then + obfs="random_head" + elif [[ ${obfs} == "5" ]]; then + obfs="tls1.2_ticket_auth" + else + obfs="tls1.2_ticket_auth" + fi + echo && echo -e " 混淆 : ${Red_font_prefix}${obfs}${Font_color_suffix}" && echo +} +set_config_like(){ + echo "请输入 ShadowsocksR 的链接(SS/SSR链接皆可,如 ss://xxxx ssr://xxxx)" + read -e -p "(默认回车取消):" Like + [[ -z "${Like}" ]] && echo "已取消..." && exit 1 + echo && echo -e " 链接 : ${Red_font_prefix}${Like}${Font_color_suffix}" && echo +} +set_config_user(){ + echo -e "请输入选择输入方式 + ${Green_font_prefix}1.${Font_color_suffix} 输入ShadowsocksR账号全部信息(Shadowsocks原版也可以) + ${Green_font_prefix}2.${Font_color_suffix} 输入ShadowsocksR账号的 SSR链接(Shadowsocks原版也可以)" + read -e -p "(默认:2):" enter_type + [[ -z "${enter_type}" ]] && enter_type="2" + if [[ ${enter_type} == "1" ]]; then + echo -e "下面依次开始输入要检测可用性的 ShadowsocksR账号信息。" && echo + set_config_ip + set_config_port + set_config_password + set_config_method + set_config_protocol + set_config_obfs + return 1 + elif [[ ${enter_type} == "2" ]]; then + set_config_like + return 2 + else + set_config_like + return 2 + fi +} +set_config_name(){ + echo "请输入 ShadowsocksR 账号的名称(用于区分,取个名字,可重复)" + read -e -p "(默认取消):" Config_Name + [[ -z "${Config_Name}" ]] && echo "已取消..." && exit 1 + echo && echo -e " 名称 : ${Red_font_prefix}${Config_Name}${Font_color_suffix}" && echo +} +set_config_location(){ + echo "请输入 ShadowsocksR 账号的位置(用于区分,可重复)" + read -e -p "(默认取消):" Config_Location + [[ -z "${Config_Location}" ]] && echo "已取消..." && exit 1 + echo && echo -e " 位置 : ${Red_font_prefix}${Config_Location}${Font_color_suffix}" && echo +} +Set_server(){ + echo -e "请输入 SSRStatus 网站要设置的 域名[server] +默认为本机IP为域名,例如输入: toyoo.ml,如果要使用本机IP,请留空直接回车" + read -e -p "(默认: 本机IP):" server_s + [[ -z "$server_s" ]] && server_s="" + + echo && echo -e " IP/域名[server]: ${Red_background_prefix} ${server_s} ${Font_color_suffix}" && echo +} +Set_server_port(){ + while true + do + echo -e "请输入 SSRStatus 网站要设置的 域名/IP的端口[1-65535](如果是域名的话,一般建议用 http 80 端口)" + read -e -p "(默认: 8888):" server_port_s + [[ -z "$server_port_s" ]] && server_port_s="8888" + echo $((${server_port_s}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${server_port_s} -ge 1 ]] && [[ ${server_port_s} -le 65535 ]]; then + echo && echo -e " IP/域名[server]: ${Red_background_prefix} ${server_port_s} ${Font_color_suffix}" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_crontab(){ + echo -e "请选择你要设置的ShadowsocksR账号检测时间间隔(如账号很多,请不要设置时间间隔过小) + ${Green_font_prefix}1.${Font_color_suffix} 5分钟 + ${Green_font_prefix}2.${Font_color_suffix} 10分钟 + ${Green_font_prefix}3.${Font_color_suffix} 20分钟 + ${Green_font_prefix}4.${Font_color_suffix} 30分钟 + ${Green_font_prefix}5.${Font_color_suffix} 40分钟 + ${Green_font_prefix}6.${Font_color_suffix} 50分钟 + ${Green_font_prefix}7.${Font_color_suffix} 1小时 + ${Green_font_prefix}8.${Font_color_suffix} 2小时 + ${Green_font_prefix}9.${Font_color_suffix} 自定义输入" && echo + read -e -p "(默认: 2. 10分钟):" Crontab_time + [[ -z "${Crontab_time}" ]] && Crontab_time="2" + if [[ ${Crontab_time} == "1" ]]; then + Crontab_time="*/5 * * * *" + elif [[ ${Crontab_time} == "2" ]]; then + Crontab_time="*/10 * * * *" + elif [[ ${Crontab_time} == "3" ]]; then + Crontab_time="*/20 * * * *" + elif [[ ${Crontab_time} == "4" ]]; then + Crontab_time="*/30 * * * *" + elif [[ ${Crontab_time} == "5" ]]; then + Crontab_time="*/40 * * * *" + elif [[ ${Crontab_time} == "6" ]]; then + Crontab_time="*/50 * * * *" + elif [[ ${Crontab_time} == "7" ]]; then + Crontab_time="0 * * * *" + elif [[ ${Crontab_time} == "8" ]]; then + Crontab_time="0 */2 * * *" + elif [[ ${Crontab_time} == "9" ]]; then + Set_crontab_customize + else + Crontab_time="*/10 * * * *" + fi + echo && echo -e " 间隔时间 : ${Red_font_prefix}${Crontab_time}${Font_color_suffix}" && echo + Add_Crontab +} +Set_crontab_customize(){ + echo -e "请输入ShadowsocksR账号检测时间间隔(如账号很多,请不要设置时间间隔过小) + === 格式说明 === + * * * * * 分别对应 分钟 小时 日份 月份 星期 + ${Green_font_prefix} */10 * * * * ${Font_color_suffix} 代表每10分钟 检测一次 + ${Green_font_prefix} 0 */2 * * * ${Font_color_suffix} 代表每2小时的0分 检测一次 + ${Green_font_prefix} 10 * * * * ${Font_color_suffix} 代表每小时的第10分 检测一次 + ${Green_font_prefix} * 2 * * * ${Font_color_suffix} 代表每天的第2点 检测一次 + ${Green_font_prefix} 0 0 2 * * ${Font_color_suffix} 代表每2天的0点0分 检测一次" && echo + read -e -p "(默认: */10 * * * *):" Crontab_time + [[ -z "${Crontab_time}" ]] && Crontab_time="*/10 * * * *" +} +GO(){ + echo -e "========== 开始记录测试信息 [$(date '+%Y-%m-%d %H:%M:%S')]==========\n" >> ${log_file} +} +exit_GG(){ + echo -e "========== 记录测试信息结束 [$(date '+%Y-%m-%d %H:%M:%S')]==========\n\n" >> ${log_file} + if [[ ${analysis_type} != "add" ]]; then + Config_JSON="{\n\"servers\": [\n${Config_JSON}],\n\"updated\": \"$(date +%s)\"\n}" + echo -e "${Config_JSON}" > ${JSON_file} + fi + exit 0 +} +Continue_if(){ + Config_Status="false" + [[ -z ${ip} ]] && ip="---.---.---.---" + if [[ ${Like_num} == ${integer} ]]; then + Config_JSON="${Config_JSON}{ \"ip\": \"${ip}\", \"name\": \"${Config_Name}\", \"type\": \"${Config_Type}\", \"type_1\": \"${Config_Type_1}\", \"location\": \"${Config_Location}\", \"status\": ${Config_Status}, \"time\": \"$(date '+%Y-%m-%d %H:%M:%S')\" }\n" + else + Config_JSON="${Config_JSON}{ \"ip\": \"${ip}\", \"name\": \"${Config_Name}\", \"type\": \"${Config_Type}\", \"type_1\": \"${Config_Type_1}\", \"location\": \"${Config_Location}\", \"status\": ${Config_Status}, \"time\": \"$(date '+%Y-%m-%d %H:%M:%S')\" },\n" + fi + continue +} +Get_Like(){ + [[ ! -e ${config_file} ]] && echo -e "${Error} 配置文件不存在!(${config_file})" | tee -a ${log_file} && exit 0 + Like=$(cat "${config_file}") + [[ -z ${Like} ]] && echo -e "${Error} 获取SS/SSR账号信息失败或配置文件为空 !" | tee -a ${log_file} && exit 0 + Like_num=$(echo -e "${Like}"|wc -l) +} +Analysis_Config(){ + Config=$(echo -e "${Like}"|sed -n "$1"p) + Config_info_base64=$(echo -e "${Config}"|awk -F '###' '{print $1}') + Config_Name=$(echo -e "${Config}"|awk -F '###' '{print $2}') + Config_Location=$(echo -e "${Config}"|awk -F '###' '{print $3}') + Config_Disabled=$(echo -e "${Config}"|awk -F '###' '{print $4}') + if [[ ${Config_Disabled} == "true" ]]; then + echo -e "${Info} 账号已禁用,跳过检测 [${Config_info_base64}] !" | tee -a ${log_file} + echo "---------------------------------------------------------" + continue + else + Config_info_base64_determine=$(echo -e ${Config_info_base64}|cut -c 1-6) + if [[ "${Config_info_base64_determine}" == "ssr://" ]]; then + Config_Type="ShadowsocksR" + Config_Type_1="SSR" + Config_info=$(echo -e "${Config_info_base64}"|cut -c 7-2000|base64 -d) + if [[ -z ${Config_info} ]]; then + echo -e "${Error} Base64解密失败 [${Config_info_base64}] !" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + Continue_if + fi + fi + ssr_config + else + Config_Type="Shadowsocks" + Config_Type_1="SS" + Config_info=$(echo -e "${Config_info_base64}"|cut -c 6-2000|base64 -d) + if [[ -z ${Config_info} ]]; then + echo -e "${Error} Base64解密失败 [${Config_info_base64}] !" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + Continue_if + fi + fi + ss_config + fi + fi +} +ss_config(){ + zuo=$(echo -e "${Config_info}"|awk -F "@" '{print $1}') + you=$(echo -e "${Config_info}"|awk -F "@" '{print $2}') + port=$(echo -e "${you}"|awk -F ":" '{print $NF}') + ip=$(echo -e "${you}"|awk -F ":${port}" '{print $1}') + if [[ $(echo -e "${ip}"|wc -L) -lt 7 ]]; then + echo -e "${Error} 错误,IP格式错误或为 ipv6地址[ ${ip} ]" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + Continue_if + fi + fi + method=$(echo -e "${zuo}"|awk -F ":" '{print $1}') + passwd=$(echo -e "${zuo}"|awk -F ":" '{print $2}') + protocol="origin" + obfs="plain" + echo -e "${ip} ${port} ${method} ${passwd} ${protocol} ${obfs}" + if [[ -z ${ip} ]] || [[ -z ${port} ]] || [[ -z ${method} ]] || [[ -z ${passwd} ]] || [[ -z ${protocol} ]] || [[ -z ${obfs} ]]; then + echo -e "${Error} 错误,有部分 账号参数为空![ ${ip} ,${port} ,${method} ,${passwd} ,${protocol} ,${obfs} ]" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + Continue_if + fi + fi +} +ssr_config(){ + zuo=$(echo -e "${Config_info}"|awk -F "/?" '{print $1}') + passwd_base64=$(echo -e "${zuo}"|awk -F ":" '{print $NF}') + zuo=$(echo -e "${Config_info}"|awk -F ":${passwd_base64}" '{print $1}') + obfs=$(echo -e "${zuo}"|awk -F ":" '{print $NF}') + zuo=$(echo -e "${Config_info}"|awk -F ":${obfs}" '{print $1}') + method=$(echo -e "${zuo}"|awk -F ":" '{print $NF}') + zuo=$(echo -e "${Config_info}"|awk -F ":${method}" '{print $1}') + protocol=$(echo -e "${zuo}"|awk -F ":" '{print $NF}') + zuo=$(echo -e "${Config_info}"|awk -F ":${protocol}" '{print $1}') + port=$(echo -e "${zuo}"|awk -F ":" '{print $NF}') + ip=$(echo -e "${Config_info}"|awk -F ":${port}" '{print $1}') + if [[ $(echo -e "${ip}"|wc -L) -lt 7 ]]; then + echo -e "${Error} 错误,IP格式错误[ ${ip} ]" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + Continue_if + fi + fi + passwd=$(echo -e "${passwd_base64}"|base64 -d) + echo -e "${ip} ${port} ${method} ${passwd} ${protocol} ${obfs}" + if [[ -z ${ip} ]] || [[ -z ${port} ]] || [[ -z ${method} ]] || [[ -z ${passwd} ]] || [[ -z ${protocol} ]] || [[ -z ${obfs} ]]; then + echo -e "${Error} 错误,有部分 账号参数为空![ ${ip} ,${port} ,${method} ,${passwd} ,${protocol} ,${obfs} ]" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + Continue_if + fi + fi +} +Start_Client(){ + nohup python "${SSR_folder}/local.py" -b "127.0.0.1" -l "${local_port}" -s "${ip}" -p "${port}" -k "${passwd}" -m "${method}" -O "${protocol}" -o "${obfs}" > /dev/null 2>&1 & + sleep 2s + PID=$(ps -ef |grep -v grep | grep "local.py" | grep "${local_port}" |awk '{print $2}') + if [[ -z ${PID} ]]; then + echo -e "${Error} ShadowsocksR客户端 启动失败,请检查 !" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + Continue_if + fi + fi +} +Socks5_test(){ + Test_results=$(curl --socks5 127.0.0.1:${local_port} -k -m ${Timeout} -s "${Test_URL}") + if [[ -z ${Test_results} ]]; then + echo -e "${Error} [${ip}] 检测失败,账号不可用,重新尝试一次..." | tee -a ${log_file} + sleep 2s + Test_results=$(curl --socks5 127.0.0.1:${local_port} -k -m ${Timeout} -s "${Test_URL}") + if [[ -z ${Test_results} ]]; then + echo -e "${Error} [${ip}] 检测失败,账号不可用(已重新尝试) !" | tee -a ${log_file} + Config_Status="false" + else + echo -e "${Info} [${ip}] 检测成功,账号可用 !" | tee -a ${log_file} + Config_Status="true" + fi + else + echo -e "${Info} [${ip}] 检测成功,账号可用 !" | tee -a ${log_file} + Config_Status="true" + fi + kill -9 ${PID} + PID=$(ps -ef |grep -v grep | grep "local.py" | grep "${local_port}" |awk '{print $2}') + if [[ ! -z ${PID} ]]; then + echo -e "${Error} ShadowsocksR客户端 停止失败,请检查 !" | tee -a ${log_file} + if [[ ${analysis_type} == "add" ]]; then + exit_GG + else + Continue_if + fi + fi + echo "---------------------------------------------------------" + if [[ ${analysis_type} != "add" ]]; then + if [[ ${Like_num} == ${integer} ]]; then + Config_JSON="${Config_JSON}{ \"ip\": \"${ip}\", \"name\": \"${Config_Name}\", \"type\": \"${Config_Type}\", \"type_1\": \"${Config_Type_1}\", \"location\": \"${Config_Location}\", \"status\": ${Config_Status}, \"time\": \"$(date '+%Y-%m-%d %H:%M:%S')\" }\n" + else + Config_JSON="${Config_JSON}{ \"ip\": \"${ip}\", \"name\": \"${Config_Name}\", \"type\": \"${Config_Type}\", \"type_1\": \"${Config_Type_1}\", \"location\": \"${Config_Location}\", \"status\": ${Config_Status}, \"time\": \"$(date '+%Y-%m-%d %H:%M:%S')\" },\n" + fi + fi +} +rand(){ + min=1000 + max=$((2000-$min+1)) + num=$(date +%s%N) + echo $(($num%$max+$min)) +} +Test(){ + GO + Get_Like + cd ${SSR_folder} + local_port=$(rand) + for((integer = 1; integer <= "${Like_num}"; integer++)) + do + Analysis_Config "${integer}" + Start_Client + Socks5_test + done + exit_GG +} +Test_add(){ + analysis_type="add" + GO + cd ${SSR_folder} + local_port=$(rand) + set_config_user + [[ $? == 2 ]] && Analysis_Config "1" + Start_Client + Socks5_test + exit_GG +} +Test_one(){ + List_SSRStatus + cd ${SSR_folder} + local_port=$(rand) + while true + do + echo -e "请选择你要单独测试的账号序号" + read -e -p "(默认取消):" Test_one_num + [[ -z "${Test_one_num}" ]] && echo "已取消..." && exit 1 + echo $((${Test_one_num}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${Test_one_num} -ge 1 ]] && [[ ${Test_one_num} -le ${Like_num} ]]; then + analysis_type="add" && Analysis_Config "${Test_one_num}" + Start_Client + Socks5_test + break + else + echo -e "${Error} 请输入正确的数字!" + fi + else + echo -e "${Error} 请输入正确的数字!" + fi + done +} +View_log(){ + [[ ! -e ${log_file} ]] && echo -e "${Error} 找不到 日志文件!(${log_file})" + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${log_file}${Font_color_suffix} 命令。" && echo + cat "${log_file}" +} +Set_SSRStatus(){ + check_installed_server_status + echo && echo -e " 你要做什么? + + ${Green_font_prefix} 1.${Font_color_suffix} 添加 账号配置 + ${Green_font_prefix} 2.${Font_color_suffix} 删除 账号配置 + ${Green_font_prefix} 3.${Font_color_suffix} 修改 账号配置 +———————— + ${Green_font_prefix} 4.${Font_color_suffix} 启用/禁用 账号配置 + 注意:添加/修改/删除 账号配置后,不会立即更新,需要自动(定时)/手动检测一次所有账号,网页才会更新 !" && echo + read -e -p "(默认: 取消):" server_num + [[ -z "${server_num}" ]] && echo "已取消..." && exit 1 + if [[ ${server_num} == "1" ]]; then + Add_SSRStatus + elif [[ ${server_num} == "2" ]]; then + Del_SSRStatus + elif [[ ${server_num} == "3" ]]; then + Modify_SSRStatus + elif [[ ${server_num} == "4" ]]; then + Modify_SSRStatus_disabled + else + echo -e "${Error} 请输入正确的数字[1-4]" && exit 1 + fi +} +List_SSRStatus(){ + Get_Like + echo -e "目前有 ${Like_num} 个账号配置\n$(echo -e "${Like}"|grep -n "#")" +} +Add_SSRStatus(){ + set_config_user + if [[ $? == 1 ]]; then + if [[ ${protocol} == "origin" ]] && [[ ${obfs} == "plain" ]]; then + Like_base64=$(echo -n "${method}:${passwd}@${ip}:${port}"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g') + Like="ss://"${Like_base64} + else + passwd_base64=$(echo -n "${passwd}"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g') + Like_base64=$(echo -n "${ip}:${port}:${protocol}:${method}:${obfs}:${passwd_base64}"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g') + Like="ssr://"${Like_base64} + fi + fi + set_config_name + set_config_location + Like="${Like}###${Config_Name}###${Config_Location}###false" + echo -e "${Like}" >> ${config_file} + if [[ $? == 0 ]]; then + echo -e "${Info} 添加成功 ! [${Like}]" + else + echo -e "${Error} 添加失败 ! [${Like}]" + fi +} +Del_SSRStatus(){ + List_SSRStatus + [[ ${Like_num} == 1 ]] && echo -e "${Error} 当前仅剩一个账号配置,无法删除 !" && exit 0 + while true + do + echo -e "请选择你要删除的账号序号" + read -e -p "(默认取消):" Del_num + [[ -z "${Del_num}" ]] && echo "已取消..." && exit 1 + echo $((${Del_num}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${Del_num} -ge 1 ]] && [[ ${Del_num} -le ${Like_num} ]]; then + sed -i "${Del_num}d" ${config_file} + if [[ $? == 0 ]]; then + echo -e "${Info} 删除成功 ! [${Del_num}]" + else + echo -e "${Error} 删除失败 ! [${Del_num}]" + fi + break + else + echo -e "${Error} 请输入正确的数字!" + fi + else + echo -e "${Error} 请输入正确的数字!" + fi + done +} +Modify_SSRStatus(){ + List_SSRStatus + while true + do + echo -e "请选择你要修改的账号序号" + read -e -p "(默认取消):" Modify_num + [[ -z "${Modify_num}" ]] && echo "已取消..." && exit 1 + echo $((${Modify_num}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${Modify_num} -ge 1 ]] && [[ ${Modify_num} -le ${Like_num} ]]; then + set_config_user + if [[ $? == 1 ]]; then + if [[ ${protocol} == "origin" ]] && [[ ${obfs} == "plain" ]]; then + Like_base64=$(echo -n "${method}:${passwd}@${ip}:${port}"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g') + Like="ss://"${Like_base64} + else + passwd_base64=$(echo -n "${passwd}"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g') + Like_base64=$(echo -n "${ip}:${port}:${protocol}:${method}:${obfs}:${passwd_base64}"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g') + Like="ssr://"${Like_base64} + fi + fi + set_config_name + set_config_location + Like="${Like}###${Config_Name}###${Config_Location}###false" + sed -i "${Modify_num}d" ${config_file} + sed -i "${Modify_num}i\\${Like}" ${config_file} + if [[ $? == 0 ]]; then + echo -e "${Info} 修改成功 ! [${Like}]" + else + echo -e "${Error} 修改失败 ! [${Like}]" + fi + break + else + echo -e "${Error} 请输入正确的数字!" + fi + else + echo -e "${Error} 请输入正确的数字!" + fi + done +} +Modify_SSRStatus_disabled(){ + List_SSRStatus + while true + do + echo -e "请选择你要启用/禁用的账号序号" + read -e -p "(默认取消):" Modify_num + [[ -z "${Modify_num}" ]] && echo "已取消..." && exit 1 + echo $((${Modify_num}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${Modify_num} -ge 1 ]] && [[ ${Modify_num} -le ${Like_num} ]]; then + Config_old=$(echo -e "${Like}"|sed -n "${Modify_num}"p) + echo -e "${Config_old}" + Config_old_Disabled=$(echo -e "${Config_old}"|awk -F '###' '{print $4}') + Config_old=$(echo -e "${Config_old}"|awk -F "###${Config_old_Disabled}" '{print $1}') + echo -e "${Config_old_Disabled}\n${Config_old}" + if [[ ${Config_old_Disabled} == "true" ]]; then + Config_Disabled="false" + Like="${Config_old}###${Config_Disabled}" + else + Config_Disabled="true" + Like="${Config_old}###${Config_Disabled}" + fi + echo -e "${Config_Disabled}\n${Like}" + sed -i "${Modify_num}d" ${config_file} + sed -i "${Modify_num}i\\${Like}" ${config_file} + if [[ $? == 0 ]]; then + echo -e "${Info} 修改成功 ! [账号状态为: ${Config_Disabled}]" + else + echo -e "${Error} 修改失败 ! [账号状态为: ${Config_Disabled}]" + fi + break + else + echo -e "${Error} 请输入正确的数字!" + fi + else + echo -e "${Error} 请输入正确的数字!" + fi + done +} +Installation_dependency(){ + if [[ ${release} == "centos" ]]; then + yum update + yum install -y unzip vim curl crond + [[ -z $(ls /usr/sbin/crond) ]] && echo -e "${Error} 依赖 crond 安装失败..." && exit 0 + else + apt-get update + apt-get install -y unzip vim curl cron + [[ -z $(ls /usr/sbin/cron) ]] && echo -e "${Error} 依赖 cron 安装失败..." && exit 0 + fi + [[ -z $(unzip --help) ]] && echo -e "${Error} 依赖 unzip 安装失败..." && exit 0 + [[ -z $(curl --help) ]] && echo -e "${Error} 依赖 curl 安装失败..." && exit 0 + cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +} +Install_caddy(){ + echo -e "是否由脚本自动配置HTTP服务(在线监控网站)[Y/n]" + read -e -p "(默认: Y 自动部署):" caddy_yn + [[ -z "$caddy_yn" ]] && caddy_yn="y" + if [[ "${caddy_yn}" == [Yy] ]]; then + Set_server + Set_server_port + if [[ ! -e "/usr/local/caddy/caddy" ]]; then + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/caddy_install.sh + chmod +x caddy_install.sh + bash caddy_install.sh install + [[ ! -e "/usr/local/caddy/caddy" ]] && echo -e "${Error} Caddy安装失败,请手动部署,Web网页文件位置:${Web_file}" && exit 0 + else + echo -e "${Info} 发现Caddy已安装,开始配置..." + fi + if [[ ! -s "/usr/local/caddy/Caddyfile" ]]; then + cat > "/usr/local/caddy/Caddyfile"<<-EOF +http://${server_s}:${server_port_s} { + root ${Web_file} + timeouts none + gzip +} +EOF + /etc/init.d/caddy restart + else + echo -e "${Info} 发现 Caddy 配置文件非空,开始追加 ServerStatus 网站配置内容到文件最后..." + cat >> "/usr/local/caddy/Caddyfile"<<-EOF +http://${server_s}:${server_port_s} { + root ${Web_file} + timeouts none + gzip +} +EOF + /etc/init.d/caddy restart + fi + else + echo -e "${Info} 跳过 HTTP服务部署,请手动部署,Web网页文件位置:${Web_file} !" + fi +} +Download_SSRStatus(){ + cd "/usr/local" + wget -N --no-check-certificate "https://github.com/ToyoDAdoubi/SSRStatus/archive/master.zip" + [[ ! -e "master.zip" ]] && echo -e "${Error} SSRStatus 网页文件下载失败 !" && exit 1 + unzip master.zip && rm -rf master.zip + [[ ! -e "SSRStatus-master" ]] && echo -e "${Error} SSRStatus 网页文件解压失败 !" && exit 1 + mv SSRStatus-master SSRStatus + [[ ! -e "${Web_file}" ]] && echo -e "${Error} SSRStatus 网页文件文件夹重命名失败 !" && rm -rf SSRStatus-master && exit 1 +} +Install_Web(){ + [[ -e "${Web_file}" ]] && echo -e "${Error} 检测到 SSRStatus 网页文件已安装 !" && exit 1 + check_sys + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency + echo -e "${Info} 开始部署HTTP服务(Caddy)..." + Install_caddy + echo -e "${Info} 开始下载/安装..." + Download_SSRStatus + echo -e "${Info} 开始配置定时任务..." + Set_crontab + echo -e "${Info} 所有步骤 安装完毕... 请打开本脚本并修改开头的 SSR_folder 变量引号内的ShadowsocksR子目录绝对路径,方可使用。" +} +Uninstall_Web(){ + check_installed_server_status + echo "确定要卸载 SSRStatus 网页文件(自动部署的Caddy并不会删除) ? [y/N]" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + /etc/init.d/caddy stop + Del_Crontab + rm -rf "${Web_file}" + echo && echo "SSRStatus 网页文件卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +Add_Crontab(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrstatus.sh/d" "$file/crontab.bak" + echo -e "\n${Crontab_time} /bin/bash $file/ssrstatus.sh t" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrstatus.sh") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} 添加 Crontab 定时任务失败 !" && exit 1 + else + echo -e "${Info} 添加 Crontab 定时任务成功 !" + fi +} +Del_Crontab(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrstatus.sh/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrstatus.sh") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} 删除 Crontab 定时任务失败 !" && exit 1 + else + echo -e "${Info} 删除 Crontab 定时任务成功 !" + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssrstatus.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/ssrstatus.sh" && chmod +x ssrstatus.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +menu(){ +echo && echo -e " SSRStatus 一键安装管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/shell-jc5 -- + + ${Green_font_prefix}0.${Font_color_suffix} 升级脚本 + ———————————— + ${Green_font_prefix}1.${Font_color_suffix} 安装 依赖及Web网页 + ${Green_font_prefix}2.${Font_color_suffix} 卸载 依赖及Web网页 +———————————— + ${Green_font_prefix}3.${Font_color_suffix} 测试 所有账号 + ${Green_font_prefix}4.${Font_color_suffix} 测试 单独账号 + ${Green_font_prefix}5.${Font_color_suffix} 测试 自定义账号 +———————————— + ${Green_font_prefix}6.${Font_color_suffix} 设置 配置信息 + ${Green_font_prefix}7.${Font_color_suffix} 查看 配置信息 + ${Green_font_prefix}8.${Font_color_suffix} 查看 运行日志 + ${Green_font_prefix}9.${Font_color_suffix} 设置 定时间隔 +————————————" && echo +if [[ -e ${Web_file} ]]; then + echo -e " 当前状态: Web网页 ${Green_font_prefix}已安装${Font_color_suffix}" +else + echo -e " 当前状态: Web网页 ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-9]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_Web + ;; + 2) + Uninstall_Web + ;; + 3) + Test + ;; + 4) + Test_one + ;; + 5) + Test_add + ;; + 6) + Set_SSRStatus + ;; + 7) + List_SSRStatus + ;; + 8) + View_log + ;; + 9) + Set_crontab + ;; + *) + echo "请输入正确数字 [0-9]" + ;; +esac +} +action=$1 +if [[ ${1} == "t" ]]; then + Test +elif [[ ${1} == "a" ]]; then + Test_add +elif [[ ${1} == "o" ]]; then + Test_one +elif [[ ${1} == "log" ]]; then + View_log +else + menu +fi \ No newline at end of file diff --git a/status.sh b/status.sh new file mode 100644 index 0000000..2b83816 --- /dev/null +++ b/status.sh @@ -0,0 +1,1107 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: ServerStatus client + server +# Version: 1.0.15 +# Author: Toyo +# Blog: https://doub.io/shell-jc3/ +#================================================= + +sh_ver="1.0.15" +filepath=$(cd "$(dirname "$0")"; pwd) +file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +file="/usr/local/ServerStatus" +web_file="/usr/local/ServerStatus/web" +server_file="/usr/local/ServerStatus/server" +server_conf="/usr/local/ServerStatus/server/config.json" +server_conf_1="/usr/local/ServerStatus/server/config.conf" +client_file="/usr/local/ServerStatus/client" +client_log_file="/tmp/serverstatus_client.log" +server_log_file="/tmp/serverstatus_server.log" +jq_file="${file}/jq" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" +Error="${Red_font_prefix}[错误]${Font_color_suffix}" +Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +#检查系统 +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_installed_server_status(){ + [[ ! -e "${server_file}/sergate" ]] && echo -e "${Error} ServerStatus 服务端没有安装,请检查 !" && exit 1 +} +check_installed_client_status(){ + if [[ ! -e "${client_file}/status-client.py" ]]; then + if [[ ! -e "${file}/status-client.py" ]]; then + echo -e "${Error} ServerStatus 客户端没有安装,请检查 !" && exit 1 + fi + fi +} +check_pid_server(){ + PID=`ps -ef| grep "sergate"| grep -v grep| grep -v ".sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}'` +} +check_pid_client(){ + PID=`ps -ef| grep "status-client.py"| grep -v grep| grep -v ".sh"| grep -v "init.d"| grep -v "service"| awk '{print $2}'` +} +Download_Server_Status_server(){ + cd "/tmp" + wget -N --no-check-certificate "https://github.com/ToyoDAdoubi/ServerStatus-Toyo/archive/master.zip" + [[ ! -e "master.zip" ]] && echo -e "${Error} ServerStatus 服务端下载失败 !" && exit 1 + unzip master.zip + rm -rf master.zip + [[ ! -e "/tmp/ServerStatus-Toyo-master" ]] && echo -e "${Error} ServerStatus 服务端解压失败 !" && exit 1 + cd "/tmp/ServerStatus-Toyo-master/server" + make + [[ ! -e "sergate" ]] && echo -e "${Error} ServerStatus 服务端编译失败 !" && cd "${file_1}" && rm -rf "/tmp/ServerStatus-Toyo-master" && exit 1 + cd "${file_1}" + [[ ! -e "${file}" ]] && mkdir "${file}" + if [[ ! -e "${server_file}" ]]; then + mkdir "${server_file}" + mv "/tmp/ServerStatus-Toyo-master/server/sergate" "${server_file}/sergate" + mv "/tmp/ServerStatus-Toyo-master/web" "${web_file}" + else + if [[ -e "${server_file}/sergate" ]]; then + mv "${server_file}/sergate" "${server_file}/sergate1" + mv "/tmp/ServerStatus-Toyo-master/server/sergate" "${server_file}/sergate" + else + mv "/tmp/ServerStatus-Toyo-master/server/sergate" "${server_file}/sergate" + mv "/tmp/ServerStatus-Toyo-master/web" "${web_file}" + fi + fi + if [[ ! -e "${server_file}/sergate" ]]; then + echo -e "${Error} ServerStatus 服务端移动重命名失败 !" + [[ -e "${server_file}/sergate1" ]] && mv "${server_file}/sergate1" "${server_file}/sergate" + rm -rf "/tmp/ServerStatus-Toyo-master" + exit 1 + else + [[ -e "${server_file}/sergate1" ]] && rm -rf "${server_file}/sergate1" + rm -rf "/tmp/ServerStatus-Toyo-master" + fi +} +Download_Server_Status_client(){ + cd "/tmp" + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubi/ServerStatus-Toyo/master/clients/status-client.py" + [[ ! -e "status-client.py" ]] && echo -e "${Error} ServerStatus 客户端下载失败 !" && exit 1 + cd "${file_1}" + [[ ! -e "${file}" ]] && mkdir "${file}" + if [[ ! -e "${client_file}" ]]; then + mkdir "${client_file}" + mv "/tmp/status-client.py" "${client_file}/status-client.py" + else + if [[ -e "${client_file}/status-client.py" ]]; then + mv "${client_file}/status-client.py" "${client_file}/status-client1.py" + mv "/tmp/status-client.py" "${client_file}/status-client.py" + else + mv "/tmp/status-client.py" "${client_file}/status-client.py" + fi + fi + if [[ ! -e "${client_file}/status-client.py" ]]; then + echo -e "${Error} ServerStatus 客户端移动失败 !" + [[ -e "${client_file}/status-client1.py" ]] && mv "${client_file}/status-client1.py" "${client_file}/status-client.py" + rm -rf "/tmp/status-client.py" + exit 1 + else + [[ -e "${client_file}/status-client1.py" ]] && rm -rf "${client_file}/status-client1.py" + rm -rf "/tmp/status-client.py" + fi +} +Service_Server_Status_server(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/server_status_server_centos" -O /etc/init.d/status-server; then + echo -e "${Error} ServerStatus 服务端服务管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/status-server + chkconfig --add status-server + chkconfig status-server on + else + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/server_status_server_debian" -O /etc/init.d/status-server; then + echo -e "${Error} ServerStatus 服务端服务管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/status-server + update-rc.d -f status-server defaults + fi + echo -e "${Info} ServerStatus 服务端服务管理脚本下载完成 !" +} +Service_Server_Status_client(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/server_status_client_centos" -O /etc/init.d/status-client; then + echo -e "${Error} ServerStatus 客户端服务管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/status-client + chkconfig --add status-client + chkconfig status-client on + else + if ! wget --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/service/server_status_client_debian" -O /etc/init.d/status-client; then + echo -e "${Error} ServerStatus 客户端服务管理脚本下载失败 !" && exit 1 + fi + chmod +x /etc/init.d/status-client + update-rc.d -f status-client defaults + fi + echo -e "${Info} ServerStatus 客户端服务管理脚本下载完成 !" +} +Installation_dependency(){ + mode=$1 + [[ -z ${mode} ]] && mode="server" + if [[ ${mode} == "server" ]]; then + python_status=$(python --help) + if [[ ${release} == "centos" ]]; then + yum update + if [[ -z ${python_status} ]]; then + yum install -y python unzip vim make + yum groupinstall "Development Tools" -y + else + yum install -y unzip vim make + yum groupinstall "Development Tools" -y + fi + else + apt-get update + if [[ -z ${python_status} ]]; then + apt-get install -y python unzip vim build-essential make + else + apt-get install -y unzip vim build-essential make + fi + fi + else + python_status=$(python --help) + if [[ ${release} == "centos" ]]; then + if [[ -z ${python_status} ]]; then + yum update + yum install -y python + fi + else + if [[ -z ${python_status} ]]; then + apt-get update + apt-get install -y python + fi + fi + fi +} +Write_server_config(){ + cat > ${server_conf}<<-EOF +{"servers": + [ + { + "username": "username01", + "password": "password", + "name": "Server 01", + "type": "KVM", + "host": "", + "location": "Hong Kong", + "disabled": false + } + ] +} +EOF +} +Write_server_config_conf(){ + cat > ${server_conf_1}<<-EOF +PORT = ${server_port_s} +EOF +} +Read_config_client(){ + if [[ ! -e "${client_file}/status-client.py" ]]; then + if [[ ! -e "${file}/status-client.py" ]]; then + echo -e "${Error} ServerStatus 客户端文件不存在 !" && exit 1 + else + client_text="$(cat "${file}/status-client.py"|sed 's/\"//g;s/,//g;s/ //g')" + rm -rf "${file}/status-client.py" + fi + else + client_text="$(cat "${client_file}/status-client.py"|sed 's/\"//g;s/,//g;s/ //g')" + fi + client_server="$(echo -e "${client_text}"|grep "SERVER="|awk -F "=" '{print $2}')" + client_port="$(echo -e "${client_text}"|grep "PORT="|awk -F "=" '{print $2}')" + client_user="$(echo -e "${client_text}"|grep "USER="|awk -F "=" '{print $2}')" + client_password="$(echo -e "${client_text}"|grep "PASSWORD="|awk -F "=" '{print $2}')" +} +Read_config_server(){ + if [[ ! -e "${server_conf_1}" ]]; then + server_port_s="35601" + Write_server_config_conf + server_port="35601" + else + server_port="$(cat "${server_conf_1}"|grep "PORT = "|awk '{print $3}')" + fi +} +Set_server(){ + mode=$1 + [[ -z ${mode} ]] && mode="server" + if [[ ${mode} == "server" ]]; then + echo -e "请输入 ServerStatus 服务端中网站要设置的 域名[server] +默认为本机IP为域名,例如输入: toyoo.pw ,如果要使用本机IP,请留空直接回车" + read -e -p "(默认: 本机IP):" server_s + [[ -z "$server_s" ]] && server_s="" + else + echo -e "请输入 ServerStatus 服务端的 IP/域名[server]" + read -e -p "(默认: 127.0.0.1):" server_s + [[ -z "$server_s" ]] && server_s="127.0.0.1" + fi + + echo && echo " ================================================" + echo -e " IP/域名[server]: ${Red_background_prefix} ${server_s} ${Font_color_suffix}" + echo " ================================================" && echo +} +Set_server_http_port(){ + while true + do + echo -e "请输入 ServerStatus 服务端中网站要设置的 域名/IP的端口[1-65535](如果是域名的话,一般用 80 端口)" + read -e -p "(默认: 8888):" server_http_port_s + [[ -z "$server_http_port_s" ]] && server_http_port_s="8888" + echo $((${server_http_port_s}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${server_http_port_s} -ge 1 ]] && [[ ${server_http_port_s} -le 65535 ]]; then + echo && echo " ================================================" + echo -e " 端口: ${Red_background_prefix} ${server_http_port_s} ${Font_color_suffix}" + echo " ================================================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_server_port(){ + while true + do + echo -e "请输入 ServerStatus 服务端监听的端口[1-65535](用于服务端接收客户端消息的端口,客户端要填写这个端口)" + read -e -p "(默认: 35601):" server_port_s + [[ -z "$server_port_s" ]] && server_port_s="35601" + echo $((${server_port_s}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${server_port_s} -ge 1 ]] && [[ ${server_port_s} -le 65535 ]]; then + echo && echo " ================================================" + echo -e " 端口: ${Red_background_prefix} ${server_port_s} ${Font_color_suffix}" + echo " ================================================" && echo + break + else + echo "输入错误, 请输入正确的端口。" + fi + else + echo "输入错误, 请输入正确的端口。" + fi + done +} +Set_username(){ + mode=$1 + [[ -z ${mode} ]] && mode="server" + if [[ ${mode} == "server" ]]; then + echo -e "请输入 ServerStatus 服务端要设置的用户名[username](字母/数字,不可与其他账号重复)" + else + echo -e "请输入 ServerStatus 服务端中对应配置的用户名[username](字母/数字,不可与其他账号重复)" + fi + read -e -p "(默认: 取消):" username_s + [[ -z "$username_s" ]] && echo "已取消..." && exit 0 + echo && echo " ================================================" + echo -e " 账号[username]: ${Red_background_prefix} ${username_s} ${Font_color_suffix}" + echo " ================================================" && echo +} +Set_password(){ + mode=$1 + [[ -z ${mode} ]] && mode="server" + if [[ ${mode} == "server" ]]; then + echo -e "请输入 ServerStatus 服务端要设置的密码[password](字母/数字,可重复)" + else + echo -e "请输入 ServerStatus 服务端中对应配置的密码[password](字母/数字)" + fi + read -e -p "(默认: doub.io):" password_s + [[ -z "$password_s" ]] && password_s="doub.io" + echo && echo " ================================================" + echo -e " 密码[password]: ${Red_background_prefix} ${password_s} ${Font_color_suffix}" + echo " ================================================" && echo +} +Set_name(){ + echo -e "请输入 ServerStatus 服务端要设置的节点名称[name](支持中文,前提是你的系统和SSH工具支持中文输入,仅仅是个名字)" + read -e -p "(默认: Server 01):" name_s + [[ -z "$name_s" ]] && name_s="Server 01" + echo && echo " ================================================" + echo -e " 节点名称[name]: ${Red_background_prefix} ${name_s} ${Font_color_suffix}" + echo " ================================================" && echo +} +Set_type(){ + echo -e "请输入 ServerStatus 服务端要设置的节点虚拟化类型[type](例如 OpenVZ / KVM)" + read -e -p "(默认: KVM):" type_s + [[ -z "$type_s" ]] && type_s="KVM" + echo && echo " ================================================" + echo -e " 虚拟化类型[type]: ${Red_background_prefix} ${type_s} ${Font_color_suffix}" + echo " ================================================" && echo +} +Set_location(){ + echo -e "请输入 ServerStatus 服务端要设置的节点位置[location](支持中文,前提是你的系统和SSH工具支持中文输入)" + read -e -p "(默认: Hong Kong):" location_s + [[ -z "$location_s" ]] && location_s="Hong Kong" + echo && echo " ================================================" + echo -e " 节点位置[location]: ${Red_background_prefix} ${location_s} ${Font_color_suffix}" + echo " ================================================" && echo +} +Set_config_server(){ + Set_username "server" + Set_password "server" + Set_name + Set_type + Set_location +} +Set_config_client(){ + Set_server "client" + Set_server_port + Set_username "client" + Set_password "client" +} +Set_ServerStatus_server(){ + check_installed_server_status + echo && echo -e " 你要做什么? + + ${Green_font_prefix} 1.${Font_color_suffix} 添加 节点配置 + ${Green_font_prefix} 2.${Font_color_suffix} 删除 节点配置 +———————— + ${Green_font_prefix} 3.${Font_color_suffix} 修改 节点配置 - 节点用户名 + ${Green_font_prefix} 4.${Font_color_suffix} 修改 节点配置 - 节点密码 + ${Green_font_prefix} 5.${Font_color_suffix} 修改 节点配置 - 节点名称 + ${Green_font_prefix} 6.${Font_color_suffix} 修改 节点配置 - 节点虚拟化 + ${Green_font_prefix} 7.${Font_color_suffix} 修改 节点配置 - 节点位置 + ${Green_font_prefix} 8.${Font_color_suffix} 修改 节点配置 - 全部参数 +———————— + ${Green_font_prefix} 9.${Font_color_suffix} 启用/禁用 节点配置 +———————— + ${Green_font_prefix}10.${Font_color_suffix} 修改 服务端监听端口" && echo + read -e -p "(默认: 取消):" server_num + [[ -z "${server_num}" ]] && echo "已取消..." && exit 1 + if [[ ${server_num} == "1" ]]; then + Add_ServerStatus_server + elif [[ ${server_num} == "2" ]]; then + Del_ServerStatus_server + elif [[ ${server_num} == "3" ]]; then + Modify_ServerStatus_server_username + elif [[ ${server_num} == "4" ]]; then + Modify_ServerStatus_server_password + elif [[ ${server_num} == "5" ]]; then + Modify_ServerStatus_server_name + elif [[ ${server_num} == "6" ]]; then + Modify_ServerStatus_server_type + elif [[ ${server_num} == "7" ]]; then + Modify_ServerStatus_server_location + elif [[ ${server_num} == "8" ]]; then + Modify_ServerStatus_server_all + elif [[ ${server_num} == "9" ]]; then + Modify_ServerStatus_server_disabled + elif [[ ${server_num} == "10" ]]; then + Read_config_server + Del_iptables "${server_port}" + Set_server_port + Write_server_config_conf + Add_iptables "${server_port_s}" + else + echo -e "${Error} 请输入正确的数字[1-10]" && exit 1 + fi + Restart_ServerStatus_server +} +List_ServerStatus_server(){ + conf_text=$(${jq_file} '.servers' ${server_conf}|${jq_file} ".[]|.username"|sed 's/\"//g') + conf_text_total=$(echo -e "${conf_text}"|wc -l) + [[ ${conf_text_total} = "0" ]] && echo -e "${Error} 没有发现 一个节点配置,请检查 !" && exit 1 + conf_text_total_a=$(echo $((${conf_text_total}-1))) + conf_list_all="" + for((integer = 0; integer <= ${conf_text_total_a}; integer++)) + do + now_text=$(${jq_file} '.servers' ${server_conf}|${jq_file} ".[${integer}]"|sed 's/\"//g;s/,$//g'|sed '$d;1d') + now_text_username=$(echo -e "${now_text}"|grep "username"|awk -F ": " '{print $2}') + now_text_password=$(echo -e "${now_text}"|grep "password"|awk -F ": " '{print $2}') + now_text_name=$(echo -e "${now_text}"|grep "name"|grep -v "username"|awk -F ": " '{print $2}') + now_text_type=$(echo -e "${now_text}"|grep "type"|awk -F ": " '{print $2}') + now_text_location=$(echo -e "${now_text}"|grep "location"|awk -F ": " '{print $2}') + now_text_disabled=$(echo -e "${now_text}"|grep "disabled"|awk -F ": " '{print $2}') + if [[ ${now_text_disabled} == "false" ]]; then + now_text_disabled_status="${Green_font_prefix}启用${Font_color_suffix}" + else + now_text_disabled_status="${Red_font_prefix}禁用${Font_color_suffix}" + fi + conf_list_all=${conf_list_all}"用户名: ${Green_font_prefix}"${now_text_username}"${Font_color_suffix} 密码: ${Green_font_prefix}"${now_text_password}"${Font_color_suffix} 节点名: ${Green_font_prefix}"${now_text_name}"${Font_color_suffix} 类型: ${Green_font_prefix}"${now_text_type}"${Font_color_suffix} 位置: ${Green_font_prefix}"${now_text_location}"${Font_color_suffix} 状态: ${Green_font_prefix}"${now_text_disabled_status}"${Font_color_suffix}\n" + done + echo && echo -e "节点总数 ${Green_font_prefix}"${conf_text_total}"${Font_color_suffix}" + echo -e ${conf_list_all} +} +Add_ServerStatus_server(){ + Set_config_server + Set_username_ch=$(cat ${server_conf}|grep '"username": "'"${username_s}"'"') + [[ ! -z "${Set_username_ch}" ]] && echo -e "${Error} 用户名已被使用 !" && exit 1 + sed -i '3i\ },' ${server_conf} + sed -i '3i\ "disabled": false' ${server_conf} + sed -i '3i\ "location": "'"${location_s}"'",' ${server_conf} + sed -i '3i\ "host": "'"None"'",' ${server_conf} + sed -i '3i\ "type": "'"${type_s}"'",' ${server_conf} + sed -i '3i\ "name": "'"${name_s}"'",' ${server_conf} + sed -i '3i\ "password": "'"${password_s}"'",' ${server_conf} + sed -i '3i\ "username": "'"${username_s}"'",' ${server_conf} + sed -i '3i\ {' ${server_conf} + echo -e "${Info} 添加节点成功 ${Green_font_prefix}[ 节点名称: ${name_s}, 节点用户名: ${username_s}, 节点密码: ${password_s} ]${Font_color_suffix} !" +} +Del_ServerStatus_server(){ + List_ServerStatus_server + [[ "${conf_text_total}" = "1" ]] && echo -e "${Error} 节点配置仅剩 1个,不能删除 !" && exit 1 + echo -e "请输入要删除的节点用户名" + read -e -p "(默认: 取消):" del_server_username + [[ -z "${del_server_username}" ]] && echo -e "已取消..." && exit 1 + del_username=`cat -n ${server_conf}|grep '"username": "'"${del_server_username}"'"'|awk '{print $1}'` + if [[ ! -z ${del_username} ]]; then + del_username_min=$(echo $((${del_username}-1))) + del_username_max=$(echo $((${del_username}+7))) + del_username_max_text=$(sed -n "${del_username_max}p" ${server_conf}) + del_username_max_text_last=`echo ${del_username_max_text:((${#del_username_max_text} - 1))}` + if [[ ${del_username_max_text_last} != "," ]]; then + del_list_num=$(echo $((${del_username_min}-1))) + sed -i "${del_list_num}s/,$//g" ${server_conf} + fi + sed -i "${del_username_min},${del_username_max}d" ${server_conf} + echo -e "${Info} 节点删除成功 ${Green_font_prefix}[ 节点用户名: ${del_server_username} ]${Font_color_suffix} " + else + echo -e "${Error} 请输入正确的节点用户名 !" && exit 1 + fi +} +Modify_ServerStatus_server_username(){ + List_ServerStatus_server + echo -e "请输入要修改的节点用户名" + read -e -p "(默认: 取消):" manually_username + [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1 + Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}') + if [[ ! -z ${Set_username_num} ]]; then + Set_username + Set_username_ch=$(cat ${server_conf}|grep '"username": "'"${username_s}"'"') + [[ ! -z "${Set_username_ch}" ]] && echo -e "${Error} 用户名已被使用 !" && exit 1 + sed -i "${Set_username_num}"'s/"username": "'"${manually_username}"'"/"username": "'"${username_s}"'"/g' ${server_conf} + echo -e "${Info} 修改成功 [ 原节点用户名: ${manually_username}, 新节点用户名: ${username_s} ]" + else + echo -e "${Error} 请输入正确的节点用户名 !" && exit 1 + fi +} +Modify_ServerStatus_server_password(){ + List_ServerStatus_server + echo -e "请输入要修改的节点用户名" + read -e -p "(默认: 取消):" manually_username + [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1 + Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}') + if [[ ! -z ${Set_username_num} ]]; then + Set_password + Set_password_num_a=$(echo $((${Set_username_num}+1))) + Set_password_num_text=$(sed -n "${Set_password_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}') + sed -i "${Set_password_num_a}"'s/"password": "'"${Set_password_num_text}"'"/"password": "'"${password_s}"'"/g' ${server_conf} + echo -e "${Info} 修改成功 [ 原节点密码: ${Set_password_num_text}, 新节点密码: ${password_s} ]" + else + echo -e "${Error} 请输入正确的节点用户名 !" && exit 1 + fi +} +Modify_ServerStatus_server_name(){ + List_ServerStatus_server + echo -e "请输入要修改的节点用户名" + read -e -p "(默认: 取消):" manually_username + [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1 + Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}') + if [[ ! -z ${Set_username_num} ]]; then + Set_name + Set_name_num_a=$(echo $((${Set_username_num}+2))) + Set_name_num_a_text=$(sed -n "${Set_name_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}') + sed -i "${Set_name_num_a}"'s/"name": "'"${Set_name_num_a_text}"'"/"name": "'"${name_s}"'"/g' ${server_conf} + echo -e "${Info} 修改成功 [ 原节点名称: ${Set_name_num_a_text}, 新节点名称: ${name_s} ]" + else + echo -e "${Error} 请输入正确的节点用户名 !" && exit 1 + fi +} +Modify_ServerStatus_server_type(){ + List_ServerStatus_server + echo -e "请输入要修改的节点用户名" + read -e -p "(默认: 取消):" manually_username + [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1 + Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}') + if [[ ! -z ${Set_username_num} ]]; then + Set_type + Set_type_num_a=$(echo $((${Set_username_num}+3))) + Set_type_num_a_text=$(sed -n "${Set_type_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}') + sed -i "${Set_type_num_a}"'s/"type": "'"${Set_type_num_a_text}"'"/"type": "'"${type_s}"'"/g' ${server_conf} + echo -e "${Info} 修改成功 [ 原节点虚拟化: ${Set_type_num_a_text}, 新节点虚拟化: ${type_s} ]" + else + echo -e "${Error} 请输入正确的节点用户名 !" && exit 1 + fi +} +Modify_ServerStatus_server_location(){ + List_ServerStatus_server + echo -e "请输入要修改的节点用户名" + read -e -p "(默认: 取消):" manually_username + [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1 + Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}') + if [[ ! -z ${Set_username_num} ]]; then + Set_location + Set_location_num_a=$(echo $((${Set_username_num}+5))) + Set_location_num_a_text=$(sed -n "${Set_location_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}') + sed -i "${Set_location_num_a}"'s/"location": "'"${Set_location_num_a_text}"'"/"location": "'"${location_s}"'"/g' ${server_conf} + echo -e "${Info} 修改成功 [ 原节点位置: ${Set_location_num_a_text}, 新节点位置: ${location_s} ]" + else + echo -e "${Error} 请输入正确的节点用户名 !" && exit 1 + fi +} +Modify_ServerStatus_server_all(){ + List_ServerStatus_server + echo -e "请输入要修改的节点用户名" + read -e -p "(默认: 取消):" manually_username + [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1 + Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}') + if [[ ! -z ${Set_username_num} ]]; then + Set_username + Set_password + Set_name + Set_type + Set_location + sed -i "${Set_username_num}"'s/"username": "'"${manually_username}"'"/"username": "'"${username_s}"'"/g' ${server_conf} + Set_password_num_a=$(echo $((${Set_username_num}+1))) + Set_password_num_text=$(sed -n "${Set_password_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}') + sed -i "${Set_password_num_a}"'s/"password": "'"${Set_password_num_text}"'"/"password": "'"${password_s}"'"/g' ${server_conf} + Set_name_num_a=$(echo $((${Set_username_num}+2))) + Set_name_num_a_text=$(sed -n "${Set_name_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}') + sed -i "${Set_name_num_a}"'s/"name": "'"${Set_name_num_a_text}"'"/"name": "'"${name_s}"'"/g' ${server_conf} + Set_type_num_a=$(echo $((${Set_username_num}+3))) + Set_type_num_a_text=$(sed -n "${Set_type_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}') + sed -i "${Set_type_num_a}"'s/"type": "'"${Set_type_num_a_text}"'"/"type": "'"${type_s}"'"/g' ${server_conf} + Set_location_num_a=$(echo $((${Set_username_num}+5))) + Set_location_num_a_text=$(sed -n "${Set_location_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}') + sed -i "${Set_location_num_a}"'s/"location": "'"${Set_location_num_a_text}"'"/"location": "'"${location_s}"'"/g' ${server_conf} + echo -e "${Info} 修改成功。" + else + echo -e "${Error} 请输入正确的节点用户名 !" && exit 1 + fi +} +Modify_ServerStatus_server_disabled(){ + List_ServerStatus_server + echo -e "请输入要修改的节点用户名" + read -e -p "(默认: 取消):" manually_username + [[ -z "${manually_username}" ]] && echo -e "已取消..." && exit 1 + Set_username_num=$(cat -n ${server_conf}|grep '"username": "'"${manually_username}"'"'|awk '{print $1}') + if [[ ! -z ${Set_username_num} ]]; then + Set_disabled_num_a=$(echo $((${Set_username_num}+6))) + Set_disabled_num_a_text=$(sed -n "${Set_disabled_num_a}p" ${server_conf}|sed 's/\"//g;s/,$//g'|awk -F ": " '{print $2}') + if [[ ${Set_disabled_num_a_text} == "false" ]]; then + disabled_s="true" + else + disabled_s="false" + fi + sed -i "${Set_disabled_num_a}"'s/"disabled": '"${Set_disabled_num_a_text}"'/"disabled": '"${disabled_s}"'/g' ${server_conf} + echo -e "${Info} 修改成功 [ 原禁用状态: ${Set_disabled_num_a_text}, 新禁用状态: ${disabled_s} ]" + else + echo -e "${Error} 请输入正确的节点用户名 !" && exit 1 + fi +} +Set_ServerStatus_client(){ + check_installed_client_status + Set_config_client + Read_config_client + Del_iptables_OUT "${client_port}" + Modify_config_client + Add_iptables_OUT "${server_port_s}" + Restart_ServerStatus_client +} +Modify_config_client(){ + sed -i 's/SERVER = "'"${client_server}"'"/SERVER = "'"${server_s}"'"/g' "${client_file}/status-client.py" + sed -i "s/PORT = ${client_port}/PORT = ${server_port_s}/g" "${client_file}/status-client.py" + sed -i 's/USER = "'"${client_user}"'"/USER = "'"${username_s}"'"/g' "${client_file}/status-client.py" + sed -i 's/PASSWORD = "'"${client_password}"'"/PASSWORD = "'"${password_s}"'"/g' "${client_file}/status-client.py" +} +Install_jq(){ + if [[ ! -e ${jq_file} ]]; then + if [[ ${bit} = "x86_64" ]]; then + wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64" -O ${jq_file} + else + wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux32" -O ${jq_file} + fi + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ解析器 下载失败,请检查 !" && exit 1 + chmod +x ${jq_file} + echo -e "${Info} JQ解析器 安装完成,继续..." + else + echo -e "${Info} JQ解析器 已安装,继续..." + fi +} +Install_caddy(){ + echo + echo -e "${Info} 是否由脚本自动配置HTTP服务(服务端的在线监控网站),如果选择 N,则请在其他HTTP服务中配置网站根目录为:${Green_font_prefix}${web_file}${Font_color_suffix} [Y/n]" + read -e -p "(默认: Y 自动部署):" caddy_yn + [[ -z "$caddy_yn" ]] && caddy_yn="y" + if [[ "${caddy_yn}" == [Yy] ]]; then + Set_server "server" + Set_server_http_port + if [[ ! -e "/usr/local/caddy/caddy" ]]; then + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/caddy_install.sh + chmod +x caddy_install.sh + bash caddy_install.sh install + rm -rf caddy_install.sh + [[ ! -e "/usr/local/caddy/caddy" ]] && echo -e "${Error} Caddy安装失败,请手动部署,Web网页文件位置:${Web_file}" && exit 1 + else + echo -e "${Info} 发现Caddy已安装,开始配置..." + fi + if [[ ! -s "/usr/local/caddy/Caddyfile" ]]; then + cat > "/usr/local/caddy/Caddyfile"<<-EOF +http://${server_s}:${server_http_port_s} { + root ${web_file} + timeouts none + gzip +} +EOF + /etc/init.d/caddy restart + else + echo -e "${Info} 发现 Caddy 配置文件非空,开始追加 ServerStatus 网站配置内容到文件最后..." + cat >> "/usr/local/caddy/Caddyfile"<<-EOF +http://${server_s}:${server_http_port_s} { + root ${web_file} + timeouts none + gzip +} +EOF + /etc/init.d/caddy restart + fi + else + echo -e "${Info} 跳过 HTTP服务部署,请手动部署,Web网页文件位置:${web_file} ,如果位置改变,请注意修改服务脚本文件 /etc/init.d/status-server 中的 WEB_BIN 变量 !" + fi +} +Install_ServerStatus_server(){ + [[ -e "${server_file}/sergate" ]] && echo -e "${Error} 检测到 ServerStatus 服务端已安装 !" && exit 1 + Set_server_port + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency "server" + Install_caddy + echo -e "${Info} 开始下载/安装..." + Download_Server_Status_server + Install_jq + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_Server_Status_server + echo -e "${Info} 开始写入 配置文件..." + Write_server_config + Write_server_config_conf + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables "${server_port_s}" + [[ ! -z "${server_http_port_s}" ]] && Add_iptables "${server_http_port_s}" + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_ServerStatus_server +} +Install_ServerStatus_client(){ + [[ -e "${client_file}/status-client.py" ]] && echo -e "${Error} 检测到 ServerStatus 客户端已安装 !" && exit 1 + check_sys + if [[ ${release} == "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? != 0 ]]; then + echo -e "${Info} 检测到你的系统为 CentOS6,该系统自带的 Python2.6 版本过低,会导致无法运行客户端,如果你有能力升级为 Python2.7,那么请继续(否则建议更换系统):[y/N]" + read -e -p "(默认: N 继续安装):" sys_centos6 + [[ -z "$sys_centos6" ]] && sys_centos6="n" + if [[ "${sys_centos6}" == [Nn] ]]; then + echo -e "\n${Info} 已取消...\n" + exit 1 + fi + fi + fi + echo -e "${Info} 开始设置 用户配置..." + Set_config_client + echo -e "${Info} 开始安装/配置 依赖..." + Installation_dependency "client" + echo -e "${Info} 开始下载/安装..." + Download_Server_Status_client + echo -e "${Info} 开始下载/安装 服务脚本(init)..." + Service_Server_Status_client + echo -e "${Info} 开始写入 配置..." + Read_config_client + Modify_config_client + echo -e "${Info} 开始设置 iptables防火墙..." + Set_iptables + echo -e "${Info} 开始添加 iptables防火墙规则..." + Add_iptables_OUT "${server_port_s}" + echo -e "${Info} 开始保存 iptables防火墙规则..." + Save_iptables + echo -e "${Info} 所有步骤 安装完毕,开始启动..." + Start_ServerStatus_client +} +Update_ServerStatus_server(){ + check_installed_server_status + check_pid_server + [[ ! -z ${PID} ]] && /etc/init.d/status-server stop + Download_Server_Status_server + rm -rf /etc/init.d/status-server + Service_Server_Status_server + Start_ServerStatus_server +} +Update_ServerStatus_client(){ + check_installed_client_status + check_pid_client + [[ ! -z ${PID} ]] && /etc/init.d/status-client stop + if [[ ! -e "${client_file}/status-client.py" ]]; then + if [[ ! -e "${file}/status-client.py" ]]; then + echo -e "${Error} ServerStatus 客户端文件不存在 !" && exit 1 + else + client_text="$(cat "${file}/status-client.py"|sed 's/\"//g;s/,//g;s/ //g')" + rm -rf "${file}/status-client.py" + fi + else + client_text="$(cat "${client_file}/status-client.py"|sed 's/\"//g;s/,//g;s/ //g')" + fi + server_s="$(echo -e "${client_text}"|grep "SERVER="|awk -F "=" '{print $2}')" + server_port_s="$(echo -e "${client_text}"|grep "PORT="|awk -F "=" '{print $2}')" + username_s="$(echo -e "${client_text}"|grep "USER="|awk -F "=" '{print $2}')" + password_s="$(echo -e "${client_text}"|grep "PASSWORD="|awk -F "=" '{print $2}')" + Download_Server_Status_client + Read_config_client + Modify_config_client + rm -rf /etc/init.d/status-client + Service_Server_Status_client + Start_ServerStatus_client +} +Start_ServerStatus_server(){ + check_installed_server_status + check_pid_server + [[ ! -z ${PID} ]] && echo -e "${Error} ServerStatus 正在运行,请检查 !" && exit 1 + /etc/init.d/status-server start +} +Stop_ServerStatus_server(){ + check_installed_server_status + check_pid_server + [[ -z ${PID} ]] && echo -e "${Error} ServerStatus 没有运行,请检查 !" && exit 1 + /etc/init.d/status-server stop +} +Restart_ServerStatus_server(){ + check_installed_server_status + check_pid_server + [[ ! -z ${PID} ]] && /etc/init.d/status-server stop + /etc/init.d/status-server start +} +Uninstall_ServerStatus_server(){ + check_installed_server_status + echo "确定要卸载 ServerStatus 服务端(如果同时安装了客户端,则只会删除服务端) ? [y/N]" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid_server + [[ ! -z $PID ]] && kill -9 ${PID} + Read_config_server + Del_iptables "${server_port}" + Save_iptables + if [[ -e "${client_file}/status-client.py" ]]; then + rm -rf "${server_file}" + rm -rf "${web_file}" + else + rm -rf "${file}" + fi + rm -rf "/etc/init.d/status-server" + if [[ -e "/etc/init.d/caddy" ]]; then + /etc/init.d/caddy stop + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/caddy_install.sh + chmod +x caddy_install.sh + bash caddy_install.sh uninstall + rm -rf caddy_install.sh + fi + if [[ ${release} = "centos" ]]; then + chkconfig --del status-server + else + update-rc.d -f status-server remove + fi + echo && echo "ServerStatus 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +Start_ServerStatus_client(){ + check_installed_client_status + check_pid_client + [[ ! -z ${PID} ]] && echo -e "${Error} ServerStatus 正在运行,请检查 !" && exit 1 + /etc/init.d/status-client start +} +Stop_ServerStatus_client(){ + check_installed_client_status + check_pid_client + [[ -z ${PID} ]] && echo -e "${Error} ServerStatus 没有运行,请检查 !" && exit 1 + /etc/init.d/status-client stop +} +Restart_ServerStatus_client(){ + check_installed_client_status + check_pid_client + [[ ! -z ${PID} ]] && /etc/init.d/status-client stop + /etc/init.d/status-client start +} +Uninstall_ServerStatus_client(){ + check_installed_client_status + echo "确定要卸载 ServerStatus 客户端(如果同时安装了服务端,则只会删除客户端) ? [y/N]" + echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid_client + [[ ! -z $PID ]] && kill -9 ${PID} + Read_config_client + Del_iptables_OUT "${client_port}" + Save_iptables + if [[ -e "${server_file}/sergate" ]]; then + rm -rf "${client_file}" + else + rm -rf "${file}" + fi + rm -rf /etc/init.d/status-client + if [[ ${release} = "centos" ]]; then + chkconfig --del status-client + else + update-rc.d -f status-client remove + fi + echo && echo "ServerStatus 卸载完成 !" && echo + else + echo && echo "卸载已取消..." && echo + fi +} +View_ServerStatus_client(){ + check_installed_client_status + Read_config_client + clear && echo "————————————————————" && echo + echo -e " ServerStatus 客户端配置信息: + + IP \t: ${Green_font_prefix}${client_server}${Font_color_suffix} + 端口 \t: ${Green_font_prefix}${client_port}${Font_color_suffix} + 账号 \t: ${Green_font_prefix}${client_user}${Font_color_suffix} + 密码 \t: ${Green_font_prefix}${client_password}${Font_color_suffix} + +————————————————————" +} +View_client_Log(){ + [[ ! -e ${client_log_file} ]] && echo -e "${Error} 没有找到日志文件 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${client_log_file}${Font_color_suffix} 命令。" && echo + tail -f ${client_log_file} +} +View_server_Log(){ + [[ ! -e ${erver_log_file} ]] && echo -e "${Error} 没有找到日志文件 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${erver_log_file}${Font_color_suffix} 命令。" && echo + tail -f ${erver_log_file} +} +Add_iptables_OUT(){ + iptables_ADD_OUT_port=$1 + iptables -I OUTPUT -m state --state NEW -m tcp -p tcp --dport ${iptables_ADD_OUT_port} -j ACCEPT + iptables -I OUTPUT -m state --state NEW -m udp -p udp --dport ${iptables_ADD_OUT_port} -j ACCEPT +} +Del_iptables_OUT(){ + iptables_DEL_OUT_port=$1 + iptables -D OUTPUT -m state --state NEW -m tcp -p tcp --dport ${iptables_DEL_OUT_port} -j ACCEPT + iptables -D OUTPUT -m state --state NEW -m udp -p udp --dport ${iptables_DEL_OUT_port} -j ACCEPT +} +Add_iptables(){ + iptables_ADD_IN_port=$1 + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${iptables_ADD_IN_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${iptables_ADD_IN_port} -j ACCEPT +} +Del_iptables(){ + iptables_DEL_IN_port=$1 + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${iptables_DEL_IN_port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${iptables_DEL_IN_port} -j ACCEPT +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + else + iptables-save > /etc/iptables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + chkconfig --level 2345 iptables on + else + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/status.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + if [[ -e "/etc/init.d/status-client" ]]; then + rm -rf /etc/init.d/status-client + Service_Server_Status_client + fi + if [[ -e "/etc/init.d/status-server" ]]; then + rm -rf /etc/init.d/status-server + Service_Server_Status_server + fi + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/status.sh" && chmod +x status.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +menu_client(){ +echo && echo -e " ServerStatus 一键安装管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/shell-jc3 -- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 + ———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 客户端 + ${Green_font_prefix} 2.${Font_color_suffix} 更新 客户端 + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 客户端 +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 客户端 + ${Green_font_prefix} 5.${Font_color_suffix} 停止 客户端 + ${Green_font_prefix} 6.${Font_color_suffix} 重启 客户端 +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 客户端配置 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 客户端信息 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 客户端日志 +———————————— + ${Green_font_prefix}10.${Font_color_suffix} 切换为 服务端菜单" && echo +if [[ -e "${client_file}/status-client.py" ]]; then + check_pid_client + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: 客户端 ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: 客户端 ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + if [[ -e "${file}/status-client.py" ]]; then + check_pid_client + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: 客户端 ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: 客户端 ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi + else + echo -e " 当前状态: 客户端 ${Red_font_prefix}未安装${Font_color_suffix}" + fi +fi +echo +read -e -p " 请输入数字 [0-10]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_ServerStatus_client + ;; + 2) + Update_ServerStatus_client + ;; + 3) + Uninstall_ServerStatus_client + ;; + 4) + Start_ServerStatus_client + ;; + 5) + Stop_ServerStatus_client + ;; + 6) + Restart_ServerStatus_client + ;; + 7) + Set_ServerStatus_client + ;; + 8) + View_ServerStatus_client + ;; + 9) + View_client_Log + ;; + 10) + menu_server + ;; + *) + echo "请输入正确数字 [0-10]" + ;; +esac +} +menu_server(){ +echo && echo -e " ServerStatus 一键安装管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/shell-jc3 -- + + ${Green_font_prefix} 0.${Font_color_suffix} 升级脚本 + ———————————— + ${Green_font_prefix} 1.${Font_color_suffix} 安装 服务端 + ${Green_font_prefix} 2.${Font_color_suffix} 更新 服务端 + ${Green_font_prefix} 3.${Font_color_suffix} 卸载 服务端 +———————————— + ${Green_font_prefix} 4.${Font_color_suffix} 启动 服务端 + ${Green_font_prefix} 5.${Font_color_suffix} 停止 服务端 + ${Green_font_prefix} 6.${Font_color_suffix} 重启 服务端 +———————————— + ${Green_font_prefix} 7.${Font_color_suffix} 设置 服务端配置 + ${Green_font_prefix} 8.${Font_color_suffix} 查看 服务端信息 + ${Green_font_prefix} 9.${Font_color_suffix} 查看 服务端日志 +———————————— + ${Green_font_prefix}10.${Font_color_suffix} 切换为 客户端菜单" && echo +if [[ -e "${server_file}/sergate" ]]; then + check_pid_server + if [[ ! -z "${PID}" ]]; then + echo -e " 当前状态: 服务端 ${Green_font_prefix}已安装${Font_color_suffix} 并 ${Green_font_prefix}已启动${Font_color_suffix}" + else + echo -e " 当前状态: 服务端 ${Green_font_prefix}已安装${Font_color_suffix} 但 ${Red_font_prefix}未启动${Font_color_suffix}" + fi +else + echo -e " 当前状态: 服务端 ${Red_font_prefix}未安装${Font_color_suffix}" +fi +echo +read -e -p " 请输入数字 [0-10]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_ServerStatus_server + ;; + 2) + Update_ServerStatus_server + ;; + 3) + Uninstall_ServerStatus_server + ;; + 4) + Start_ServerStatus_server + ;; + 5) + Stop_ServerStatus_server + ;; + 6) + Restart_ServerStatus_server + ;; + 7) + Set_ServerStatus_server + ;; + 8) + List_ServerStatus_server + ;; + 9) + View_server_Log + ;; + 10) + menu_client + ;; + *) + echo "请输入正确数字 [0-10]" + ;; +esac +} +check_sys +action=$1 +if [[ ! -z $action ]]; then + if [[ $action = "s" ]]; then + menu_server + elif [[ $action = "c" ]]; then + menu_client + fi +else + menu_server +fi \ No newline at end of file diff --git a/tinymapper.sh b/tinymapper.sh new file mode 100644 index 0000000..eda95b6 --- /dev/null +++ b/tinymapper.sh @@ -0,0 +1,424 @@ +#!/usr/bin/env bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +#================================================= +# System Required: CentOS/Debian/Ubuntu +# Description: tinyPortMapper +# Version: 1.0.2 +# Author: Toyo +# Blog: https://doub.io/wlzy-36/ +#================================================= +sh_ver="1.0.2" + +Folder="/usr/local/tinyPortMapper" +File="/usr/local/tinyPortMapper/tinymapper" +LOG_File="/tmp/tinymapper.log" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[信息]${Font_color_suffix}" && Error="${Red_font_prefix}[错误]${Font_color_suffix}" && Tip="${Green_font_prefix}[注意]${Font_color_suffix}" + +Get_IP(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi +} +Add_iptables(){ + iptables_Type=$1 + if [[ ! -z "${local_Port}" ]]; then + if [[ ${iptables_Type} == "tcp" ]]; then + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${local_Port} -j ACCEPT + elif [[ ${iptables_Type} == "udp" ]]; then + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${local_Port} -j ACCEPT + elif [[ ${iptables_Type} == "all" ]]; then + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${local_Port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${local_Port} -j ACCEPT + fi + fi +} +Del_iptables(){ + iptables_Type=$1 + if [[ ! -z "${port}" ]]; then + if [[ ${iptables_Type} == "tcp" ]]; then + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + elif [[ ${iptables_Type} == "udp" ]]; then + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + elif [[ ${iptables_Type} == "all" ]]; then + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + fi + fi +} +Save_iptables(){ + iptables-save > /etc/iptables.up.rules +} +Set_iptables(){ + iptables-save > /etc/iptables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables +} +check_tinyPortMapper(){ + [[ ! -e ${File} ]] && echo -e "${Error} 没有安装 tinyPortMapper , 请检查 !" && exit 1 +} +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_new_ver(){ + tinymapper_new_ver=$(wget --no-check-certificate -qO- https://api.github.com/repos/wangyu-/tinyPortMapper/releases | grep -o '"tag_name": ".*"' |grep -v '20180620.0'|head -n 1| sed 's/"//g;s/v//g' | sed 's/tag_name: //g') + if [[ -z ${tinymapper_new_ver} ]]; then + echo -e "${Error} tinyPortMapper 最新版本获取失败,请手动获取最新版本号[ https://github.com/wangyu-/tinyPortMapper/releases ]" + read -e -p "请输入版本号 [ 格式是日期 , 如 20180224.0 ] :" tinymapper_new_ver + [[ -z "${tinymapper_new_ver}" ]] && echo "取消..." && exit 1 + else + echo -e "${Info} 检测到 tinyPortMapper 最新版本为 [ ${tinymapper_new_ver} ]" + fi +} +Download_tinyPortMapper(){ + cd ${Folder} + wget -N --no-check-certificate "https://github.com/wangyu-/tinyPortMapper/releases/download/${tinymapper_new_ver}/tinymapper_binaries.tar.gz" + [[ ! -e "tinymapper_binaries.tar.gz" ]] && echo -e "${Error} tinyPortMapper 压缩包下载失败 !" && exit 1 + tar -xzf tinymapper_binaries.tar.gz + if [[ ${bit} == "x86_64" ]]; then + [[ ! -e "tinymapper_amd64" ]] && echo -e "${Error} tinyPortMapper 解压失败 !" && exit 1 + mv tinymapper_amd64 tinymapper + else + [[ ! -e "tinymapper_x86" ]] && echo -e "${Error} tinyPortMapper 解压失败 !" && exit 1 + mv tinymapper_x86 tinymapper + fi + [[ ! -e "tinymapper" ]] && echo -e "${Error} tinyPortMapper 重命名失败 !" && exit 1 + chmod +x tinymapper + rm -rf version.txt + rm -rf tinymapper_* + rm -rf tinymapper_binaries.tar.gz +} +Install_tinyPortMapper(){ + [[ -e ${File} ]] && echo -e "${Error} 已经安装 tinyPortMapper , 请检查 !" && exit 1 + mkdir ${Folder} + check_new_ver + Download_tinyPortMapper + Set_iptables + echo -e "${Info} tinyPortMapper 安装完成!" +} +Uninstall_tinyPortMapper(){ + check_tinyPortMapper + echo "确定要 卸载 tinyPortMapper?[y/N]" && echo + read -e -p "(默认: n):" unyn + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + Uninstall_forwarding "Uninstall" + rm -rf ${Folder} + echo && echo " tinyPortMapper 卸载完成 !" && echo + else + echo && echo " 卸载已取消..." && echo + fi +} +Uninstall_forwarding(){ + Uninstall_forwarding_Type=$1 + check_tinyPortMapper + tinymapper_Total=$(ps -ef | grep tinymapper | grep -v grep | grep -v "tinymapper.sh" | wc -l) + if [[ ${tinymapper_Total} != "0" ]]; then + for((integer = 1; integer <= ${tinymapper_Total}; integer++)) + do + Uninstall_all=$(ps -ef | grep tinymapper | grep -v grep | grep -v "tinymapper.sh") + Uninstall_pid=$(echo -e "${Uninstall_all}"| sed -n "1p"| awk '{print $2}') + Uninstall_listen=$(echo -e "${Uninstall_all}"| sed -n "1p"| awk '{print $10}'| awk -F ':' '{print $NF}') + Uninstall_type_tcp=$(echo -e "${Uninstall_all}"| sed -n "1p"| awk '{print $13}') + if [[ ${Uninstall_type_tcp} == "-t" ]]; then + Uninstall_type_udp=$(echo -e "${Uninstall_all}"| sed -n "1p"| awk '{print $14}') + if [[ ${Uninstall_type_udp} == "-u" ]]; then + Uninstall_type="all" + else + Uninstall_type="tcp" + fi + else + Uninstall_type="udp" + fi + kill -9 "${Uninstall_pid}" + Del_iptables "${Uninstall_type}" + sleep 1s + done + fi + if [[ ${Uninstall_forwarding_Type} != "Uninstall" ]]; then + tinymapper_Total=$(ps -ef | grep tinymapper | grep -v grep | grep -v "tinymapper.sh" | wc -l) + if [[ ${tinymapper_Total} == "0" ]]; then + echo -e "${Info} tinyPortMapper 所有端口转发已清空!" + else + echo -e "${Error} tinyPortMapper 所有端口转发清空失败!" + fi + fi +} +Add_forwarding(){ + check_tinyPortMapper + Set_local_Port + Set_Mapper_Port + Set_Mapper_IP + Set_Mapper_Type + Mapper_Type_1=${Mapper_Type} + [[ ${Mapper_Type_1} == "ALL" ]] && Mapper_Type_1="TCP+UDP" + echo -e "\n—————————————————————————————— + 请检查 tinyPortMapper 配置是否有误 !\n + 本地监听端口\t : ${Red_background_prefix} ${local_Port} ${Font_color_suffix} + 远程转发 IP\t : ${Red_background_prefix} ${Mapper_IP} ${Font_color_suffix} + 远程转发端口\t : ${Red_background_prefix} ${Mapper_Port} ${Font_color_suffix} + 转发类型\t : ${Red_background_prefix} ${Mapper_Type_1} ${Font_color_suffix} +——————————————————————————————\n" + read -e -p "请按任意键继续,如有配置错误请使用 Ctrl+C 退出。" var + Start_tinyPortMapper + Get_IP + clear + echo -e "\n—————————————————————————————— + tinyPortMapper 已启动 !\n + 本地监听 IP\t : ${Red_background_prefix} ${ip} ${Font_color_suffix} + 本地监听端口\t : ${Red_background_prefix} ${local_Port} ${Font_color_suffix}\n + 远程转发 IP\t : ${Red_background_prefix} ${Mapper_IP} ${Font_color_suffix} + 远程转发端口\t : ${Red_background_prefix} ${Mapper_Port} ${Font_color_suffix} + 转发类型\t : ${Red_background_prefix} ${Mapper_Type_1} ${Font_color_suffix} +——————————————————————————————\n" +} +Set_local_Port(){ + while true + do + echo -e "请输入 tinyPortMapper 的 本地监听端口 [1-65535]" + read -e -p "(默认回车取消):" local_Port + [[ -z "${local_Port}" ]] && echo "已取消..." && exit 1 + echo $((${local_Port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${local_Port} -ge 1 ]] && [[ ${local_Port} -le 65535 ]]; then + echo + echo "——————————————————————————————" + echo -e " 本地监听端口 : ${Red_background_prefix} ${local_Port} ${Font_color_suffix}" + echo "——————————————————————————————" + echo + break + else + echo -e "${Error} 请输入正确的数字 !" + fi + else + echo -e "${Error} 请输入正确的数字 !" + fi + done +} +Set_Mapper_Port(){ + while true + do + echo -e "请输入 tinyPortMapper 远程被转发 端口 [1-65535](就是被中转服务器的端口)" + read -e -p "(默认同本地监听端口: ${local_Port}):" Mapper_Port + [[ -z "${Mapper_Port}" ]] && Mapper_Port=${local_Port} + echo $((${Mapper_Port}+0)) &>/dev/null + if [[ $? -eq 0 ]]; then + if [[ ${Mapper_Port} -ge 1 ]] && [[ ${Mapper_Port} -le 65535 ]]; then + echo + echo "——————————————————————————————" + echo -e " 远程转发端口 : ${Red_background_prefix} ${Mapper_Port} ${Font_color_suffix}" + echo "——————————————————————————————" + echo + break + else + echo -e "${Error} 请输入正确的数字 !" + fi + else + echo -e "${Error} 请输入正确的数字 !" + fi + done +} +Set_Mapper_IP(){ + echo -e "请输入 tinyPortMapper 远程被转发 IP(就是被中转服务器的外网IP)" + read -e -p "(默认回车取消):" Mapper_IP + [[ -z "${Mapper_IP}" ]] && echo "已取消..." && exit 1 + echo + echo "——————————————————————————————" + echo -e " 远程转发 IP : ${Red_background_prefix} ${Mapper_IP} ${Font_color_suffix}" + echo "——————————————————————————————" + echo +} +Set_Mapper_Type(){ + echo -e "请输入数字 来选择 tinyPortMapper 转发类型:" + echo -e " 1. TCP\n 2. UDP\n 3. TCP+UDP(ALL)\n" + read -e -p "(默认: TCP+UDP):" Mapper_Type_num + [[ -z "${Mapper_Type_num}" ]] && Mapper_Type_num="3" + if [[ ${Mapper_Type_num} = "1" ]]; then + Mapper_Type="TCP" + elif [[ ${Mapper_Type_num} = "2" ]]; then + Mapper_Type="UDP" + elif [[ ${Mapper_Type_num} = "3" ]]; then + Mapper_Type="ALL" + else + Mapper_Type="ALL" + fi +} +Start_tinyPortMapper(){ + cd ${Folder} + if [[ ${Mapper_Type} = "TCP" ]]; then + Run_tinyPortMapper "-t" + sleep 2s + PID=$(ps -ef | grep "./tinymapper -l 0.0.0.0:${local_Port}" | grep -v grep | awk '{print $2}') + [[ -z ${PID} ]] && echo -e "${Error} tinyPortMapper TCP 启动失败 !" && exit 1 + Add_iptables "tcp" + elif [[ ${Mapper_Type} = "UDP" ]]; then + Run_tinyPortMapper "-u" + sleep 2s + PID=$(ps -ef | grep "./tinymapper -l 0.0.0.0:${local_Port}" | grep -v grep | awk '{print $2}') + [[ -z ${PID} ]] && echo -e "${Error} tinyPortMapper UDP 启动失败 !" && exit 1 + Add_iptables "udp" + elif [[ ${Mapper_Type} = "ALL" ]]; then + Run_tinyPortMapper "-t -u" + sleep 2s + PID=$(ps -ef | grep "./tinymapper -l 0.0.0.0:${local_Port}" | grep -v grep | awk '{print $2}') + [[ -z ${PID} ]] && echo -e "${Error} tinyPortMapper TCP+UDP 启动失败 !" && exit 1 + Add_iptables "all" + fi + Save_iptables +} +Run_tinyPortMapper(){ + nohup ./tinymapper -l 0.0.0.0:${local_Port} -r ${Mapper_IP}:${Mapper_Port} $1 > ${LOG_File} 2>&1 & +} +View_forwarding(){ + check_tinyPortMapper + tinymapper_Total=$(ps -ef | grep tinymapper | grep -v grep | grep -v "tinymapper.sh" | wc -l) + if [[ ${tinymapper_Total} = "0" ]]; then + echo -e "${Error} 没有发现 tinyPortMapper 进程运行,请检查 !" && exit 1 + fi + tinymapper_list_all="" + for((integer = 1; integer <= ${tinymapper_Total}; integer++)) + do + tinymapper_all=$(ps -ef | grep tinymapper | grep -v grep | grep -v "tinymapper.sh") + tinymapper_pid=$(echo -e "${tinymapper_all}"| sed -n "${integer}p"| awk '{print $2}') + tinymapper_listen=$(echo -e "${tinymapper_all}"| sed -n "${integer}p"| awk '{print $10}'| awk -F ':' '{print $NF}') + tinymapper_fork=$(echo -e "${tinymapper_all}"| sed -n "${integer}p"| awk '{print $12}') + tinymapper_type_tcp=$(echo -e "${tinymapper_all}"| sed -n "${integer}p"| awk '{print $13}') + if [[ ${tinymapper_type_tcp} == "-t" ]]; then + tinymapper_type_udp=$(echo -e "${tinymapper_all}"| sed -n "${integer}p"| awk '{print $14}') + if [[ ${tinymapper_type_udp} == "-u" ]]; then + tinymapper_type="TCP+UDP" + else + tinymapper_type="TCP" + fi + else + tinymapper_type="UDP" + fi + tinymapper_list_all=${tinymapper_list_all}"进程PID: ${Red_font_prefix}"${tinymapper_pid}"${Font_color_suffix} 类型: ${Red_font_prefix}"${tinymapper_type}"${Font_color_suffix} 监听端口: ${Green_font_prefix}"${tinymapper_listen}"${Font_color_suffix} 转发IP和端口: ${Green_font_prefix}"${tinymapper_fork}"${Font_color_suffix}\n" + done + echo + echo -e "当前有${Green_background_prefix}" ${tinymapper_Total} "${Font_color_suffix}个 tinyPortMapper 端口转发进程。" + echo -e "${tinymapper_list_all}" +} +Del_forwarding(){ + check_tinyPortMapper + PID=$(ps -ef | grep tinymapper | grep -v grep | grep -v "tinymapper.sh" | awk '{print $2}') + [[ -z $PID ]] && echo -e "${Error} 没有发现 tinyPortMapper 进程运行,请检查 !" && exit 1 + while true + do + View_forwarding + read -e -p "请输入你要终止的 tinyPortMapper 本地监听端口:" Del_forwarding_port + [[ -z "${Del_forwarding_port}" ]] && echo "已取消..." && exit 0 + Del_port=$(echo -e "${tinymapper_list_all}"|grep ${Del_forwarding_port}) + if [[ ! -z ${Del_port} ]]; then + port=${Del_forwarding_port} + Del_all=$(ps -ef | grep tinymapper | grep -v grep | grep -v "tinymapper.sh") + pid=$(echo -e "${Del_all}"| grep "./tinymapper -l 0.0.0.0:${Del_forwarding_port}"| awk '{print $2}') + Del_type_tcp=$(echo -e "${Del_all}"| grep "./tinymapper -l 0.0.0.0:${Del_forwarding_port}"| awk '{print $13}') + if [[ ${Del_type_tcp} == "-t" ]]; then + Del_type_udp=$(echo -e "${Del_all}"| grep "./tinymapper -l 0.0.0.0:${Del_forwarding_port}"| awk '{print $14}') + if [[ ${Del_type_udp} == "-u" ]]; then + Del_type="all" + else + Del_type="tcp" + fi + else + Del_type="udp" + fi + kill -9 ${pid} + sleep 2s + pid=$(ps -ef | grep tinymapper | grep -v grep | grep -v "tinymapper.sh"| grep "./tinymapper -l 0.0.0.0:${Del_forwarding_port}"| awk '{print $2}') + if [[ -z ${pid} ]]; then + echo -e "${Info} tinyPortMapper [${Del_forwarding_port}] 终止成功!" + Del_iptables "${Del_type}" + else + echo -e "${Error} tinyPortMapper [${Del_forwarding_port}] 终止失败!" && exit 1 + fi + break + else + echo -e "${Error} 请输入正确的端口 !" + fi + done +} +# 查看日志 +View_Log(){ + [[ ! -e ${LOG_File} ]] && echo -e "${Error} tinyPortMapper 日志文件不存在 !" && exit 1 + echo && echo -e "${Tip} 按 ${Red_font_prefix}Ctrl+C${Font_color_suffix} 终止查看日志" && echo -e "如果需要查看完整日志内容,请用 ${Red_font_prefix}cat ${LOG_File}${Font_color_suffix} 命令。" && echo + tail -f ${LOG_File} +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/tinymapper.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} 无法链接到 Github !" && exit 0 + wget -N --no-check-certificate "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/tinymapper.sh" && chmod +x tinymapper.sh + echo -e "脚本已更新为最新版本[ ${sh_new_ver} ] !(注意:因为更新方式为直接覆盖当前运行的脚本,所以可能下面会提示一些报错,无视即可)" && exit 0 +} +check_sys +[[ ${release} != "centos" ]] && [[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && echo -e "${Error} 本脚本不支持当前系统 ${release} !" && exit 1 +echo && echo -e " tinyPortMapper 端口转发一键管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} + -- Toyo | doub.io/wlzy-36 -- + + ${Green_font_prefix}0.${Font_color_suffix} 升级脚本 +———————————— + ${Green_font_prefix}1.${Font_color_suffix} 安装 tinyPortMapper + ${Green_font_prefix}2.${Font_color_suffix} 卸载 tinyPortMapper + ${Green_font_prefix}3.${Font_color_suffix} 清空 tinyPortMapper 端口转发 +———————————— + ${Green_font_prefix}4.${Font_color_suffix} 查看 tinyPortMapper 端口转发 + ${Green_font_prefix}5.${Font_color_suffix} 添加 tinyPortMapper 端口转发 + ${Green_font_prefix}6.${Font_color_suffix} 删除 tinyPortMapper 端口转发 +———————————— + ${Green_font_prefix}7.${Font_color_suffix} 查看 tinyPortMapper 输出日志" && echo +read -e -p " 请输入数字 [0-7]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + Install_tinyPortMapper + ;; + 2) + Uninstall_tinyPortMapper + ;; + 3) + Uninstall_forwarding + ;; + 4) + View_forwarding + ;; + 5) + Add_forwarding + ;; + 6) + Del_forwarding + ;; + 7) + View_Log + ;; + *) + echo "请输入正确数字 [0-7]" + ;; +esac \ No newline at end of file