├── Get_Out_Spam.sh ├── README.md ├── bbr.sh ├── cloudt.sh ├── gogo.sh ├── haproxy.sh ├── iptables-pf.sh ├── other ├── README.md └── jq-1.5.tar.gz ├── pserver.sh ├── pythonhttp.sh ├── socat.sh └── ssr.sh /Get_Out_Spam.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ######################################################################### 3 | # File Name: Get_Out_Spam.sh 4 | # Author: LookBack 5 | # Email: admin#dwhd.org 6 | # Version: 7 | # Created Time: 2015年09月15日 星期二 22时30分38秒 8 | ######################################################################### 9 | 10 | smpt_port="25,26,465,587" 11 | pop_port="109,110,995" 12 | imap_port="143,218,220,993" 13 | other_port="24,50,57,105,106,158,209,587,1109,24554,60177,60179" 14 | key_word=(Subject HELO SMTP 15 | "torrent" ".torrent" "peer_id=" "announce" 16 | "info_hash" "get_peers" "find_node" 17 | "BitTorrent" "announce_peer" 18 | "BitTorrent protocol" "announce.php?passkey=") 19 | 20 | v4iptables=`which iptables 2>/dev/null` 21 | v6iptables=`which ip6tables 2>/dev/null` 22 | 23 | cat_rules() { $1 -t $2 -L OUTPUT -nvx --line-numbers; } 24 | mangle_key_word() { $1 -t mangle -A OUTPUT -m string --string "$2" --algo bm --to 65535 -j DROP; } 25 | tcp_port_DROP() { 26 | [ "$1" = "$v4iptables" ] && $1 -t filter -A OUTPUT -p tcp -m multiport --dports $2 -m state --state NEW,ESTABLISHED -j REJECT --reject-with icmp-port-unreachable 27 | [ "$1" = "$v6iptables" ] && $1 -t filter -A OUTPUT -p tcp -m multiport --dports $2 -m state --state NEW,ESTABLISHED -j REJECT --reject-with tcp-reset 28 | } 29 | udp_port_DROP() { $1 -t filter -A OUTPUT -p udp -m multiport --dports $2 -j DROP; } 30 | save_rules() { 31 | if [ -f /etc/redhat-release ]; then 32 | for i in $v4iptables $v6iptables;do ${i}-save > /etc/sysconfig/`basename $i`; done 33 | else 34 | for i in $v4iptables $v6iptables;do ${i}-save > /etc/`basename $i`.rules;done 35 | cat > /etc/network/if-pre-up.d/iptables << EOF 36 | #!/bin/bash 37 | ${v4iptables}-restore < /etc/`basename $v4iptables`.rules 38 | EOF 39 | chmod +x /etc/network/if-pre-up.d/iptables 40 | fi 41 | } 42 | 43 | if [ -n "$v4iptables" -a -n "$v6iptables" ]; then 44 | for i in ${key_word[@]}; do for j in $v4iptables $v6iptables; do mangle_key_word $j $i; done; done 45 | for i in ${smpt_port} ${pop_port} ${imap_port} ${other_port}; do for j in $v4iptables $v6iptables; do tcp_port_DROP $j $i && udp_port_DROP $j $i; done; done 46 | clear && for i in $v4iptables $v6iptables; do for j in filter mangle; do cat_rules $i $j; done; done && save_rules 47 | elif [ -n "$v4iptables" ]; then 48 | for i in ${key_word[@]}; do mangle_key_word $v4iptables $i;done 49 | for i in ${smpt_port} ${pop_port} ${imap_port} ${other_port}; do tcp_port_DROP $v4iptables $i && udp_port_DROP $v4iptables $i; done 50 | clear && for i in filter mangle; do cat_rules $v4iptables $i;done && save_rules 51 | else 52 | echo "Your system don't find iptables" 53 | fi 54 | 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 一个逗比写的逗比脚本 2 | 3 | ssr.sh 4 | ====== 5 | 6 | - 脚本说明: ShadowsocksR 一键安装/管理脚本,支持单端口/多端口切换和管理 7 | - 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ 8 | - 使用方法: https://doub.io/ss-jc42/ 9 | - 项目地址: https://github.com/shadowsocksr/shadowsocksr/tree/manyuser 10 | 11 | ### 脚本特点: 12 | 目前网上的各个ShadowsocksR脚本基本都是只有 安装/启动/重启 等基础功能,对于小白来说还是不够简单方便。既然是一键脚本,那么就要尽可能地简单,小白更容易接受使用! 13 | 14 | - 支持 限制 端口速度 15 | - 支持 限制 端口设备数 16 | - 支持 设置 定时重启 17 | - 支持 显示 当前连接IP 18 | - 支持 显示 SS/SSR连接+二维码 19 | - 支持 切换管理 单/多端口 20 | - 支持 一键安装 锐速 21 | - 支持 一键安装 BBR 22 | - 支持 一键封禁 垃圾邮件(SMAP)/BT/PT 23 | 24 | ### 下载安装: 25 | ``` bash 26 | wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh 27 | ``` 28 | 29 | bbr.sh 30 | ====== 31 | 32 | - 脚本说明: BBR 一键安装脚本 33 | - 系统支持: Debian6+ / Ubuntu14+ 34 | - 使用方法: https://doub.io/wlzy-16/ 35 | 36 | ### 下载安装: 37 | ``` bash 38 | wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/bbr.sh && chmod +x bbr.sh && bash bbr.sh 39 | ``` 40 | 41 | cloudt.sh 42 | ====== 43 | 44 | - 脚本说明: Cloud Torrent 一键安装脚本 45 | - 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ 46 | - 使用方法: https://doub.io/wlzy-12/ 47 | - 项目地址: https://github.com/jpillora/cloud-torrent 48 | 49 | ### 下载安装: 50 | ``` bash 51 | wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/cloudt.sh && chmod +x cloudt.sh && bash cloudt.sh 52 | ``` 53 | 54 | pserver.sh 55 | ====== 56 | 57 | - 脚本说明: Peerflix Server 一键安装脚本 58 | - 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ 59 | - 使用方法: https://doub.io/wlzy-13/ 60 | - 项目地址: https://github.com/asapach/peerflix-server 61 | 62 | ### 下载安装: 63 | ``` bash 64 | wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/pserver.sh && chmod +x pserver.sh && bash pserver.sh 65 | ``` 66 | 67 | gogo.sh 68 | ====== 69 | 70 | - 脚本说明: GoGo Tunnel 一键安装脚本 71 | - 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ 72 | - 使用方法: https://doub.io/wlzy-24/ 73 | 74 | ### 下载安装: 75 | ``` bash 76 | wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/gogo.sh && chmod +x gogo.sh && bash gogo.sh 77 | ``` 78 | 79 | socat.sh 80 | ====== 81 | 82 | - 脚本说明: Socat 一键安装/管理脚本 83 | - 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ 84 | - 使用方法: https://doub.io/wlzy-18/ 85 | 86 | ### 下载安装: 87 | ``` bash 88 | wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/socat.sh && chmod +x socat.sh && bash socat.sh 89 | ``` 90 | 91 | haproxy.sh 92 | ====== 93 | 94 | - 脚本说明: HaProxy 一键安装/管理脚本 95 | - 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ 96 | - 使用方法: https://doub.io/wlzy-19/ 97 | 98 | ### 下载安装: 99 | ``` bash 100 | wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/haproxy.sh && chmod +x haproxy.sh && bash haproxy.sh 101 | ``` 102 | 103 | iptables-pf.sh 104 | ====== 105 | 106 | - 脚本说明: iptables 端口转发 一键安装/管理脚本 107 | - 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ 108 | - 使用方法: https://doub.io/wlzy-20/ 109 | 110 | ### 下载安装: 111 | ``` bash 112 | wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/iptables-pf.sh && chmod +x iptables-pf.sh && bash iptables-pf.sh 113 | ``` 114 | 115 | pythonhttp.sh 116 | ====== 117 | 118 | - 脚本说明: SimpleHTTPServer 一键安装/管理脚本 119 | - 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ 120 | - 使用方法: https://doub.io/wlzy-8/ 121 | 122 | ### 下载安装: 123 | ``` bash 124 | wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/pythonhttp.sh && chmod +x pythonhttp.sh && bash pythonhttp.sh 125 | ``` 126 | 127 | Get_Out_Spam.sh 128 | ====== 129 | 130 | - 脚本说明: iptables 垃圾邮件(SPAM)/BT/PT 一键封禁脚本 131 | - 系统支持: CentOS6+ / Debian6+ / Ubuntu14+ 132 | - 使用方法: https://doub.io/wlzy-14/ 133 | 134 | ### 下载安装: 135 | ``` bash 136 | wget -4qO- raw.githubusercontent.com/ToyoDAdoubi/doubi/master/Get_Out_Spam.sh|bash 137 | ``` 138 | 139 | Copyright (C) 2016-2017 Toyo 140 | -------------------------------------------------------------------------------- /bbr.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 3 | export PATH 4 | 5 | #================================================= 6 | # System Required: Debian/Ubuntu 7 | # Description: TCP-BBR 8 | # Version: 1.0.8 9 | # Author: Toyo 10 | # Blog: https://doub.io/wlzy-16/ 11 | #================================================= 12 | 13 | #检查系统 14 | check_sys(){ 15 | if [[ -f /etc/redhat-release ]]; then 16 | release="centos" 17 | elif cat /etc/issue | grep -q -E -i "debian"; then 18 | release="debian" 19 | elif cat /etc/issue | grep -q -E -i "ubuntu"; then 20 | release="ubuntu" 21 | elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then 22 | release="centos" 23 | elif cat /proc/version | grep -q -E -i "debian"; then 24 | release="debian" 25 | elif cat /proc/version | grep -q -E -i "ubuntu"; then 26 | release="ubuntu" 27 | elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then 28 | release="centos" 29 | fi 30 | } 31 | # 本段代码来源自: https://teddysun.com/489.html 32 | get_latest_new_version(){ 33 | echo -e "\033[42;37m [信息] \033[0m 检测内核最新版本中..." 34 | latest_version=$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/ | awk -F'\"v' '/v[4-9].[0-9].[0-9]/{print $2}' | cut -d/ -f1 | sort -V | tail -1) 35 | [[ -z ${latest_version} ]] && echo -e "\033[41;37m [错误] \033[0m 检测内核最新版本失败 !" && exit 1 36 | echo -e "\033[42;37m [信息] \033[0m 当前内核最新版本为 : ${latest_version}" 37 | } 38 | get_latest_version(){ 39 | get_latest_new_version 40 | bit=`uname -m` 41 | if [[ ${bit} == "x86_64" ]]; then 42 | 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) 43 | deb_kernel_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${latest_version}/${deb_name}" 44 | deb_kernel_name="linux-image-${latest_version}-amd64.deb" 45 | elif [ ${bit} == "i386" ]; then 46 | 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) 47 | deb_kernel_url="http://kernel.ubuntu.com/~kernel-ppa/mainline/v${latest_version}/${deb_name}" 48 | deb_kernel_name="linux-image-${latest_version}-i386.deb" 49 | else 50 | echo -e "\033[41;37m [错误] \033[0m 不支持 ${bit} !" && exit 1 51 | fi 52 | } 53 | #检查内核是否满足 54 | check_deb_off(){ 55 | get_latest_new_version 56 | deb_ver=`dpkg -l|grep linux-image | awk '{print $2}' | awk -F '-' '{print $3}' | grep '4.9'` 57 | if [[ "${deb_ver}" != "" ]]; then 58 | if [[ "${deb_ver}" == "${latest_version}" ]]; then 59 | echo -e "\033[42;37m [信息] \033[0m 检测到 内核版本 已满足要求,继续..." 60 | else 61 | echo -e "\033[42;37m [错误] \033[0m 检测到 内核版本 不是最新版本,建议重新使用 bash bbr.sh 来升级内核 !" 62 | fi 63 | else 64 | echo -e "\033[41;37m [错误] \033[0m 检测到 内核版本 不支持开启BBR,请使用 bash bbr.sh install 来安装 !" && exit 1 65 | fi 66 | } 67 | # 删除其余内核 68 | del_deb(){ 69 | deb_total=`dpkg -l | grep linux-image | awk '{print $2}' | grep -v "${latest_version}" | wc -l` 70 | if [ "${deb_total}" > "1" ]; then 71 | echo -e "\033[42;37m [信息] \033[0m 检测到 ${deb_total} 个其余内核,开始卸载..." 72 | for((integer = 1; integer <= ${deb_total}; integer++)) 73 | do 74 | deb_del=`dpkg -l|grep linux-image | awk '{print $2}' | grep -v "${latest_version}" | head -${integer}` 75 | echo -e "\033[42;37m [信息] \033[0m 开始卸载 ${deb_del} 内核..." 76 | apt-get purge -y ${deb_del} 77 | echo -e "\033[42;37m [信息] \033[0m 卸载 ${deb_del} 内核卸载完成,继续..." 78 | done 79 | deb_total=`dpkg -l|grep linux-image | awk '{print $2}' | grep -v "${latest_version}" | wc -l` 80 | if [ "${deb_total}" = "0" ]; then 81 | echo -e "\033[42;37m [信息] \033[0m 内核卸载完毕,继续..." 82 | else 83 | echo -e "\033[41;37m [错误] \033[0m 内核卸载异常,请检查 !" && exit 1 84 | fi 85 | else 86 | echo -e "\033[41;37m [错误] \033[0m 检测到 内核 数量不正确,请检查 !" && exit 1 87 | fi 88 | } 89 | del_deb_over(){ 90 | del_deb 91 | update-grub 92 | read -p "需要重启VPS后,才能开启BBR,是否现在重启 ? [Y/n] :" yn 93 | echo -e "\033[42;37m [注意] \033[0m 重启VPS后,请重新运行脚本开启BBR \033[42;37m bash bbr.sh start \033[0m" 94 | [ -z "${yn}" ] && yn="y" 95 | if [[ $yn == [Yy] ]]; then 96 | echo -e "\033[41;37m [信息] \033[0m VPS 重启中..." 97 | reboot 98 | fi 99 | } 100 | # 安装BBR 101 | installbbr(){ 102 | # 系统判断 103 | check_sys 104 | if [[ ${release} != "debian" ]]; then 105 | if [[ ${release} != "ubuntu" ]]; then 106 | echo -e "\033[41;37m [错误] \033[0m 本脚本不支持当前系统 !" && exit 1 107 | fi 108 | fi 109 | get_latest_version 110 | deb_ver=`dpkg -l|grep linux-image | awk '{print $2}' | awk -F '-' '{print $3}' | grep '4.9'` 111 | if [ "${deb_ver}" != "" ]; then 112 | if [ "${deb_ver}" == "${latest_version}" ]; then 113 | echo -e "\033[42;37m [信息] \033[0m 检测到 当前内核版本 已是最新版本,无需继续安装 !" 114 | deb_total=`dpkg -l|grep linux-image | awk '{print $2}' | grep -v "${latest_version}" | wc -l` 115 | if [ "${deb_total}" != "0" ]; then 116 | echo -e "\033[41;37m [信息] \033[0m 检测到内核数量异常,存在多余内核,开始删除..." 117 | del_deb_over 118 | else 119 | exit 1 120 | fi 121 | else 122 | echo -e "\033[42;37m [信息] \033[0m 检测到 当前内核版本 不是最新版本,升级内核..." 123 | fi 124 | else 125 | echo -e "\033[42;37m [信息] \033[0m 检测到 当前内核版本 不支持开启BBR,开始安装..." 126 | virt=`virt-what` 127 | if [[ ${virt} = "" ]]; then 128 | apt-get update && apt-get install virt-what -y 129 | virt=`virt-what` 130 | fi 131 | if [[ ${virt} = "openvz" ]]; then 132 | echo -e "\033[41;37m [错误] \033[0m BBR 不支持 OpenVZ 虚拟化 !" && exit 1 133 | fi 134 | fi 135 | #修改DNS为8.8.8.8 136 | echo "nameserver 8.8.8.8" > /etc/resolv.conf 137 | echo "nameserver 8.8.4.4" >> /etc/resolv.conf 138 | 139 | wget -N -O ${deb_kernel_name} "${deb_kernel_url}" 140 | if [ -s ${deb_kernel_name} ]; then 141 | echo -e "\033[42;37m [信息] \033[0m 内核文件下载成功,开始安装内核..." 142 | dpkg -i ${deb_kernel_name} 143 | else 144 | echo -e "\033[41;37m [错误] \033[0m 内核文件下载失败,请检查 !" && exit 1 145 | fi 146 | #判断内核是否安装成功 147 | deb_ver=`dpkg -l | grep linux-image | awk '{print $2}' | awk -F '-' '{print $3}' | grep "${latest_version}"` 148 | if [ "${deb_ver}" != "" ]; then 149 | echo -e "\033[42;37m [信息] \033[0m 检测到 内核 已安装成功,开始卸载其余内核..." 150 | del_deb_over 151 | else 152 | echo -e "\033[41;37m [错误] \033[0m 检测到 内核版本 安装失败,请检查 !" && exit 1 153 | fi 154 | } 155 | bbrstatus(){ 156 | check_bbr_status_on=`sysctl net.ipv4.tcp_available_congestion_control | awk '{print $3}'` 157 | if [ "${check_bbr_status_on}" = "bbr" ]; then 158 | echo -e "\033[42;37m [信息] \033[0m 检测到 BBR 已开启 !" 159 | # 检查是否启动BBR 160 | check_bbr_status_off=`lsmod | grep bbr` 161 | if [ "${check_bbr_status_off}" = "" ]; then 162 | echo -e "\033[41;37m [错误] \033[0m 检测到 BBR 已开启但未正常启动,请检查 !" 163 | else 164 | echo -e "\033[42;37m [信息] \033[0m 检测到 BBR 已开启并已正常启动 !" 165 | fi 166 | exit 1 167 | fi 168 | } 169 | # 开启BBR 170 | startbbr(){ 171 | # 检查是否安装 172 | check_deb_off 173 | # 检查是否开启BBR 174 | bbrstatus 175 | # 如果原来添加的有全部删除 176 | sed -i '/net\.core\.default_qdisc=fq/d' /etc/sysctl.conf 177 | sed -i '/net\.ipv4\.tcp_congestion_control=bbr/d' /etc/sysctl.conf 178 | 179 | echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf 180 | echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf 181 | sysctl -p 182 | sleep 1s 183 | bbrstatus 184 | echo -e "\033[41;37m [错误] \033[0m BBR 启动失败,请检查 !" 185 | } 186 | # 关闭BBR 187 | stopbbr(){ 188 | # 检查是否安装 189 | check_deb_off 190 | sed -i '/net\.core\.default_qdisc=fq/d' /etc/sysctl.conf 191 | sed -i '/net\.ipv4\.tcp_congestion_control=bbr/d' /etc/sysctl.conf 192 | sysctl -p 193 | sleep 1s 194 | 195 | read -p "需要重启VPS后,才能彻底停止BBR,是否现在重启 ? [Y/n] :" yn 196 | [ -z "${yn}" ] && yn="y" 197 | if [[ $yn == [Yy] ]]; then 198 | echo -e "\033[41;37m [信息] \033[0m VPS 重启中..." 199 | reboot 200 | fi 201 | } 202 | # 查看BBR状态 203 | statusbbr(){ 204 | # 检查是否安装 205 | check_deb_off 206 | bbrstatus 207 | echo -e "\033[41;37m [错误] \033[0m BBR 未开启 !" 208 | } 209 | 210 | action=$1 211 | [ -z $1 ] && action=install 212 | case "$action" in 213 | install|start|stop|status) 214 | ${action}bbr 215 | ;; 216 | *) 217 | echo "输入错误 !" 218 | echo "用法: { install | start | stop | status }" 219 | ;; 220 | esac -------------------------------------------------------------------------------- /cloudt.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 3 | export PATH 4 | 5 | #================================================= 6 | # System Required: CentOS/Debian/Ubuntu 7 | # Description: Cloud Torrent 8 | # Version: 1.0.5 9 | # Author: Toyo 10 | # Blog: https://doub.io/wlzy-12/ 11 | #================================================= 12 | 13 | file="/etc/cloudtorrent" 14 | ct_file="/etc/cloudtorrent/cloud-torrent" 15 | dl_file="/etc/cloudtorrent/downloads" 16 | ct_config="/etc/cloudtorrent/cloud-torrent.json" 17 | 18 | #检查系统 19 | check_sys(){ 20 | if [[ -f /etc/redhat-release ]]; then 21 | release="centos" 22 | elif cat /etc/issue | grep -q -E -i "debian"; then 23 | release="debian" 24 | elif cat /etc/issue | grep -q -E -i "ubuntu"; then 25 | release="ubuntu" 26 | elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then 27 | release="centos" 28 | elif cat /proc/version | grep -q -E -i "debian"; then 29 | release="debian" 30 | elif cat /proc/version | grep -q -E -i "ubuntu"; then 31 | release="ubuntu" 32 | elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then 33 | release="centos" 34 | fi 35 | bit=`uname -m` 36 | } 37 | #检查版本 38 | check_ver(){ 39 | check_sys 40 | ct_ver_new=`curl -m 10 -s "https://github.com/jpillora/cloud-torrent/releases/latest" | perl -e 'while($_=<>){ /\/tag\/(.*)\">redirected/; print $1;}'` 41 | [ ! -e "/etc/cloudtorrent/ct_ver.txt" ] && echo "${ct_ver_new}" > /etc/cloudtorrent/ct_ver.txt 42 | ct_ver_now=`cat /etc/cloudtorrent/ct_ver.txt` 43 | 44 | if [ ${ct_ver_now} != ${ct_ver_new} ]; then 45 | echo -e "\033[42;37m [信息] \033[0m 发现 Cloud Torrent 已有新版本 [ ${ct_ver_new} ] !" 46 | read -p "是否更新 ? [Y/n] :" yn1 47 | [ -z "${yn1}" ] && yn1="y" 48 | if [[ $yn1 == [Yy] ]]; then 49 | # 停止CT 50 | PID=`ps -ef | grep cloud-torrent | grep -v grep | awk '{print $2}'` 51 | kill -9 ${PID} 52 | cd ${file} 53 | # 判断位数下载对应版本 54 | if [ ${bit} == "x86_64" ]; then 55 | wget -N -O cloud-torrent.gz "https://github.com/jpillora/cloud-torrent/releases/download/${ct_ver}/cloud-torrent_linux_amd64.gz" 56 | elif [ ${bit} == "i386" ]; then 57 | wget -N -O cloud-torrent.gz "https://github.com/jpillora/cloud-torrent/releases/download/${ct_ver}/cloud-torrent_linux_386.gz" 58 | else 59 | echo -e "\033[41;37m [错误] \033[0m 不支持 ${bit} !" 60 | exit 1 61 | fi 62 | # 判断是否下载成功 63 | if [ ! -e "cloud-torrent.gz" ]; then 64 | echo -e "\033[41;37m [错误] \033[0m Cloud Torrent 下载失败 !" 65 | exit 1 66 | fi 67 | gzip -d cloud-torrent.gz 68 | chmod +x cloud-torrent 69 | #curl i.jpillora.com/cloud-torrent | bash 70 | echo "${ct_ver}" > ct_ver.txt 71 | startct 72 | fi 73 | fi 74 | } 75 | # 安装CT 76 | installct(){ 77 | # 判断是否安装CT 78 | if [ -e ${ct_file} ]; then 79 | echo -e "\033[41;37m [错误] \033[0m 检测到 Cloud Torrent 已安装,如需继续,请先卸载 !" 80 | exit 1 81 | fi 82 | check_sys 83 | # 系统判断 84 | if [ ${release} == "centos" ]; then 85 | yum update 86 | yum install -y vim curl gzip 87 | else 88 | apt-get update 89 | apt-get install -y vim curl gzip 90 | fi 91 | #修改DNS为8.8.8.8 92 | echo "nameserver 8.8.8.8" > /etc/resolv.conf 93 | echo "nameserver 8.8.4.4" >> /etc/resolv.conf 94 | 95 | mkdir ${file} 96 | mkdir ${dl_file} 97 | cd ${file} 98 | read -p "请输入要安装的 Cloud Torrent 版本号,回车则自动获取最新版本 [ 格式 x.x.xx ] :" ct_ver 99 | [ -z "${ct_ver}" ] && ct_ver=`curl -m 10 -s "https://github.com/jpillora/cloud-torrent/releases/latest" | perl -e 'while($_=<>){ /\/tag\/(.*)\">redirected/; print $1;}'` 100 | if [ ${bit} == "x86_64" ]; then 101 | wget -N -O cloud-torrent.gz "https://github.com/jpillora/cloud-torrent/releases/download/${ct_ver}/cloud-torrent_linux_amd64.gz" 102 | elif [ ${bit} == "i386" ]; then 103 | wget -N -O cloud-torrent.gz "https://github.com/jpillora/cloud-torrent/releases/download/${ct_ver}/cloud-torrent_linux_386.gz" 104 | else 105 | echo -e "\033[41;37m [错误] \033[0m 不支持 ${bit} !" && exit 1 106 | fi 107 | # 判断是否下载成功 108 | [ ! -e "cloud-torrent.gz" ] && echo -e "\033[41;37m [错误] \033[0m Cloud Torrent 下载失败 !" && exit 1 109 | gzip -d cloud-torrent.gz 110 | chmod +x cloud-torrent 111 | #curl i.jpillora.com/cloud-torrent | bash 112 | echo "${ct_ver}" > ct_ver.txt 113 | startct 114 | } 115 | startct(){ 116 | # 判断进程是否存在 117 | PID=`ps -ef | grep cloud-torrent | grep -v grep | awk '{print $2}'` 118 | [ ! -z $PID ] && echo -e "\033[41;37m [错误] \033[0m Cloud Torrent 进程正在运行,请检查 !" && exit 1 119 | # 判断是否安装CT 120 | [ ! -e ${ct_file} ] && echo -e "\033[41;37m [错误] \033[0m Cloud Torrent 没有安装,请检查 !" && exit 1 121 | check_ver 122 | cd ${file} 123 | # 设置端口 124 | while true 125 | do 126 | echo -e "请输入 Cloud Torrent 监听端口 [1-65535]" 127 | read -p "(默认端口: 8000):" ctport 128 | [ -z "$ctport" ] && ctport="8000" 129 | expr ${ctport} + 0 &>/dev/null 130 | if [ $? -eq 0 ]; then 131 | if [ ${ctport} -ge 1 ] && [ ${ctport} -le 65535 ]; then 132 | echo 133 | echo "========================" 134 | echo -e " 端口 : \033[41;37m ${ctport} \033[0m" 135 | echo "========================" 136 | echo 137 | break 138 | else 139 | echo "输入错误, 请输入正确的端口。" 140 | fi 141 | else 142 | echo "输入错误, 请输入正确的端口。" 143 | fi 144 | done 145 | read -p "是否设置 用户名和密码 ? [Y/n] :" yn 146 | [ -z "${yn}" ] && yn="y" 147 | if [[ $yn == [Yy] ]]; then 148 | echo "请输入用户名" 149 | read -p "(默认用户名: user):" ctuser 150 | [ -z "${ctuser}" ] && ctuser="user" 151 | echo 152 | echo "========================" 153 | echo -e " 用户名 : \033[41;37m ${ctuser} \033[0m" 154 | echo "========================" 155 | echo 156 | 157 | echo "请输入用户名的密码" 158 | read -p "(默认密码: doub.io):" ctpasswd 159 | [ -z "${ctpasswd}" ] && ctpasswd="doub.io" 160 | echo 161 | echo "========================" 162 | echo -e " 密码 : \033[41;37m ${ctpasswd} \033[0m" 163 | echo "========================" 164 | echo 165 | 166 | ./cloud-torrent -p ${ctport} -l -a ${ctuser}:${ctpasswd}>> ct.log 2>&1 & 167 | else 168 | ./cloud-torrent -p ${ctport} -l >> ct.log 2>&1 & 169 | fi 170 | sleep 2s 171 | PID=`ps -ef | grep cloud-torrent | grep -v grep | awk '{print $2}'` 172 | if [ -z $PID ]; then 173 | echo -e "\033[41;37m [错误] \033[0m Cloud Torrent 启动失败 !" && exit 1 174 | else 175 | iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ctport} -j ACCEPT 176 | iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ctport} -j ACCEPT 177 | IncomingPort=`cat ${ct_config} | sed -n "7p" | awk -F ": " '{print $NF}' ` 178 | iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${IncomingPort} -j ACCEPT 179 | iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${IncomingPort} -j ACCEPT 180 | iptables -I OUTPUT -m state --state NEW -m tcp -p tcp --dport ${IncomingPort} -j ACCEPT 181 | iptables -I OUTPUT -m state --state NEW -m udp -p udp --dport ${IncomingPort} -j ACCEPT 182 | # 获取IP 183 | ip=`curl -m 10 -s http://members.3322.org/dyndns/getip` 184 | [ -z $ip ] && ip="VPS_IP" 185 | echo 186 | echo "Cloud torrent 已启动 !" 187 | echo -e "浏览器访问,地址: \033[41;37m http://${ip}:${ctport} \033[0m " 188 | echo 189 | fi 190 | } 191 | stopct(){ 192 | # 判断进程是否存在 193 | PID=`ps -ef | grep cloud-torrent | grep -v grep | awk '{print $2}'` 194 | [ -z $PID ] && echo -e "\033[41;37m [错误] \033[0m 没有发现 Cloud Torrent 进程运行,请检查 !" && exit 1 195 | IncomingPort=`cat ${ct_config} | sed -n "7p" | awk -F ": " '{print $NF}' ` 196 | iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${IncomingPort} -j ACCEPT 197 | iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${IncomingPort} -j ACCEPT 198 | iptables -D OUTPUT -m state --state NEW -m tcp -p tcp --dport ${IncomingPort} -j ACCEPT 199 | iptables -D OUTPUT -m state --state NEW -m udp -p udp --dport ${IncomingPort} -j ACCEPT 200 | port=`netstat -lntp | grep "${PID}" | awk '{print $4}' | awk -F ":" '{print $NF}' | sed -n "1p"` 201 | [[ ${port} = ${IncomingPort} ]] && port=`netstat -lntp | grep "${PID}" | awk '{print $4}' | awk -F ":" '{print $NF}' | sed -n "2p"` 202 | iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT 203 | iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT 204 | 205 | kill -9 ${PID} 206 | sleep 2s 207 | PID=`ps -ef | grep cloud-torrent | grep -v grep | awk '{print $2}'` 208 | if [ ! -z $PID ]; then 209 | echo -e "\033[41;37m [错误] \033[0m Cloud Torrent 停止失败 !" && exit 1 210 | else 211 | echo 212 | echo "Cloud torrent 已停止 !" 213 | echo 214 | fi 215 | } 216 | # 查看日志 217 | tailct(){ 218 | # 判断日志是否存在 219 | if [ ! -e ${file}"/ct.log" ]; then 220 | echo -e "\033[41;37m [错误] \033[0m Cloud Torrent 日志文件不存在 !" && exit 1 221 | else 222 | tail -f /etc/cloudtorrent/ct.log 223 | fi 224 | } 225 | autoct(){ 226 | if [ ! -e ${ct_file} ]; then 227 | echo -e "\033[42;37m [信息] \033[0m Cloud Torrent 没有安装,开始安装 !" 228 | installct 229 | else 230 | PID=`ps -ef | grep cloud-torrent | grep -v grep | awk '{print $2}'` 231 | if [ -z $PID ]; then 232 | echo -e "\033[42;37m [信息] \033[0m Cloud Torrent 没有启动,开始启动 !" 233 | startct 234 | else 235 | echo "Cloud Torrent 正在运行,是否停止 ? (y/N)" 236 | echo 237 | read -p "(默认: n):" autoyn 238 | [ -z ${autoyn} ] && autoyn="n" 239 | if [[ ${autoyn} == [Yy] ]]; then 240 | stopct 241 | fi 242 | fi 243 | fi 244 | } 245 | uninstallct(){ 246 | # 检查是否安装 247 | [ ! -e ${file} ] && echo -e "\033[41;37m [错误] \033[0m Cloud Torrent 没有安装,请检查 !" && exit 1 248 | echo "确定要卸载 Cloud Torrent ? (y/N)" 249 | echo 250 | read -p "(默认: n):" unyn 251 | [ -z ${unyn} ] && unyn="n" 252 | if [[ ${unyn} == [Yy] ]]; then 253 | PID=`ps -ef | grep cloud-torrent | grep -v grep | awk '{print $2}'` 254 | [ ! -z $PID ] && kill -9 ${PID} 255 | rm -rf ${file} 256 | echo 257 | echo "Cloud torrent 卸载完成 !" 258 | echo 259 | else 260 | echo 261 | echo "卸载已取消..." 262 | echo 263 | fi 264 | } 265 | 266 | action=$1 267 | [ -z $1 ] && action=auto 268 | case "$action" in 269 | auto|install|start|stop|tail|uninstall) 270 | ${action}ct 271 | ;; 272 | *) 273 | echo "输入错误 !" 274 | echo "用法: {install | start | stop | tail | uninstall}" 275 | ;; 276 | esac -------------------------------------------------------------------------------- /gogo.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/java/jre/bin:~/bin 3 | export PATH 4 | 5 | #================================================= 6 | # System Required: CentOS/Debian/Ubuntu 7 | # Description: GoGo Server 8 | # Version: 1.0.0 9 | # Author: Toyo 10 | # Blog: https://doub.io/wlzy-24/ 11 | #================================================= 12 | 13 | gogo_directory="/etc/gogoserver" 14 | gogo_file="/etc/gogoserver/gogo-server.jar" 15 | java_directory="/usr/java" 16 | java_file="/usr/java/jre" 17 | profile_file="/etc/profile" 18 | httpsport="8443" 19 | 20 | #检查是否安装gogo 21 | check_gogo(){ 22 | [[ ! -e ${gogo_file} ]] && echo -e "\033[41;37m [错误] \033[0m 没有安装GoGo,请检查 !" && exit 1 23 | } 24 | #检查是否安装java 25 | check_java(){ 26 | java_check=`java -version` 27 | [[ -z ${java_check} ]] && echo -e "\033[41;37m [错误] \033[0m 没有安装JAVA,请检查 !" && exit 1 28 | } 29 | #检查系统 30 | check_sys(){ 31 | bit=`uname -m` 32 | } 33 | # 安装java 34 | installjava(){ 35 | mkdir ${java_directory} 36 | cd ${java_directory} 37 | check_sys 38 | # 系统判断 39 | if [ ${bit} == "x86_64" ]; then 40 | wget -N -O java.tar.gz "http://javadl.oracle.com/webapps/download/AutoDL?BundleId=216424" 41 | elif [ ${bit} == "i386" ]; then 42 | wget -N -O java.tar.gz "http://javadl.oracle.com/webapps/download/AutoDL?BundleId=216422" 43 | else 44 | echo -e "\033[41;37m [错误] \033[0m 不支持 ${bit} !" && exit 1 45 | fi 46 | tar zxvf java.tar.gz 47 | jre_file=`ls -a | grep 'jre'` 48 | mv ${jre_file} jre 49 | rm -rf java.tar.gz 50 | # 设置java环境变量 51 | echo '#set java JDK 52 | JAVA_HOME=/usr/java/jre 53 | JRE_HOME=/usr/java/jre/jre/ 54 | PATH=$PATH:$JAVA_HOME/bin:$JRE_home/bin 55 | CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar 56 | export JAVA_HOME 57 | export JRE_HOME 58 | export PATH 59 | export CLASSPATH' >> ${profile_file} 60 | source ${profile_file} 61 | #判断java是否安装成功 62 | #java_check=`java -version` 63 | #[[ -z ${java_check} ]] && echo -e "\033[41;37m [错误] \033[0m 安装 JAVA 失败,请检查 !" && exit 1 64 | } 65 | # 安装gogo 66 | installgogo(){ 67 | # 判断是否安装gogo 68 | [[ -e ${gogo_file} ]] && echo -e "\033[41;37m [错误] \033[0m 已经安装 GoGo,请检查 !" && exit 1 69 | # 判断是否安装java 70 | #java_check=`java -version` 71 | if [[ ! -e ${java_directory} ]]; then 72 | echo -e "\033[42;37m [信息] \033[0m 没有检测到安装 JAVA,开始安装..." 73 | installjava 74 | fi 75 | chmod +x /etc/rc.local 76 | mkdir ${gogo_directory} 77 | cd ${gogo_directory} 78 | wget -N -O gogo-server.jar --no-check-certificate "https://gogohome.herokuapp.com/getLatestGoGoServer" 79 | #判断gogo是否下载成功 80 | if [[ ! -e ${gogo_file} ]]; then 81 | echo -e "\033[41;37m [错误] \033[0m 下载GoGo失败,请检查 !" && exit 1 82 | else 83 | startgogo 84 | fi 85 | } 86 | setgogo(){ 87 | #设置端口 88 | while true 89 | do 90 | echo -e "请输入GoGo Server 的 HTTP监听端口 [1-65535]:" 91 | read -p "(默认端口: 8080):" httpport 92 | [ -z "$httpport" ] && httpport="8080" 93 | expr ${httpport} + 0 &>/dev/null 94 | if [ $? -eq 0 ]; then 95 | if [ ${httpport} -ge 1 ] && [ ${httpport} -le 65535 ]; then 96 | echo 97 | echo "——————————————————————————————" 98 | echo -e " 端口 : \033[41;37m ${httpport} \033[0m" 99 | echo "——————————————————————————————" 100 | echo 101 | break 102 | else 103 | echo "输入错误,请输入正确的数字 !" 104 | fi 105 | else 106 | echo "输入错误,请输入正确的数字 !" 107 | fi 108 | done 109 | } 110 | # 查看gogo列表 111 | viewgogo(){ 112 | # 检查是否安装 113 | check_gogo 114 | 115 | PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` 116 | [[ -z $PID ]] && echo -e "\033[42;37m [信息] \033[0m GoGo 没有运行 !" && exit 1 117 | 118 | gogo_http_port=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $12}'` 119 | # 获取IP 120 | ip=`curl -m 10 -s http://members.3322.org/dyndns/getip` 121 | [[ -z $ip ]] && ip="vps_ip" 122 | echo 123 | echo "——————————————————————————————" 124 | echo " GoGo Server 配置信息: " 125 | echo 126 | echo -e " 本地 IP : \033[41;37m ${ip} \033[0m" 127 | echo -e " HTTP监听端口 : \033[41;37m ${gogo_http_port} \033[0m" 128 | echo -e " HTTPS监听端口 : \033[41;37m ${httpsport} \033[0m" 129 | echo "——————————————————————————————" 130 | echo 131 | } 132 | # 启动aProxy 133 | startgogo(){ 134 | # 检查是否安装 135 | check_gogo 136 | # 判断进程是否存在 137 | PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` 138 | [[ ! -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m 发现 GoGo 正在运行,请检查 !" && exit 1 139 | cd ${gogo_directory} 140 | setgogo 141 | nohup java -Xmx300m -jar gogo-server.jar ${httpport} &>/dev/null & 142 | sleep 2s 143 | PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` 144 | [[ -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m GoGo 启动失败 !" && exit 1 145 | iptables -I INPUT -p tcp --dport ${httpport} -j ACCEPT 146 | iptables -I INPUT -p udp --dport ${httpport} -j ACCEPT 147 | iptables -I INPUT -p tcp --dport ${httpsport} -j ACCEPT 148 | iptables -I INPUT -p udp --dport ${httpsport} -j ACCEPT 149 | # 系统判断,开机启动 150 | check_sys 151 | if [[ ${release} == "debian" ]]; then 152 | sed -i '$d' /etc/rc.local 153 | echo -e "nohup java -Xmx300m -jar gogo-server.jar ${httpport} &>/dev/null &" >> /etc/rc.local 154 | echo -e "exit 0" >> /etc/rc.local 155 | else 156 | echo -e "nohup java -Xmx300m -jar gogo-server.jar ${httpport} &>/dev/null &" >> /etc/rc.local 157 | fi 158 | 159 | clear 160 | echo 161 | echo "——————————————————————————————" 162 | echo 163 | echo " GoGo 已启动 !" 164 | viewgogo 165 | } 166 | # 停止aProxy 167 | stopgogo(){ 168 | # 检查是否安装 169 | check_gogo 170 | # 判断进程是否存在 171 | PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` 172 | [[ -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m 发现 GoGo 没有运行,请检查 !" && exit 1 173 | gogo_http_port=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $12}'` 174 | sed -i "/nohup java -Xmx300m -jar gogo-server.jar ${gogo_http_port} &>\/dev\/null &/d" /etc/rc.local 175 | iptables -D INPUT -p tcp --dport ${gogo_http_port} -j ACCEPT 176 | iptables -D INPUT -p udp --dport ${gogo_http_port} -j ACCEPT 177 | iptables -D INPUT -p tcp --dport ${httpsport} -j ACCEPT 178 | iptables -D INPUT -p udp --dport ${httpsport} -j ACCEPT 179 | kill -9 ${PID} 180 | sleep 2s 181 | PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` 182 | if [[ ! -z $PID ]]; then 183 | echo -e "\033[41;37m [错误] \033[0m GoGo 停止失败 !" && exit 1 184 | else 185 | echo " GoGo 已停止 !" 186 | fi 187 | } 188 | restartgogo(){ 189 | # 检查是否安装 190 | check_gogo 191 | PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` 192 | [[ ! -z $PID ]] && stopgogo 193 | startgogo 194 | } 195 | statusgogo(){ 196 | # 检查是否安装 197 | check_gogo 198 | # 判断进程是否存在 199 | PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` 200 | if [[ ! -z $PID ]]; then 201 | echo -e "\033[42;37m [信息] \033[0m GoGo 正在运行,PID: ${PID} !" 202 | else 203 | echo -e "\033[42;37m [信息] \033[0m GoGo 没有运行 !" 204 | fi 205 | } 206 | uninstallgogo(){ 207 | # 检查是否安装 208 | check_gogo 209 | printf "确定要卸载 GoGo ? (y/N)" 210 | printf "\n" 211 | read -p "(默认: n):" unyn 212 | [[ -z ${unyn} ]] && unyn="n" 213 | if [[ ${unyn} == [Yy] ]]; then 214 | PID=`ps -ef | grep "gogo" | grep -v grep | grep -v "gogo.sh" | awk '{print $2}'` 215 | [[ ! -z $PID ]] && stopgogo 216 | rm -rf ${gogo_directory} 217 | sed -i "/nohup java -Xmx300m -jar gogo-server.jar ${gogo_http_port} &>\/dev\/null &/d" /etc/rc.local 218 | [[ -e ${gogo_directory} ]] && echo -e "\033[41;37m [错误] \033[0m GoGo卸载失败,请检查 !" && exit 1 219 | echo 220 | echo " GoGo 已卸载 !" 221 | echo 222 | else 223 | echo 224 | echo "卸载已取消..." 225 | echo 226 | fi 227 | } 228 | 229 | action=$1 230 | [[ -z $1 ]] && action=install 231 | case "$action" in 232 | install|view|start|stop|restart|status|uninstall) 233 | ${action}gogo 234 | ;; 235 | *) 236 | echo "输入错误 !" 237 | echo "用法: { install | view | start | stop | restart | status | uninstall }" 238 | ;; 239 | esac -------------------------------------------------------------------------------- /haproxy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 3 | export PATH 4 | 5 | #================================================= 6 | # System Required: CentOS/Debian/Ubuntu 7 | # Description: HaProxy 8 | # Version: 1.0.1 9 | # Author: Toyo 10 | # Blog: https://doub.io/wlzy-19/ 11 | #================================================= 12 | 13 | HaProxy_file="/etc/haproxy" 14 | HaProxy_cfg_file="/etc/haproxy/haproxy.cfg" 15 | 16 | #检查是否安装HaProxy 17 | check_HaProxy(){ 18 | HaProxy_exist=`haproxy -v` 19 | if [[ ${HaProxy_exist} = "" ]]; then 20 | echo -e "\033[41;37m [错误] \033[0m 没有安装HaProxy,请检查 !" 21 | exit 1 22 | fi 23 | } 24 | #检查系统 25 | check_sys(){ 26 | if [[ -f /etc/redhat-release ]]; then 27 | release="centos" 28 | elif cat /etc/issue | grep -q -E -i "debian"; then 29 | release="debian" 30 | elif cat /etc/issue | grep -q -E -i "ubuntu"; then 31 | release="ubuntu" 32 | elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then 33 | release="centos" 34 | elif cat /proc/version | grep -q -E -i "debian"; then 35 | release="debian" 36 | elif cat /proc/version | grep -q -E -i "ubuntu"; then 37 | release="ubuntu" 38 | elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then 39 | release="centos" 40 | fi 41 | #bit=`uname -m` 42 | } 43 | # 安装HaProxy 44 | installHaProxy(){ 45 | # 判断是否安装HaProxy 46 | HaProxy_exist=`haproxy -v` 47 | if [[ ${HaProxy_exist} != "" ]]; then 48 | echo -e "\033[41;37m [错误] \033[0m 已经安装HaProxy,请检查 !" 49 | exit 1 50 | fi 51 | check_sys 52 | # 系统判断 53 | if [[ ${release} == "centos" ]]; then 54 | yum update 55 | yum install -y vim curl haproxy 56 | else 57 | apt-get update 58 | apt-get install -y vim curl haproxy 59 | fi 60 | chmod +x /etc/rc.local 61 | #判断HaProxy是否安装成功 62 | HaProxy_exist=`haproxy -v` 63 | if [[ ${HaProxy_exist} = "" ]]; then 64 | echo -e "\033[41;37m [错误] \033[0m 安装HaProxy失败,请检查 !" 65 | exit 1 66 | else 67 | setHaProxy 68 | fi 69 | } 70 | setHaProxy(){ 71 | # 判断是否安装HaProxy 72 | check_HaProxy 73 | # 设置本地监听端口 74 | read -p "请输入 HaProxy 的 本地监听端口(转发端口) [1-65535](支持端口段: 2333-6666): " HaProxyport 75 | [[ -z "${HaProxyport}" ]] && echo "取消..." && exit 1 76 | # 设置欲转发 IP 77 | read -p "请输入 HaProxy 欲转发的 IP:" HaProxyip 78 | [[ -z "${HaProxyip}" ]] && echo "取消..." && exit 1 79 | #最后确认 80 | echo 81 | echo "——————————————————————————————" 82 | echo " 请检查 HaProxy 配置是否有误 !" 83 | echo 84 | echo -e " 本地监听端口 : \033[41;37m ${HaProxyport} \033[0m" 85 | echo -e " 欲转发 IP : \033[41;37m ${HaProxyip} \033[0m" 86 | echo "——————————————————————————————" 87 | echo 88 | read -p "请按任意键继续,如有配置错误请使用 Ctrl+C 退出。" var 89 | 90 | HaProxy_port_1=`cat ${HaProxy_cfg_file} | sed -n "13p" | cut -c 12-23 | grep "-"` 91 | HaProxy_port=`cat ${HaProxy_cfg_file} | sed -n "13p" | cut -c 12-23` 92 | if [[ ${HaProxy_port_1} = "" ]]; then 93 | iptables -D INPUT -p tcp --dport ${HaProxy_port} -j ACCEPT 94 | else 95 | HaProxy_port_1=`echo ${HaProxy_port_1} | sed 's/-/:/g'` 96 | iptables -D INPUT -p tcp --dport ${HaProxy_port_1} -j ACCEPT 97 | fi 98 | 99 | cat > ${HaProxy_cfg_file}<<-EOF 100 | global 101 | ulimit -n 51200 102 | 103 | defaults 104 | log global 105 | mode tcp 106 | option dontlognull 107 | timeout connect 5000 108 | timeout client 50000 109 | timeout server 50000 110 | 111 | frontend ss-in1 112 | bind *:${HaProxyport} 113 | default_backend ss-out1 114 | 115 | backend ss-out1 116 | server server1 ${HaProxyip} maxconn 20480 117 | EOF 118 | 119 | PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` 120 | if [[ ! -z $PID ]]; then 121 | stopHaProxy 122 | fi 123 | startHaProxy 124 | } 125 | # 查看HaProxy列表 126 | viewHaProxy(){ 127 | # 检查是否安装 128 | check_HaProxy 129 | HaProxy_port=`cat ${HaProxy_cfg_file} | sed -n "13p" | cut -c 12-23` 130 | HaProxy_ip=`cat ${HaProxy_cfg_file} | sed -n "17p" | awk '{print $3}'` 131 | # 获取IP 132 | ip=`curl -m 10 -s http://members.3322.org/dyndns/getip` 133 | if [[ -z $ip ]]; then 134 | ip="ip" 135 | fi 136 | 137 | echo 138 | echo "——————————————————————————————" 139 | echo " HaProxy 配置信息: " 140 | echo 141 | echo -e " 本地 IP : \033[41;37m ${ip} \033[0m" 142 | echo -e " 本地监听端口 : \033[41;37m ${HaProxy_port} \033[0m" 143 | echo 144 | echo -e " 欲转发 IP : \033[41;37m ${HaProxy_ip} \033[0m" 145 | echo -e " 欲转发端口 : \033[41;37m ${HaProxy_port} \033[0m" 146 | echo "——————————————————————————————" 147 | echo 148 | } 149 | # 启动aProxy 150 | startHaProxy(){ 151 | # 检查是否安装 152 | check_HaProxy 153 | # 判断进程是否存在 154 | PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` 155 | if [[ ! -z $PID ]]; then 156 | echo -e "\033[41;37m [错误] \033[0m 发现 HaProxy 正在运行,请检查 !" 157 | exit 1 158 | fi 159 | 160 | /etc/init.d/haproxy start 161 | sleep 2s 162 | PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` 163 | if [[ -z $PID ]]; then 164 | echo -e "\033[41;37m [错误] \033[0m HaProxy 启动失败 !" 165 | exit 1 166 | fi 167 | 168 | HaProxy_port_1=`cat ${HaProxy_cfg_file} | sed -n "13p" | cut -c 12-23 | grep "-"` 169 | HaProxy_port=`cat ${HaProxy_cfg_file} | sed -n "13p" | cut -c 12-23` 170 | if [[ ${HaProxy_port_1} = "" ]]; then 171 | iptables -I INPUT -p tcp --dport ${HaProxy_port} -j ACCEPT 172 | else 173 | HaProxy_port_1=`echo ${HaProxy_port_1} | sed 's/-/:/g'` 174 | iptables -I INPUT -p tcp --dport ${HaProxy_port_1} -j ACCEPT 175 | fi 176 | 177 | # 系统判断 178 | check_sys 179 | if [[ ${release} == "debian" ]]; then 180 | sed -i '$d' /etc/rc.local 181 | echo -e "/etc/init.d/haproxy start" >> /etc/rc.local 182 | echo -e "exit 0" >> /etc/rc.local 183 | else 184 | echo -e "/etc/init.d/haproxy start" >> /etc/rc.local 185 | fi 186 | 187 | clear 188 | echo 189 | echo "——————————————————————————————" 190 | echo 191 | echo " HaProxy 已启动 !" 192 | viewHaProxy 193 | } 194 | # 停止aProxy 195 | stopHaProxy(){ 196 | # 检查是否安装 197 | check_HaProxy 198 | # 判断进程是否存在 199 | PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` 200 | if [[ -z $PID ]]; then 201 | echo -e "\033[41;37m [错误] \033[0m 发现 HaProxy 没有运行,请检查 !" 202 | exit 1 203 | fi 204 | sed -i '/\/etc\/init.d\/haproxy start/d' /etc/rc.local 205 | 206 | HaProxy_port_1=`cat ${HaProxy_cfg_file} | sed -n "13p" | cut -c 12-23 | grep "-"` 207 | HaProxy_port=`cat ${HaProxy_cfg_file} | sed -n "13p" | cut -c 12-23` 208 | if [[ ${HaProxy_port_1} = "" ]]; then 209 | iptables -D INPUT -p tcp --dport ${HaProxy_port} -j ACCEPT 210 | else 211 | HaProxy_port_1=`echo ${HaProxy_port_1} | sed 's/-/:/g'` 212 | iptables -D INPUT -p tcp --dport ${HaProxy_port_1} -j ACCEPT 213 | fi 214 | 215 | /etc/init.d/haproxy stop 216 | sleep 2s 217 | PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` 218 | if [[ ! -z $PID ]]; then 219 | echo -e "\033[41;37m [错误] \033[0m HaProxy 停止失败 !" 220 | exit 1 221 | else 222 | echo " HaProxy 已停止 !" 223 | fi 224 | } 225 | restartHaProxy(){ 226 | # 检查是否安装 227 | check_HaProxy 228 | 229 | PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` 230 | if [[ ! -z $PID ]]; then 231 | stopHaProxy 232 | fi 233 | startHaProxy 234 | } 235 | statusHaProxy(){ 236 | # 检查是否安装 237 | check_HaProxy 238 | # 判断进程是否存在 239 | PID=`ps -ef | grep "haproxy" | grep -v grep | grep -v "haproxy.sh" | awk '{print $2}'` 240 | if [[ ! -z $PID ]]; then 241 | echo -e "\033[42;37m [信息] \033[0m HaProxy 正在运行,PID: ${PID} !" 242 | else 243 | echo -e "\033[42;37m [信息] \033[0m HaProxy 没有运行 !" 244 | fi 245 | } 246 | uninstallHaProxy(){ 247 | # 检查是否安装 248 | check_HaProxy 249 | 250 | printf "确定要卸载 HaProxy ? (y/N)" 251 | printf "\n" 252 | read -p "(默认: n):" unyn 253 | [[ -z ${unyn} ]] && unyn="n" 254 | if [[ ${unyn} == [Yy] ]]; then 255 | check_sys 256 | # 系统判断 257 | if [[ ${release} == "centos" ]]; then 258 | yum remove haproxy -y 259 | else 260 | sudo apt-get remove haproxy -y 261 | sudo apt-get autoremove 262 | fi 263 | rm -rf ${HaProxy_file} 264 | HaProxy_exist=`haproxy -v` 265 | if [[ ${HaProxy_exist} != "" ]]; then 266 | echo -e "\033[41;37m [错误] \033[0m HaProxy卸载失败,请检查 !" 267 | exit 1 268 | fi 269 | echo 270 | echo " HaProxy 已卸载 !" 271 | echo 272 | else 273 | echo 274 | echo "卸载已取消..." 275 | echo 276 | fi 277 | } 278 | 279 | action=$1 280 | [[ -z $1 ]] && action=install 281 | case "$action" in 282 | install|set|view|start|stop|restart|status|uninstall) 283 | ${action}HaProxy 284 | ;; 285 | *) 286 | echo "输入错误 !" 287 | echo "用法: { install | view | set | start | stop | restart | status | uninstall }" 288 | ;; 289 | esac -------------------------------------------------------------------------------- /iptables-pf.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 3 | export PATH 4 | 5 | #================================================= 6 | # System Required: CentOS/Debian/Ubuntu 7 | # Description: iptables Port forwarding 8 | # Version: 1.0.0 9 | # Author: Toyo 10 | # Blog: https://doub.io/wlzy-20/ 11 | #================================================= 12 | 13 | #检查是否安装iptables 14 | check_iptables(){ 15 | iptables_exist=`iptables -V` 16 | if [[ ${iptables_exist} = "" ]]; then 17 | echo -e "\033[41;37m [错误] \033[0m 没有安装iptables,请检查 !" 18 | exit 1 19 | fi 20 | } 21 | #检查系统 22 | check_sys(){ 23 | if [[ -f /etc/redhat-release ]]; then 24 | release="centos" 25 | elif cat /etc/issue | grep -q -E -i "debian"; then 26 | release="debian" 27 | elif cat /etc/issue | grep -q -E -i "ubuntu"; then 28 | release="ubuntu" 29 | elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then 30 | release="centos" 31 | elif cat /proc/version | grep -q -E -i "debian"; then 32 | release="debian" 33 | elif cat /proc/version | grep -q -E -i "ubuntu"; then 34 | release="ubuntu" 35 | elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then 36 | release="centos" 37 | fi 38 | #bit=`uname -m` 39 | } 40 | # 安装iptables 41 | installiptables(){ 42 | # 判断是否安装iptables 43 | iptables_exist=`iptables -V` 44 | if [[ ${iptables_exist} != "" ]]; then 45 | echo -e "\033[41;37m [错误] \033[0m 已经安装iptables,请检查 !" 46 | exit 1 47 | fi 48 | check_sys 49 | # 系统判断 50 | if [[ ${release} == "centos" ]]; then 51 | yum update 52 | yum install -y vim curl iptables 53 | else 54 | apt-get update 55 | apt-get install -y vim curl iptables 56 | fi 57 | chmod +x /etc/rc.local 58 | echo 1 > /proc/sys/net/ipv4/ip_forward 59 | #判断iptables是否安装成功 60 | iptables_exist=`iptables -V` 61 | if [[ ${iptables_exist} = "" ]]; then 62 | echo -e "\033[41;37m [错误] \033[0m 安装iptables失败,请检查 !" 63 | exit 1 64 | else 65 | echo -e "\033[42;37m [信息] \033[0m iptables 安装/升级 完成 !" 66 | fi 67 | } 68 | addiptables(){ 69 | # 判断是否安装iptables 70 | check_iptables 71 | # 设置本地监听端口 72 | read -p "请输入 iptables 的 本地监听端口 [1-65535](支持端口段: 2333-6666): " iptablesport 73 | [[ -z "${iptablesport}" ]] && echo "取消..." && exit 1 74 | # 设置欲转发端口 75 | echo -e "请输入 iptables 欲转发的 端口 [1-65535](支持端口段: 2333-6666): " 76 | read -p "(默认端口: ${iptablesport})" iptablesport1 77 | [[ -z "${iptablesport1}" ]] && iptablesport1=${iptablesport} 78 | # 设置欲转发 IP 79 | read -p "请输入 iptables 欲转发的 IP:" iptablesip 80 | [[ -z "${iptablesip}" ]] && echo "取消..." && exit 1 81 | # 设置本地 IP 82 | ip=`curl -m 10 -s http://members.3322.org/dyndns/getip` 83 | if [[ -z $ip ]]; then 84 | read -p "无法检测到本服务器的公网IP,请输入本服务器的 公网IP:" ip 85 | [[ -z "${ip}" ]] && echo "取消..." && exit 1 86 | fi 87 | #设置 转发类型 88 | echo "请输入数字 来选择 iptables 转发类型:" 89 | echo "1. TCP" 90 | echo "2. UDP" 91 | echo "3. TCP+UDP" 92 | echo 93 | read -p "(默认: TCP+UDP):" iptablestype_num 94 | [ -z "${iptablestype_num}" ] && iptablestype_num="3" 95 | if [ ${iptablestype_num} = "1" ]; then 96 | iptablestype="TCP" 97 | elif [ ${iptablestype_num} = "2" ]; then 98 | iptablestype="UDP" 99 | elif [ ${iptablestype_num} = "3" ]; then 100 | iptablestype="TCP+UDP" 101 | else 102 | iptablestype="TCP+UDP" 103 | fi 104 | #最后确认 105 | echo 106 | echo "——————————————————————————————" 107 | echo " 请检查 iptables 端口转发规则配置是否有误 !" 108 | echo 109 | echo -e " 本地监听端口 : \033[41;37m ${iptablesport} \033[0m" 110 | echo -e " 欲转发端口 : \033[41;37m ${iptablesport1} \033[0m" 111 | echo -e " 欲转发 IP : \033[41;37m ${iptablesip} \033[0m" 112 | echo -e " 公网 IP : \033[41;37m ${ip} \033[0m" 113 | echo -e " 转发类型 : \033[41;37m ${iptablestype} \033[0m" 114 | echo "——————————————————————————————" 115 | echo 116 | read -p "请按任意键继续,如有配置错误请使用 Ctrl+C 退出。" var 117 | 118 | echo 1 > /proc/sys/net/ipv4/ip_forward 119 | 120 | iptablesport2=`echo ${iptablesport} | sed 's/-/:/g'` 121 | iptablesport3=`echo ${iptablesport1} | sed 's/-/:/g'` 122 | 123 | if [ ${iptablestype} = "TCP" ]; then 124 | iptables -t nat -A PREROUTING -p tcp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 125 | iptables -t nat -A POSTROUTING -p tcp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip} 126 | sleep 1s 127 | # 系统判断 128 | check_sys 129 | # 加入开机启动 130 | if [[ ${release} == "debian" ]]; then 131 | sed -i '$d' /etc/rc.local 132 | echo -e "iptables -t nat -A PREROUTING -p tcp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 133 | iptables -t nat -A POSTROUTING -p tcp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip}" >> /etc/rc.local 134 | echo -e "exit 0" >> /etc/rc.local 135 | else 136 | echo -e "iptables -t nat -A PREROUTING -p tcp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 137 | iptables -t nat -A POSTROUTING -p tcp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip}" >> /etc/rc.local 138 | fi 139 | # 开放防火墙端口 140 | iptables -I INPUT -p tcp --dport ${iptablesport2} -j ACCEPT 141 | service iptables save 142 | service iptables restart 143 | elif [ ${iptablestype} = "UDP" ]; then 144 | iptables -t nat -A PREROUTING -p udp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 145 | iptables -t nat -A POSTROUTING -p udp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip} 146 | sleep 1s 147 | # 系统判断 148 | check_sys 149 | # 加入开机启动 150 | if [[ ${release} == "debian" ]]; then 151 | sed -i '$d' /etc/rc.local 152 | echo -e "iptables -t nat -A PREROUTING -p udp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 153 | iptables -t nat -A POSTROUTING -p udp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip}" >> /etc/rc.local 154 | echo -e "exit 0" >> /etc/rc.local 155 | else 156 | echo -e "iptables -t nat -A PREROUTING -p udp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 157 | iptables -t nat -A POSTROUTING -p udp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip}" >> /etc/rc.local 158 | fi 159 | # 开放防火墙端口 160 | iptables -I INPUT -p udp --dport ${iptablesport2} -j ACCEPT 161 | service iptables save 162 | service iptables restart 163 | elif [ ${iptablestype} = "TCP+UDP" ]; then 164 | iptables -t nat -A PREROUTING -p tcp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 165 | iptables -t nat -A PREROUTING -p udp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 166 | iptables -t nat -A POSTROUTING -p tcp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip} 167 | iptables -t nat -A POSTROUTING -p udp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip} 168 | sleep 1s 169 | # 系统判断 170 | check_sys 171 | # 加入开机启动 172 | if [[ ${release} == "debian" ]]; then 173 | sed -i '$d' /etc/rc.local 174 | echo -e "iptables -t nat -A PREROUTING -p tcp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 175 | iptables -t nat -A PREROUTING -p udp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 176 | iptables -t nat -A POSTROUTING -p tcp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip} 177 | iptables -t nat -A POSTROUTING -p udp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip}" >> /etc/rc.local 178 | echo -e "exit 0" >> /etc/rc.local 179 | else 180 | echo -e "iptables -t nat -A PREROUTING -p tcp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 181 | iptables -t nat -A PREROUTING -p udp --dport ${iptablesport2} -j DNAT --to-destination ${iptablesip}:${iptablesport1} 182 | iptables -t nat -A POSTROUTING -p tcp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip} 183 | iptables -t nat -A POSTROUTING -p udp -d ${iptablesip} --dport ${iptablesport3} -j SNAT --to-source ${ip}" >> /etc/rc.local 184 | fi 185 | # 开放防火墙端口 186 | iptables -I INPUT -p tcp --dport ${iptablesport2} -j ACCEPT 187 | iptables -I INPUT -p udp --dport ${iptablesport2} -j ACCEPT 188 | service iptables save 189 | service iptables restart 190 | fi 191 | clear 192 | echo 193 | echo "——————————————————————————————" 194 | echo " iptables 端口转发规则配置完成 !" 195 | echo 196 | echo -e " 本地 IP : \033[41;37m ${ip} \033[0m" 197 | echo -e " 本地监听端口 : \033[41;37m ${iptablesport} \033[0m" 198 | echo 199 | echo -e " 欲转发 IP : \033[41;37m ${iptablesip} \033[0m" 200 | echo -e " 欲转发端口 : \033[41;37m ${iptablesport1} \033[0m" 201 | echo -e " 转发类型 : \033[41;37m ${iptablestype} \033[0m" 202 | echo "——————————————————————————————" 203 | echo 204 | } 205 | # 查看iptables列表 206 | listiptables(){ 207 | # 检查是否安装 208 | check_iptables 209 | iptables_total=`iptables -t nat -vnL PREROUTING | wc -l` 210 | iptables_total=$[ $iptables_total - 2 ] 211 | if [[ ${iptables_total} = "0" ]]; then 212 | echo -e "\033[41;37m [错误] \033[0m 没有发现 iptables 端口转发规则,请检查 !" 213 | exit 1 214 | fi 215 | iptables_list_all="" 216 | for((integer = 1; integer <= ${iptables_total}; integer++)) 217 | do 218 | iptables_type=`iptables -t nat -vnL PREROUTING | awk '{print $4}' | sed "1,2d" | sed -n "${integer}p"` 219 | iptables_listen=`iptables -t nat -vnL PREROUTING | awk '{print $11}' | sed "1,2d" | sed -n "${integer}p" | awk -F "dpt:" '{print $2}'` 220 | [[ -z ${iptables_listen} ]] && iptables_listen=`iptables -t nat -vnL PREROUTING | awk '{print $11}' | sed "1,2d" | sed -n "${integer}p" | awk -F "dpts:" '{print $2}'` 221 | iptables_fork=`iptables -t nat -vnL PREROUTING | awk '{print $12}' | sed "1,2d" | sed -n "${integer}p" | awk -F "to:" '{print $2}'` 222 | iptables_list_all=${iptables_list_all}${integer}". 类型: "${iptables_type}" 监听端口: "${iptables_listen}" 转发IP和端口: "${iptables_fork}"\n" 223 | done 224 | echo 225 | echo -e "当前有 \033[42;37m "${iptables_total}" \033[0m 个 iptables 端口转发规则。" 226 | echo -e ${iptables_list_all} 227 | } 228 | deliptables(){ 229 | # 检查是否安装 230 | check_iptables 231 | 232 | while true 233 | do 234 | # 列出 iptables 235 | listiptables 236 | read -p "请输入数字 来选择要删除的 iptables 端口转发规则:" stopiptables 237 | [[ -z "${stopiptables}" ]] && stopiptables="0" 238 | expr ${stopiptables} + 0 &>/dev/null 239 | if [[ $? -eq 0 ]]; then 240 | if [[ ${stopiptables} -ge 1 ]] && [[ ${stopiptables} -le ${iptables_total} ]]; then 241 | # 删除开机启动 242 | iptables_type_del=`iptables -t nat -vnL PREROUTING | awk '{print $4}' | sed "1,2d" | sed -n "${stopiptables}p"` 243 | iptables_listen_del=`iptables -t nat -vnL PREROUTING | awk '{print $11}' | sed "1,2d" | sed -n "${stopiptables}p" | awk -F "dpt:" '{print $2}'` 244 | [[ -z ${iptables_listen_del} ]] && iptables_listen_del=`iptables -t nat -vnL PREROUTING | awk '{print $11}' | sed "1,2d" | sed -n "${stopiptables}p" | awk -F "dpts:" '{print $2}'` 245 | iptables_fork_del=`iptables -t nat -vnL PREROUTING | awk '{print $12}' | sed "1,2d" | sed -n "${stopiptables}p" | awk -F "to:" '{print $2}'` 246 | if [[ ${iptables_type_del} = "tcp" ]]; then 247 | iptables_del_tcp_1=`echo "iptables -t nat -A PREROUTING -p tcp --dport ${iptables_listen_del} -j DNAT --to-destination ${iptables_fork_del}"` 248 | iptables_del_tcp_1_ip=`echo ${iptables_fork_del} | awk -F ":" '{print $1}'` 249 | iptables_del_tcp_1_prot=`echo ${iptables_fork_del} | awk -F ":" '{print $2}'` 250 | iptables_del_tcp_1_prot=`echo ${iptables_del_tcp_1_prot} | sed 's/-/:/g'` 251 | iptables_del_tcp_2=`echo "iptables -t nat -A POSTROUTING -p tcp -d ${iptables_del_tcp_1_ip} --dport ${iptables_del_tcp_1_prot} -j SNAT"` 252 | #echo ${iptables_del_tcp_2} 253 | sed -i "/${iptables_del_tcp_1}/d" /etc/rc.local 254 | sed -i "/${iptables_del_tcp_2}/d" /etc/rc.local 255 | else 256 | iptables_del_udp_1=`echo "iptables -t nat -A PREROUTING -p udp --dport ${iptables_listen_del} -j DNAT --to-destination ${iptables_fork_del}"` 257 | iptables_del_udp_1_ip=`echo ${iptables_fork_del} | awk -F ":" '{print $1}'` 258 | iptables_del_udp_1_prot=`echo ${iptables_fork_del} | awk -F ":" '{print $2}'` 259 | iptables_del_udp_1_prot=`echo ${iptables_del_udp_1_prot} | sed 's/-/:/g'` 260 | iptables_del_udp_2=`echo "iptables -t nat -A POSTROUTING -p udp -d ${iptables_del_udp_1_ip} --dport ${iptables_del_udp_1_prot} -j SNAT"` 261 | #echo ${iptables_del_udp_2} 262 | sed -i "/${iptables_del_udp_1}/d" /etc/rc.local 263 | sed -i "/${iptables_del_udp_2}/d" /etc/rc.local 264 | fi 265 | 266 | # 删除端口开放的防火墙规则 267 | iptables_listen_del_2=`iptables -t nat -vnL PREROUTING | awk '{print $11}' | sed "1,2d" | sed -n "${stopiptables}p" | awk -F "dpt:" '{print $2}'` 268 | [[ -z ${iptables_listen_del_2} ]] && iptables_listen_del_2=`iptables -t nat -vnL PREROUTING | awk '{print $11}' | sed "1,2d" | sed -n "${stopiptables}p" | awk -F "dpts:" '{print $2}'` 269 | iptables_type_del_2=`iptables -t nat -vnL PREROUTING | awk '{print $4}' | sed "1,2d" | sed -n "${stopiptables}p"` 270 | if [[ ${iptables_type_del_2} = "tcp" ]]; then 271 | iptables -D INPUT -p tcp --dport ${iptables_listen_del_2} -j ACCEPT 272 | else 273 | iptables -D INPUT -p udp --dport ${iptables_listen_del_2} -j ACCEPT 274 | fi 275 | service iptables save 276 | service iptables restart 277 | 278 | iptables_total=`iptables -t nat -vnL PREROUTING | wc -l` 279 | iptables_total=$[ $iptables_total - 2 ] 280 | iptables_total1=$[ $iptables_total - 1 ] 281 | 282 | iptables -t nat -D POSTROUTING ${stopiptables} 283 | iptables -t nat -D PREROUTING ${stopiptables} 284 | sleep 1s 285 | iptables_total=`iptables -t nat -vnL PREROUTING | wc -l` 286 | iptables_total=$[ $iptables_total - 2 ] 287 | #echo ${iptables_total}"+"${iptables_total1} 288 | if [[ ${iptables_total} != ${iptables_total1} ]]; then 289 | echo -e "\033[41;37m [错误] \033[0m iptables 端口转发规则 删除失败 !" 290 | exit 1 291 | else 292 | echo 293 | echo " iptables 端口转发规则已删除 !" 294 | echo 295 | fi 296 | break 297 | else 298 | echo -e "\033[41;37m [错误] \033[0m 请输入正确的数字 !" 299 | fi 300 | else 301 | echo "取消..." 302 | exit 1 303 | fi 304 | done 305 | } 306 | uninstalliptables(){ 307 | # 检查是否安装 308 | check_iptables 309 | 310 | printf "确定要清空 iptables 所有端口转发规则 ? (y/N)" 311 | printf "\n" 312 | read -p "(默认: n):" unyn 313 | [[ -z ${unyn} ]] && unyn="n" 314 | if [[ ${unyn} == [Yy] ]]; then 315 | iptables_total=`iptables -t nat -vnL PREROUTING | wc -l` 316 | iptables_total=$[ $iptables_total - 2 ] 317 | for((integer = 1; integer <= ${iptables_total}; integer++)) 318 | do 319 | iptables_fork_del_3=`iptables -t nat -vnL PREROUTING | awk '{print $12}' | sed "1,2d" | sed -n "1p" | awk -F "to:" '{print $2}'` 320 | iptables_listen_del_3=`iptables -t nat -vnL PREROUTING | awk '{print $11}' | sed "1,2d" | sed -n "1p" | awk -F "dpt:" '{print $2}'` 321 | [[ -z ${iptables_listen_del_3} ]] && iptables_listen_del_3=`iptables -t nat -vnL PREROUTING | awk '{print $11}' | sed "1,2d" | sed -n "1p" | awk -F "dpts:" '{print $2}'` 322 | iptables_type_del_3=`iptables -t nat -vnL PREROUTING | awk '{print $4}' | sed "1,2d" | sed -n "1p"` 323 | if [[ ${iptables_type_del_3} = "tcp" ]]; then 324 | iptables_del_tcp_1=`echo "iptables -t nat -A PREROUTING -p tcp --dport ${iptables_listen_del_3} -j DNAT --to-destination ${iptables_fork_del_3}"` 325 | iptables_del_tcp_1_ip=`echo ${iptables_fork_del_3} | awk -F ":" '{print $1}'` 326 | iptables_del_tcp_1_prot=`echo ${iptables_fork_del_3} | awk -F ":" '{print $2}'` 327 | iptables_del_tcp_1_prot=`echo ${iptables_del_tcp_1_prot} | sed 's/-/:/g'` 328 | iptables_del_tcp_2=`echo "iptables -t nat -A POSTROUTING -p tcp -d ${iptables_del_tcp_1_ip} --dport ${iptables_del_tcp_1_prot} -j SNAT"` 329 | sed -i "/${iptables_del_tcp_1}/d" /etc/rc.local 330 | sed -i "/${iptables_del_tcp_2}/d" /etc/rc.local 331 | 332 | iptables -D INPUT -p tcp --dport ${iptables_listen_del_3} -j ACCEPT 333 | else 334 | iptables_del_udp_1=`echo "iptables -t nat -A PREROUTING -p udp --dport ${iptables_listen_del_3} -j DNAT --to-destination ${iptables_fork_del_3}"` 335 | iptables_del_udp_1_ip=`echo ${iptables_fork_del_3} | awk -F ":" '{print $1}'` 336 | iptables_del_udp_1_prot=`echo ${iptables_fork_del_3} | awk -F ":" '{print $2}'` 337 | iptables_del_udp_1_prot=`echo ${iptables_del_udp_1_prot} | sed 's/-/:/g'` 338 | iptables_del_udp_2=`echo "iptables -t nat -A POSTROUTING -p udp -d ${iptables_del_udp_1_ip} --dport ${iptables_del_udp_1_prot} -j SNAT"` 339 | sed -i "/${iptables_del_udp_1}/d" /etc/rc.local 340 | sed -i "/${iptables_del_udp_2}/d" /etc/rc.local 341 | 342 | iptables -D INPUT -p udp --dport ${iptables_listen_del_3} -j ACCEPT 343 | fi 344 | 345 | iptables -t nat -D POSTROUTING 1 346 | iptables -t nat -D PREROUTING 1 347 | sleep 1s 348 | done 349 | service iptables save 350 | service iptables restart 351 | 352 | echo 353 | echo " iptables 已清空 所有端口转发规则 !" 354 | echo 355 | else 356 | echo 357 | echo "清空已取消..." 358 | echo 359 | fi 360 | } 361 | 362 | action=$1 363 | [[ -z $1 ]] && action=install 364 | case "$action" in 365 | install|add|del|list|uninstall) 366 | ${action}iptables 367 | ;; 368 | *) 369 | echo "输入错误 !" 370 | echo "用法: {install | add | del | list | uninstall}" 371 | ;; 372 | esac -------------------------------------------------------------------------------- /other/README.md: -------------------------------------------------------------------------------- 1 | # 一些脚本的依赖都放到这里 2 | 3 | jq-1.5.tar.gz 4 | ====== 5 | 6 | - 说明:JQ是一个Linux平台上的 JSON 格式解析器。 7 | - 依赖于此软件的脚本为:ssr.sh 8 | 9 | ### 下载安装: 10 | Debian/Ubuntu系统: 11 | ``` bash 12 | apt-get install -y build-essential 13 | wget --no-check-certificate -N "https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/other/jq-1.5.tar.gz" 14 | tar -xzf jq-1.5.tar.gz && cd jq-1.5 15 | ./configure --disable-maintainer-mode && make && make install 16 | ldconfig 17 | cd .. && rm -rf jq-1.5.tar.gz && rm -rf jq-1.5 18 | ``` 19 | -------------------------------------------------------------------------------- /other/jq-1.5.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shuuzhoou/doubi/56abc44d7a271e2a9b772d941b779ba3fbec49b0/other/jq-1.5.tar.gz -------------------------------------------------------------------------------- /pserver.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 3 | export PATH 4 | 5 | #================================================= 6 | # System Required: CentOS/Debian/Ubuntu 7 | # Description: Peerflix Server 8 | # Version: 1.0.3 9 | # Author: Toyo 10 | # Blog: https://doub.io/wlzy-13/ 11 | #================================================= 12 | 13 | node_ver="v6.9.1" 14 | node_file="/etc/node" 15 | ps_file="/etc/node/lib/node_modules/peerflix-server" 16 | 17 | #检查系统 18 | check_sys(){ 19 | if [[ -f /etc/redhat-release ]]; then 20 | release="centos" 21 | elif cat /etc/issue | grep -q -E -i "debian"; then 22 | release="debian" 23 | elif cat /etc/issue | grep -q -E -i "ubuntu"; then 24 | release="ubuntu" 25 | elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then 26 | release="centos" 27 | elif cat /proc/version | grep -q -E -i "debian"; then 28 | release="debian" 29 | elif cat /proc/version | grep -q -E -i "ubuntu"; then 30 | release="ubuntu" 31 | elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then 32 | release="centos" 33 | fi 34 | bit=`uname -m` 35 | } 36 | deliptables(){ 37 | port_total=`netstat -lntp | grep node | awk '{print $4}' | awk -F ":" '{print $4}' | wc -l` 38 | for((integer = 1; integer <= ${port_total}; integer++)) 39 | do 40 | port=`netstat -lntp | grep node | awk '{print $4}' | awk -F ":" '{print $4}' | sed -n "${integer}p"` 41 | if [ ${port} != "" ]; then 42 | iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT 43 | iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT 44 | fi 45 | done 46 | iptables -D OUTPUT -m state --state NEW -m tcp -p tcp --dport 6881 -j ACCEPT 47 | iptables -D OUTPUT -m state --state NEW -m udp -p udp --dport 6881 -j ACCEPT 48 | iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport 6881 -j ACCEPT 49 | iptables -D INPUT -m state --state NEW -m udp -p udp --dport 6881 -j ACCEPT 50 | } 51 | # 安装PS 52 | installps(){ 53 | # 判断是否安装PS 54 | if [ -e ${ps_file} ]; 55 | then 56 | echo -e "\033[41;37m [错误] \033[0m 检测到 Peerflix Server 已安装,如需继续,请先卸载 !" 57 | exit 1 58 | fi 59 | 60 | check_sys 61 | # 系统判断 62 | if [ ${release} == "centos" ]; then 63 | yum update 64 | yum install -y build-essential curl vim xz tar 65 | elif [ ${release} == "debian" ]; then 66 | apt-get update 67 | apt-get install -y build-essential curl vim xz tar 68 | elif [ ${release} == "ubuntu" ]; then 69 | sudo apt-get update 70 | sudo apt-get install -y build-essential curl vim xz tar 71 | else 72 | echo -e "\033[41;37m [错误] \033[0m 本脚本不支持当前系统 !" 73 | exit 1 74 | fi 75 | 76 | #修改DNS为8.8.8.8 77 | echo "nameserver 8.8.8.8" > /etc/resolv.conf 78 | echo "nameserver 8.8.4.4" >> /etc/resolv.conf 79 | 80 | if [ ${bit} == "x86_64" ]; then 81 | wget -N -O node.tar.xz "https://nodejs.org/dist/v6.9.1/node-v6.9.1-linux-x64.tar.xz" 82 | xz -d node.tar.xz 83 | tar -xvf node.tar -C "/etc" 84 | mv /etc/node-v6.9.1-linux-x64 ${node_file} 85 | rm -rf node.tar 86 | ln -s ${node_file}/bin/node /usr/local/bin/node 87 | ln -s ${node_file}/bin/npm /usr/local/bin/npm 88 | elif [ ${bit} == "i386" ]; then 89 | wget -N -O node.tar.xz "https://nodejs.org/dist/v6.9.1/node-v6.9.1-linux-x86.tar.xz" 90 | xz -d node.tar.xz 91 | tar -xvf node.tar -C "/etc" 92 | mv /etc/node-v6.9.1-linux-x86 ${node_file} 93 | rm -rf node.tar 94 | ln -s ${node_file}/bin/node /usr/local/bin/node 95 | ln -s ${node_file}/bin/npm /usr/local/bin/npm 96 | else 97 | echo -e "\033[41;37m [错误] \033[0m 不支持 ${bit} !" 98 | exit 1 99 | fi 100 | 101 | npm install -g peerflix-server 102 | 103 | # 判断是否下载成功 104 | if [ ! -e ${ps_file} ]; then 105 | echo -e "\033[41;37m [错误] \033[0m Peerflix Server 安装失败 !" 106 | exit 1 107 | fi 108 | startps 109 | } 110 | startps(){ 111 | # 检查是否安装 112 | if [ ! -e ${ps_file} ]; then 113 | echo -e "\033[41;37m [错误] \033[0m Peerflix Server 没有安装,请检查 !" 114 | exit 1 115 | fi 116 | # 判断进程是否存在 117 | PID=`ps -ef | grep peerflix-server | grep -v grep | awk '{print $2}'` 118 | if [ ! -z $PID ]; then 119 | echo -e "\033[41;37m [错误] \033[0m Peerflix Server 进程正在运行,请检查 !" 120 | exit 1 121 | fi 122 | 123 | #设置端口 124 | while true 125 | do 126 | echo -e "请输入 Peerflix Server 监听端口 [1-65535]" 127 | read -p "(默认端口: 9000):" PORT 128 | [ -z "$PORT" ] && PORT="9000" 129 | expr ${PORT} + 0 &>/dev/null 130 | if [ $? -eq 0 ]; then 131 | if [ ${PORT} -ge 1 ] && [ ${PORT} -le 65535 ]; then 132 | echo 133 | echo "——————————————————————————————" 134 | echo -e " 端口 : \033[41;37m ${PORT} \033[0m" 135 | echo "——————————————————————————————" 136 | echo 137 | break 138 | else 139 | echo "输入错误,请输入正确的数字 !" 140 | fi 141 | else 142 | echo "输入错误,请输入正确的数字 !" 143 | fi 144 | done 145 | 146 | iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${PORT} -j ACCEPT 147 | iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${PORT} -j ACCEPT 148 | iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 6881 -j ACCEPT 149 | iptables -I INPUT -m state --state NEW -m udp -p udp --dport 6881 -j ACCEPT 150 | iptables -I OUTPUT -m state --state NEW -m tcp -p tcp --dport 6881 -j ACCEPT 151 | iptables -I OUTPUT -m state --state NEW -m udp -p udp --dport 6881 -j ACCEPT 152 | 153 | PORT=${PORT} nohup node ${ps_file}>> ${ps_file}/peerflixs.log 2>&1 & 154 | 155 | sleep 2s 156 | # 判断进程是否存在 157 | PID=`ps -ef | grep peerflix-server | grep -v grep | awk '{print $2}'` 158 | if [ -z $PID ]; then 159 | echo 160 | echo -e "\033[41;37m [错误] \033[0m Peerflix Server 启动失败 !" 161 | exit 1 162 | fi 163 | # 获取IP 164 | ip=`curl -m 10 -s http://members.3322.org/dyndns/getip` 165 | if [ -z $ip ]; then 166 | ip="ip" 167 | fi 168 | echo 169 | echo "Peerflix Server 已启动 !" 170 | echo -e "浏览器访问,地址: \033[41;37m http://${ip}:${PORT} \033[0m " 171 | echo 172 | } 173 | stopps(){ 174 | # 判断进程是否存在 175 | PID=`ps -ef | grep peerflix-server | grep -v grep | awk '{print $2}'` 176 | if [ -z $PID ]; then 177 | echo -e "\033[41;37m [错误] \033[0m 没有发现 Peerflix Server 进程运行,请检查 !" 178 | exit 1 179 | fi 180 | deliptables 181 | kill -9 ${PID} 182 | sleep 2s 183 | PID=`ps -ef | grep peerflix-server | grep -v grep | awk '{print $2}'` 184 | if [ ! -z $PID ]; 185 | then 186 | echo -e "\033[41;37m [错误] \033[0m Peerflix Server 停止失败 !" 187 | exit 1 188 | else 189 | echo 190 | echo "Peerflix Server 已停止 !" 191 | echo 192 | fi 193 | } 194 | # 查看日志 195 | tailps(){ 196 | # 判断日志是否存在 197 | if [ ! -e ${ps_file}/peerflixs.log ]; 198 | then 199 | echo -e "\033[41;37m [错误] \033[0m Peerflix Server 日志文件不存在 !" 200 | exit 1 201 | else 202 | tail -f ${ps_file}/peerflixs.log 203 | fi 204 | } 205 | autops(){ 206 | if [ ! -e ${ps_file} ]; then 207 | echo -e "\033[41;37m [错误] \033[0m Peerflix Server 没有安装,开始安装 !" 208 | installps 209 | else 210 | PID=`ps -ef | grep peerflix-server | grep -v grep | awk '{print $2}'` 211 | if [ -z $PID ]; 212 | then 213 | echo -e "\033[41;37m [错误] \033[0m Peerflix Server 没有启动,开始启动 !" 214 | startps 215 | else 216 | printf "Peerflix Server 正在运行,是否停止 ? (y/N)" 217 | printf "\n" 218 | read -p "(默认: n):" autoyn 219 | [ -z ${autoyn} ] && autoyn="n" 220 | if [[ ${autoyn} == [Yy] ]]; then 221 | stopps 222 | fi 223 | fi 224 | fi 225 | } 226 | uninstallps(){ 227 | # 检查是否安装 228 | if [ ! -e ${ps_file} ]; then 229 | echo -e "\033[41;37m [错误] \033[0m Peerflix Server 没有安装,请检查 !" 230 | exit 1 231 | fi 232 | 233 | printf "确定要卸载 Peerflix Server ? (y/N)" 234 | printf "\n" 235 | read -p "(默认: n):" unyn 236 | [ -z ${unyn} ] && unyn="n" 237 | if [[ ${unyn} == [Yy] ]]; then 238 | PID=`ps -ef | grep peerflix-server | grep -v grep | awk '{print $2}'` 239 | if [ ! -z $PID ]; then 240 | deliptables 241 | kill -9 ${PID} 242 | fi 243 | rm -rf /usr/local/bin/node 244 | rm -rf /usr/local/bin/npm 245 | rm -rf ${node_file} 246 | echo 247 | echo "Peerflix Server 卸载完成 !" 248 | echo 249 | else 250 | echo 251 | echo "卸载已取消..." 252 | echo 253 | fi 254 | } 255 | 256 | action=$1 257 | [ -z $1 ] && action=auto 258 | case "$action" in 259 | auto|install|start|stop|tail|uninstall) 260 | ${action}ps 261 | ;; 262 | *) 263 | echo "输入错误 !" 264 | echo "用法: {install | start | stop | tail | uninstall}" 265 | ;; 266 | esac -------------------------------------------------------------------------------- /pythonhttp.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 3 | export PATH 4 | 5 | #================================================= 6 | # System Required: All 7 | # Description: Python HTTP Server 8 | # Author: Toyo 9 | # Blog: https://doub.io/wlzy-8/ 10 | #================================================= 11 | 12 | sethttp(){ 13 | #设置端口 14 | while true 15 | do 16 | echo -e "请输入要开放的HTTP服务端口 [1-65535]" 17 | read -p "(默认端口: 8000):" httpport 18 | [ -z "$httpport" ] && httpport="8000" 19 | expr ${httpport} + 0 &>/dev/null 20 | if [ $? -eq 0 ]; then 21 | if [ ${httpport} -ge 1 ] && [ ${httpport} -le 65535 ]; then 22 | echo 23 | echo -e " 端口 : \033[41;37m ${httpport} \033[0m" 24 | echo 25 | break 26 | else 27 | echo "输入错误, 请输入正确的端口。" 28 | fi 29 | else 30 | echo "输入错误, 请输入正确的端口。" 31 | fi 32 | done 33 | #设置目录 34 | echo "请输入要开放的目录(绝对路径)" 35 | read -p "(直接回车, 默认当前文件夹):" httpfile 36 | if [ ! -z $httpfile ]; then 37 | [ ! -e $httpfile ] && echo -e "\033[41;37m [错误] \033[0m 输入的目录不存在 或 当前用户无权限访问, 请检查!" && exit 1 38 | else 39 | httpfile=`echo $PWD` 40 | fi 41 | #最后确认 42 | echo 43 | echo "========================" 44 | echo " 请检查配置是否正确 !" 45 | echo 46 | echo -e " 端口 : \033[41;37m ${httpport} \033[0m" 47 | echo -e " 目录 : \033[41;37m ${httpfile} \033[0m" 48 | echo "========================" 49 | echo 50 | read -p "按任意键继续,如有错误,请使用 Ctrl + C 退出." var 51 | } 52 | iptables_add(){ 53 | iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${httpport} -j ACCEPT 54 | iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${httpport} -j ACCEPT 55 | } 56 | iptables_del(){ 57 | iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT 58 | iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT 59 | } 60 | starthttp(){ 61 | PID=`ps -ef | grep SimpleHTTPServer | grep -v grep | awk '{print $2}'` 62 | [ ! -z $PID ] && echo -e "\033[41;37m [错误] \033[0m SimpleHTTPServer 正着运行,请检查 !" && exit 1 63 | sethttp 64 | iptables_add 65 | cd ${httpfile} 66 | nohup python -m SimpleHTTPServer $httpport >> httpserver.log 2>&1 & 67 | sleep 2s 68 | PID=`ps -ef | grep SimpleHTTPServer | grep -v grep | awk '{print $2}'` 69 | if [ -z $PID ]; then 70 | echo -e "\033[41;37m [错误] \033[0m SimpleHTTPServer 启动失败 !" && exit 1 71 | else 72 | ip=`curl -m 10 -s http://members.3322.org/dyndns/getip` 73 | [ -z "$ip" ] && ip="VPS_IP" 74 | echo 75 | echo "HTTP服务 已启动 !" 76 | echo -e "浏览器访问,地址: \033[41;37m http://${ip}:${httpport} \033[0m " 77 | echo 78 | fi 79 | } 80 | stophttp(){ 81 | PID=`ps -ef | grep SimpleHTTPServer | grep -v grep | awk '{print $2}'` 82 | [ -z $PID ] && echo -e "\033[41;37m [错误] \033[0m 没有发现 SimpleHTTPServer 进程运行,请检查 !" && exit 1 83 | port=`netstat -lntp | grep ${PID} | awk '{print $4}' | awk -F ":" '{print $2}'` 84 | iptables_del 85 | kill -9 ${PID} 86 | sleep 2s 87 | PID=`ps -ef | grep SimpleHTTPServer | grep -v grep | awk '{print $2}'` 88 | if [ ! -z $PID ]; then 89 | echo -e "\033[41;37m [错误] \033[0m SimpleHTTPServer 停止失败 !" && exit 1 90 | else 91 | echo 92 | echo "HTTP服务 已停止 !" 93 | echo 94 | fi 95 | } 96 | 97 | action=$1 98 | [ -z $1 ] && action=start 99 | case "$action" in 100 | start|stop) 101 | ${action}http 102 | ;; 103 | *) 104 | echo "输入错误 !" 105 | echo "用法: {start|stop}" 106 | ;; 107 | esac -------------------------------------------------------------------------------- /socat.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 3 | export PATH 4 | 5 | #================================================= 6 | # System Required: CentOS/Debian/Ubuntu 7 | # Description: Socat 8 | # Version: 1.0.1 9 | # Author: Toyo 10 | # Blog: https://doub.io/wlzy-18/ 11 | #================================================= 12 | 13 | socat_file="/etc/socat" 14 | socat_log_file="/etc/socat/socat.log" 15 | 16 | #检查是否安装Socat 17 | check_socat(){ 18 | socat_exist=`socat -h` 19 | if [[ ${socat_exist} = "" ]]; then 20 | echo -e "\033[41;37m [错误] \033[0m 没有安装Socat,请检查 !" 21 | exit 1 22 | fi 23 | } 24 | #检查系统 25 | check_sys(){ 26 | if [[ -f /etc/redhat-release ]]; then 27 | release="centos" 28 | elif cat /etc/issue | grep -q -E -i "debian"; then 29 | release="debian" 30 | elif cat /etc/issue | grep -q -E -i "ubuntu"; then 31 | release="ubuntu" 32 | elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then 33 | release="centos" 34 | elif cat /proc/version | grep -q -E -i "debian"; then 35 | release="debian" 36 | elif cat /proc/version | grep -q -E -i "ubuntu"; then 37 | release="ubuntu" 38 | elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then 39 | release="centos" 40 | fi 41 | #bit=`uname -m` 42 | } 43 | # 安装Socat 44 | installSocat(){ 45 | # 判断是否安装Socat 46 | socat_exist=`socat -h` 47 | if [[ ${socat_exist} != "" ]]; then 48 | echo -e "\033[41;37m [错误] \033[0m 已经安装Socat,请检查 !" 49 | exit 1 50 | fi 51 | check_sys 52 | # 系统判断 53 | if [[ ${release} == "centos" ]]; then 54 | yum update 55 | yum install -y vim curl socat 56 | else 57 | apt-get update 58 | apt-get install -y vim curl socat 59 | fi 60 | chmod +x /etc/rc.local 61 | #修改DNS为8.8.8.8 62 | echo "nameserver 8.8.8.8" > /etc/resolv.conf 63 | echo "nameserver 8.8.4.4" >> /etc/resolv.conf 64 | mkdir ${socat_file} 65 | #判断socat是否安装成功 66 | socat_exist=`socat -h` 67 | if [[ ${socat_exist} = "" ]]; then 68 | echo -e "\033[41;37m [错误] \033[0m 安装Socat失败,请检查 !" 69 | exit 1 70 | else 71 | echo -e "\033[42;37m [信息] \033[0m Socat 安装完成 !" 72 | fi 73 | } 74 | addSocat(){ 75 | # 判断是否安装Socat 76 | check_socat 77 | # 设置本地监听端口 78 | while true 79 | do 80 | echo -e "请输入 Socat 的 本地监听端口 [1-65535]" 81 | read -p "(默认端口: 23333):" Socatport 82 | [[ -z "$Socatport" ]] && Socatport="23333" 83 | expr ${Socatport} + 0 &>/dev/null 84 | if [[ $? -eq 0 ]]; then 85 | if [[ ${Socatport} -ge 1 ]] && [[ ${Socatport} -le 65535 ]]; then 86 | echo 87 | echo "——————————————————————————————" 88 | echo -e " 本地监听端口 : \033[41;37m ${Socatport} \033[0m" 89 | echo "——————————————————————————————" 90 | echo 91 | break 92 | else 93 | echo -e "\033[41;37m [错误] \033[0m 请输入正确的数字 !" 94 | fi 95 | else 96 | echo -e "\033[41;37m [错误] \033[0m 请输入正确的数字 !" 97 | fi 98 | done 99 | # 设置欲转发端口 100 | while true 101 | do 102 | echo -e "请输入 Socat 欲转发的 端口 [1-65535]" 103 | read -p "(默认端口: ${Socatport}):" Socatport1 104 | [[ -z "$Socatport1" ]] && Socatport1=${Socatport} 105 | expr ${Socatport1} + 0 &>/dev/null 106 | if [[ $? -eq 0 ]]; then 107 | if [[ ${Socatport1} -ge 1 ]] && [[ ${Socatport1} -le 65535 ]]; then 108 | echo 109 | echo "——————————————————————————————" 110 | echo -e " 欲转发端口 : \033[41;37m ${Socatport1} \033[0m" 111 | echo "——————————————————————————————" 112 | echo 113 | break 114 | else 115 | echo -e "\033[41;37m [错误] \033[0m 请输入正确的数字 !" 116 | fi 117 | else 118 | echo -e "\033[41;37m [错误] \033[0m 请输入正确的数字 !" 119 | fi 120 | done 121 | # 设置欲转发 IP 122 | read -p "请输入 Socat 欲转发的 IP:" socatip 123 | [[ -z "${socatip}" ]] && echo "取消..." && exit 1 124 | echo 125 | echo "——————————————————————————————" 126 | echo -e " 欲转发 IP : \033[41;37m ${socatip} \033[0m" 127 | echo "——————————————————————————————" 128 | echo 129 | #设置 转发类型 130 | echo "请输入数字 来选择 Socat 转发类型:" 131 | echo "1. TCP" 132 | echo "2. UDP" 133 | echo "3. TCP+UDP" 134 | echo 135 | read -p "(默认: TCP+UDP):" socattype_num 136 | [ -z "${socattype_num}" ] && socattype_num="3" 137 | if [ ${socattype_num} = "1" ]; then 138 | socattype="TCP" 139 | elif [ ${socattype_num} = "2" ]; then 140 | socattype="UDP" 141 | elif [ ${socattype_num} = "3" ]; then 142 | socattype="TCP+UDP" 143 | else 144 | socattype="TCP+UDP" 145 | fi 146 | #最后确认 147 | echo 148 | echo "——————————————————————————————" 149 | echo " 请检查 Socat 配置是否有误 !" 150 | echo 151 | echo -e " 本地监听端口 : \033[41;37m ${Socatport} \033[0m" 152 | echo -e " 欲转发 IP : \033[41;37m ${socatip} \033[0m" 153 | echo -e " 欲转发端口 : \033[41;37m ${Socatport1} \033[0m" 154 | echo -e " 转发类型 : \033[41;37m ${socattype} \033[0m" 155 | echo "——————————————————————————————" 156 | echo 157 | read -p "请按任意键继续,如有配置错误请使用 Ctrl+C 退出。" var 158 | 159 | if [ ${socattype} = "TCP" ]; then 160 | nohup socat TCP4-LISTEN:${Socatport},reuseaddr,fork TCP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 & 161 | sleep 2s 162 | PID=`ps -ef | grep "socat TCP4-LISTEN:${Socatport}" | grep -v grep | awk '{print $2}'` 163 | if [[ -z $PID ]]; then 164 | echo -e "\033[41;37m [错误] \033[0m Socat TCP 启动失败 !" 165 | exit 1 166 | fi 167 | # 系统判断 168 | check_sys 169 | if [[ ${release} == "debian" ]]; then 170 | sed -i '$d' /etc/rc.local 171 | echo -e "nohup socat TCP4-LISTEN:${Socatport},reuseaddr,fork TCP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local 172 | echo -e "exit 0" >> /etc/rc.local 173 | else 174 | echo -e "nohup socat TCP4-LISTEN:${Socatport},reuseaddr,fork TCP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local 175 | fi 176 | iptables -I INPUT -p tcp --dport ${Socatport} -j ACCEPT 177 | elif [ ${socattype} = "UDP" ]; then 178 | nohup socat UDP4-LISTEN:${Socatport},reuseaddr,fork UDP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 & 179 | sleep 2s 180 | PID=`ps -ef | grep "socat UDP4-LISTEN:${Socatport}" | grep -v grep | awk '{print $2}'` 181 | if [[ -z $PID ]]; then 182 | echo -e "\033[41;37m [错误] \033[0m Socat UDP 启动失败 !" 183 | exit 1 184 | fi 185 | # 系统判断 186 | check_sys 187 | if [[ ${release} == "debian" ]]; then 188 | sed -i '$d' /etc/rc.local 189 | echo -e "nohup socat UDP4-LISTEN:${Socatport},reuseaddr,fork UDP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local 190 | echo -e "exit 0" >> /etc/rc.local 191 | else 192 | echo -e "nohup socat UDP4-LISTEN:${Socatport},reuseaddr,fork UDP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local 193 | fi 194 | iptables -I INPUT -p udp --dport ${Socatport} -j ACCEPT 195 | elif [ ${socattype} = "TCP+UDP" ]; then 196 | nohup socat TCP4-LISTEN:${Socatport},reuseaddr,fork TCP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 & 197 | nohup socat UDP4-LISTEN:${Socatport},reuseaddr,fork UDP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 & 198 | sleep 2s 199 | PID=`ps -ef | grep "socat TCP4-LISTEN:${Socatport}" | grep -v grep | awk '{print $2}'` 200 | PID1=`ps -ef | grep "socat UDP4-LISTEN:${Socatport}" | grep -v grep | awk '{print $2}'` 201 | if [[ -z $PID ]]; then 202 | echo -e "\033[41;37m [错误] \033[0m Socat TCP 启动失败 !" 203 | exit 1 204 | else 205 | if [[ -z $PID ]]; then 206 | echo -e "\033[41;37m [错误] \033[0m Socat TCP 启动成功,但 UDP 启动失败 !" 207 | # 系统判断 208 | check_sys 209 | if [[ ${release} == "debian" ]]; then 210 | sed -i '$d' /etc/rc.local 211 | echo -e "nohup socat TCP4-LISTEN:${Socatport},reuseaddr,fork TCP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local 212 | echo -e "exit 0" >> /etc/rc.local 213 | else 214 | echo -e "nohup socat TCP4-LISTEN:${Socatport},reuseaddr,fork TCP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local 215 | fi 216 | exit 1 217 | iptables -I INPUT -p tcp --dport ${Socatport} -j ACCEPT 218 | fi 219 | # 系统判断 220 | check_sys 221 | if [[ ${release} == "debian" ]]; then 222 | sed -i '$d' /etc/rc.local 223 | echo -e "nohup socat TCP4-LISTEN:${Socatport},reuseaddr,fork TCP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local 224 | echo -e "nohup socat UDP4-LISTEN:${Socatport},reuseaddr,fork UDP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local 225 | echo -e "exit 0" >> /etc/rc.local 226 | else 227 | echo -e "nohup socat TCP4-LISTEN:${Socatport},reuseaddr,fork TCP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local 228 | echo -e "nohup socat UDP4-LISTEN:${Socatport},reuseaddr,fork UDP4:${socatip}:${Socatport1} >> ${socat_log_file} 2>&1 &" >> /etc/rc.local 229 | fi 230 | iptables -I INPUT -p tcp --dport ${Socatport} -j ACCEPT 231 | iptables -I INPUT -p udp --dport ${Socatport} -j ACCEPT 232 | fi 233 | fi 234 | # 获取IP 235 | ip=`curl -m 10 -s http://members.3322.org/dyndns/getip` 236 | if [[ -z $ip ]]; then 237 | ip="ip" 238 | fi 239 | clear 240 | echo 241 | echo "——————————————————————————————" 242 | echo " Socat 已启动 !" 243 | echo 244 | echo -e " 本地 IP : \033[41;37m ${ip} \033[0m" 245 | echo -e " 本地监听端口 : \033[41;37m ${Socatport} \033[0m" 246 | echo 247 | echo -e " 欲转发 IP : \033[41;37m ${socatip} \033[0m" 248 | echo -e " 欲转发端口 : \033[41;37m ${Socatport1} \033[0m" 249 | echo -e " 转发类型 : \033[41;37m ${socattype} \033[0m" 250 | echo "——————————————————————————————" 251 | echo 252 | } 253 | # 查看Socat列表 254 | listSocat(){ 255 | # 检查是否安装 256 | check_socat 257 | socat_total=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | wc -l` 258 | if [[ ${socat_total} = "0" ]]; then 259 | echo -e "\033[41;37m [错误] \033[0m 没有发现 Socat 进程运行,请检查 !" 260 | exit 1 261 | fi 262 | socat_list_all="" 263 | for((integer = 1; integer <= ${socat_total}; integer++)) 264 | do 265 | socat_type=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $9}' | sed -n "${integer}p" | cut -c 1-4` 266 | socat_listen=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $9}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /LISTEN:(.*),reuseaddr/; print $1;}'` 267 | socat_fork=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $10}' | sed -n "${integer}p" | cut -c 6-26` 268 | socat_pid=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $2}' | sed -n "${integer}p"` 269 | socat_list_all=${socat_list_all}${integer}". 进程PID: "${socat_pid}" 类型: "${socat_type}" 监听端口: "${socat_listen}" 转发IP和端口: "${socat_fork}"\n" 270 | done 271 | echo 272 | echo -e "当前有 \033[42;37m "${socat_total}" \033[0m 个Socat转发进程。" 273 | echo -e ${socat_list_all} 274 | } 275 | delSocat(){ 276 | # 检查是否安装 277 | check_socat 278 | # 判断进程是否存在 279 | PID=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $2}'` 280 | if [[ -z $PID ]]; then 281 | echo -e "\033[41;37m [错误] \033[0m 没有发现 Socat 进程运行,请检查 !" 282 | exit 1 283 | fi 284 | 285 | while true 286 | do 287 | # 列出 Socat 288 | listSocat 289 | read -p "请输入数字 来选择要终止的 Socat 进程:" stopsocat 290 | [[ -z "${stopsocat}" ]] && stopsocat="0" 291 | expr ${stopsocat} + 0 &>/dev/null 292 | if [[ $? -eq 0 ]]; then 293 | if [[ ${stopsocat} -ge 1 ]] && [[ ${stopsocat} -le ${socat_total} ]]; then 294 | # 删除开机启动 295 | socat_del_rc1=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $8}' | sed -n "${stopsocat}p"` 296 | socat_del_rc2=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $9}' | sed -n "${stopsocat}p"` 297 | socat_del_rc3=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $10}' | sed -n "${stopsocat}p"` 298 | socat_del_rc4=${socat_del_rc1}" "${socat_del_rc2}" "${socat_del_rc3} 299 | #echo ${socat_del_rc4} 300 | sed -i "/${socat_del_rc4}/d" /etc/rc.local 301 | # 删除防火墙规则 302 | socat_listen=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $9}' | sed -n "${stopsocat}p" | perl -e 'while($_=<>){ /LISTEN:(.*),reuseaddr/; print $1;}'` 303 | socat_type=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $9}' | sed -n "${stopsocat}p" | cut -c 1-4` 304 | if [[ ${socat_type} = "TCP4" ]]; then 305 | iptables -D INPUT -p tcp --dport ${socat_listen} -j ACCEPT 306 | else 307 | iptables -D INPUT -p udp --dport ${socat_listen} -j ACCEPT 308 | fi 309 | 310 | socat_total=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | wc -l` 311 | PID=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | awk '{print $2}' | sed -n "${stopsocat}p"` 312 | kill -2 ${PID} 313 | sleep 2s 314 | socat_total1=$[ $socat_total - 1 ] 315 | socat_total=`ps -ef | grep socat | grep -v grep | grep -v "socat.sh" | wc -l` 316 | if [[ ${socat_total} != ${socat_total1} ]]; then 317 | echo -e "\033[41;37m [错误] \033[0m Socat 停止失败 !" 318 | exit 1 319 | else 320 | echo 321 | echo " Socat 已停止 !" 322 | echo 323 | fi 324 | break 325 | else 326 | echo -e "\033[41;37m [错误] \033[0m 请输入正确的数字 !" 327 | fi 328 | else 329 | echo "取消..." 330 | exit 1 331 | fi 332 | done 333 | } 334 | # 查看日志 335 | tailSocat(){ 336 | # 判断日志是否存在 337 | if [[ ! -e ${socat_log_file} ]]; then 338 | echo -e "\033[41;37m [错误] \033[0m Socat 日志文件不存在 !" 339 | exit 1 340 | else 341 | tail -f ${socat_log_file} 342 | fi 343 | } 344 | uninstallSocat(){ 345 | # 检查是否安装 346 | check_socat 347 | 348 | printf "确定要卸载 Socat ? (y/N)" 349 | printf "\n" 350 | read -p "(默认: n):" unyn 351 | [[ -z ${unyn} ]] && unyn="n" 352 | if [[ ${unyn} == [Yy] ]]; then 353 | check_sys 354 | # 系统判断 355 | if [[ ${release} == "centos" ]]; then 356 | yum remove socat -y 357 | else 358 | sudo apt-get remove socat -y 359 | sudo apt-get autoremove 360 | fi 361 | rm -rf ${socat_file} 362 | socat_exist=`socat -h` 363 | if [[ ${socat_exist} != "" ]]; then 364 | echo -e "\033[41;37m [错误] \033[0m Socat卸载失败,请检查 !" 365 | exit 1 366 | fi 367 | echo 368 | echo " Socat 已卸载 !" 369 | echo 370 | else 371 | echo 372 | echo "卸载已取消..." 373 | echo 374 | fi 375 | } 376 | 377 | action=$1 378 | [[ -z $1 ]] && action=install 379 | case "$action" in 380 | install|add|del|list|tail|uninstall) 381 | ${action}Socat 382 | ;; 383 | *) 384 | echo "输入错误 !" 385 | echo "用法: {install | add | del | list | tail | uninstall}" 386 | ;; 387 | esac -------------------------------------------------------------------------------- /ssr.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 3 | export PATH 4 | 5 | #================================================= 6 | # System Required: CentOS 6/Debian/Ubuntu 14.04+ 7 | # Description: Install the ShadowsocksR server 8 | # Version: 1.2.5 9 | # Author: Toyo 10 | # Blog: https://doub.io/ss-jc42/ 11 | #================================================= 12 | 13 | #ssr_pid="/var/run/shadowsocks.pid" 14 | ssr_file="/etc/shadowsocksr" 15 | ssr_ss_file="/etc/shadowsocksr/shadowsocks/" 16 | config_file="/etc/shadowsocksr/config.json" 17 | config_user_file="/etc/shadowsocksr/user-config.json" 18 | Libsodiumr_file="/root/libsodium" 19 | Libsodiumr_ver="1.0.11" 20 | auto_restart_cron="auto_restart_cron.sh" 21 | Separator_1="——————————————————————————————" 22 | 23 | #检查系统 24 | check_sys(){ 25 | if [[ -f /etc/redhat-release ]]; then 26 | release="centos" 27 | elif cat /etc/issue | grep -q -E -i "debian"; then 28 | release="debian" 29 | elif cat /etc/issue | grep -q -E -i "ubuntu"; then 30 | release="ubuntu" 31 | elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then 32 | release="centos" 33 | elif cat /proc/version | grep -q -E -i "debian"; then 34 | release="debian" 35 | elif cat /proc/version | grep -q -E -i "ubuntu"; then 36 | release="ubuntu" 37 | elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then 38 | release="centos" 39 | fi 40 | #bit=`uname -m` 41 | } 42 | SSR_install_status(){ 43 | [[ ! -e $config_user_file ]] && echo -e "\033[41;37m [错误] \033[0m 没有发现安装ShadowsocksR,请检查 !" && exit 1 44 | } 45 | #获取IP 46 | getIP(){ 47 | ip=`curl -m 10 -s "ipinfo.io" | jq '.ip' | sed 's/^.//;s/.$//'` 48 | [[ -z "$ip" ]] && ip="VPS_IP" 49 | } 50 | #获取用户账号信息 51 | getUser(){ 52 | port=`jq '.server_port' ${config_user_file}` 53 | password=`jq '.password' ${config_user_file} | sed 's/^.//;s/.$//'` 54 | method=`jq '.method' ${config_user_file} | sed 's/^.//;s/.$//'` 55 | protocol=`jq '.protocol' ${config_user_file} | sed 's/^.//;s/.$//'` 56 | obfs=`jq '.obfs' ${config_user_file} | sed 's/^.//;s/.$//'` 57 | protocol_param=`jq '.protocol_param' ${config_user_file} | sed 's/^.//;s/.$//'` 58 | speed_limit_per_con=`jq '.speed_limit_per_con' ${config_user_file}` 59 | speed_limit_per_user=`jq '.speed_limit_per_user' ${config_user_file}` 60 | } 61 | # 设置 端口和密码 62 | set_port_pass(){ 63 | #设置端口 64 | while true 65 | do 66 | echo -e "请输入ShadowsocksR账号的 端口 [1-65535]:" 67 | read -p "(默认端口: 2333):" ssport 68 | [[ -z "$ssport" ]] && ssport="2333" 69 | expr ${ssport} + 0 &>/dev/null 70 | if [[ $? -eq 0 ]]; then 71 | if [[ ${ssport} -ge 1 ]] && [[ ${ssport} -le 65535 ]]; then 72 | echo && echo ${Separator_1} && echo -e " 端口 : \033[32m${ssport}\033[0m" && echo ${Separator_1} && echo 73 | break 74 | else 75 | echo "输入错误,请输入正确的数字 !" 76 | fi 77 | else 78 | echo "输入错误,请输入正确的数字 !" 79 | fi 80 | done 81 | #设置密码 82 | echo "请输入ShadowsocksR账号的 密码:" 83 | read -p "(默认密码: doub.io):" sspwd 84 | [[ -z "${sspwd}" ]] && sspwd="doub.io" 85 | echo && echo ${Separator_1} && echo -e " 密码 : \033[32m${sspwd}\033[0m" && echo ${Separator_1} && echo 86 | } 87 | # 设置 加密方式、协议和混淆等 88 | set_others(){ 89 | #设置加密方式 90 | echo "请输入数字 来选择ShadowsocksR账号的 加密方式:" 91 | echo " 1. rc4-md5" 92 | echo " 2. aes-128-ctr" 93 | echo " 3. aes-256-ctr" 94 | echo " 4. aes-256-cfb" 95 | echo " 5. aes-256-cfb8" 96 | echo " 6. camellia-256-cfb" 97 | echo " 7. chacha20" 98 | echo " 8. chacha20-ietf" 99 | echo -e "\033[32m 注意: \033[0mchacha20*等加密方式 需要安装 libsodium 支持库,否则会启动失败!" 100 | echo 101 | read -p "(默认加密方式: 2. aes-128-ctr):" ssmethod 102 | [[ -z "${ssmethod}" ]] && ssmethod="2" 103 | if [[ ${ssmethod} == "1" ]]; then 104 | ssmethod="rc4-md5" 105 | elif [[ ${ssmethod} == "2" ]]; then 106 | ssmethod="aes-128-ctr" 107 | elif [[ ${ssmethod} == "3" ]]; then 108 | ssmethod="aes-256-ctr" 109 | elif [[ ${ssmethod} == "4" ]]; then 110 | ssmethod="aes-256-cfb" 111 | elif [[ ${ssmethod} == "5" ]]; then 112 | ssmethod="aes-256-cfb8" 113 | elif [[ ${ssmethod} == "6" ]]; then 114 | ssmethod="camellia-256-cfb" 115 | elif [[ ${ssmethod} == "7" ]]; then 116 | ssmethod="chacha20" 117 | elif [[ ${ssmethod} == "8" ]]; then 118 | ssmethod="chacha20-ietf" 119 | else 120 | ssmethod="aes-128-ctr" 121 | fi 122 | echo && echo ${Separator_1} && echo -e " 加密方式 : \033[32m${ssmethod}\033[0m" && echo ${Separator_1} && echo 123 | #设置协议 124 | echo "请输入数字 来选择ShadowsocksR账号的 协议( auth_aes128_* 以后的协议不再支持 兼容原版 ):" 125 | echo " 1. origin" 126 | echo " 2. auth_sha1_v4" 127 | echo " 3. auth_aes128_md5" 128 | echo " 4. auth_aes128_sha1" 129 | echo 130 | read -p "(默认协议: 2. auth_sha1_v4):" ssprotocol 131 | [[ -z "${ssprotocol}" ]] && ssprotocol="2" 132 | if [[ ${ssprotocol} == "1" ]]; then 133 | ssprotocol="origin" 134 | elif [[ ${ssprotocol} == "2" ]]; then 135 | ssprotocol="auth_sha1_v4" 136 | elif [[ ${ssprotocol} == "3" ]]; then 137 | ssprotocol="auth_aes128_md5" 138 | elif [[ ${ssprotocol} == "4" ]]; then 139 | ssprotocol="auth_aes128_sha1" 140 | else 141 | ssprotocol="auth_sha1_v4" 142 | fi 143 | echo && echo ${Separator_1} && echo -e " 协议 : \033[32m${ssprotocol}\033[0m" && echo ${Separator_1} && echo 144 | #设置混淆 145 | echo "请输入数字 来选择ShadowsocksR账号的 混淆:" 146 | echo " 1. plain" 147 | echo " 2. http_simple" 148 | echo " 3. http_post" 149 | echo " 4. random_head" 150 | echo " 5. tls1.2_ticket_auth" 151 | echo 152 | read -p "(默认混淆: 5. tls1.2_ticket_auth):" ssobfs 153 | [[ -z "${ssobfs}" ]] && ssobfs="5" 154 | if [[ ${ssobfs} == "1" ]]; then 155 | ssobfs="plain" 156 | elif [[ ${ssobfs} == "2" ]]; then 157 | ssobfs="http_simple" 158 | elif [[ ${ssobfs} == "3" ]]; then 159 | ssobfs="http_post" 160 | elif [[ ${ssobfs} == "4" ]]; then 161 | ssobfs="random_head" 162 | elif [[ ${ssobfs} == "5" ]]; then 163 | ssobfs="tls1.2_ticket_auth" 164 | else 165 | ssobfs="tls1.2_ticket_auth" 166 | fi 167 | echo && echo ${Separator_1} && echo -e " 混淆 : \033[32m${ssobfs}\033[0m" && echo ${Separator_1} && echo 168 | #询问是否设置 混淆 兼容原版 169 | if [[ ${ssprotocol} != "origin" ]]; then 170 | if [[ ${ssobfs} != "plain" ]]; then 171 | if [[ ${ssprotocol} == "verify_sha1" ]] || [[ ${ssprotocol} == "auth_sha1_v2" ]] || [[ ${ssprotocol} == "auth_sha1_v4" ]]; then 172 | read -p "是否设置 协议/混淆 兼容原版 ( _compatible )? [Y/n] :" yn1 173 | [[ -z "${yn1}" ]] && yn1="y" 174 | [[ $yn1 == [Yy] ]] && ssobfs=${ssobfs}"_compatible" && ssprotocol=${ssprotocol}"_compatible" 175 | else 176 | read -p "是否设置 混淆 兼容原版 ( _compatible )? [Y/n] :" yn1 177 | [[ -z "${yn1}" ]] && yn1="y" 178 | [[ $yn1 == [Yy] ]] && ssobfs=${ssobfs}"_compatible" 179 | fi 180 | else 181 | if [[ ${ssprotocol} == "verify_sha1" ]] || [[ ${ssprotocol} == "auth_sha1_v2" ]] || [[ ${ssprotocol} == "auth_sha1_v4" ]]; then 182 | read -p "是否设置 协议 兼容原版 ( _compatible )? [Y/n] :" yn1 183 | [[ -z "${yn1}" ]] && yn1="y" 184 | [[ $yn1 == [Yy] ]] && ssprotocol=${ssprotocol}"_compatible" 185 | fi 186 | fi 187 | else 188 | if [[ ${ssobfs} != "plain" ]]; then 189 | read -p "是否设置 混淆 兼容原版 ( _compatible )? [Y/n] :" yn1 190 | [[ -z "${yn1}" ]] && yn1="y" 191 | [[ $yn1 == [Yy] ]] && ssobfs=${ssobfs}"_compatible" 192 | fi 193 | fi 194 | if [[ ${ssprotocol} != "origin" ]]; then 195 | while true 196 | do 197 | echo 198 | echo -e "请输入 ShadowsocksR账号欲限制的设备数 (\033[32m auth_* 系列协议 不兼容原版才有效 \033[0m)" 199 | echo -e "\033[32m 注意: \033[0m该设备数限制,指的是每个端口同一时间能链接的客户端数量(多端口模式,每个端口都是独立计算)。" 200 | read -p "(回车 默认无限):" ssprotocol_param 201 | [[ -z "$ssprotocol_param" ]] && ssprotocol_param="" && break 202 | expr ${ssprotocol_param} + 0 &>/dev/null 203 | if [[ $? -eq 0 ]]; then 204 | if [[ ${ssprotocol_param} -ge 1 ]] && [[ ${ssprotocol_param} -le 99999 ]]; then 205 | echo && echo ${Separator_1} && echo -e " 设备数 : \033[32m${ssprotocol_param}\033[0m" && echo ${Separator_1} && echo 206 | break 207 | else 208 | echo "输入错误,请输入正确的数字 !" 209 | fi 210 | else 211 | echo "输入错误,请输入正确的数字 !" 212 | fi 213 | done 214 | fi 215 | # 设置单线程限速 216 | while true 217 | do 218 | echo 219 | echo -e "请输入 你要设置的每个端口 单线程 限速上限(单位:KB/S)" 220 | echo -e "\033[32m 注意: \033[0m这个指的是,每个端口 单线程的限速上限,多线程即无效。" 221 | read -p "(回车 默认无限):" ssspeed_limit_per_con 222 | [[ -z "$ssspeed_limit_per_con" ]] && ssspeed_limit_per_con=0 && break 223 | expr ${ssspeed_limit_per_con} + 0 &>/dev/null 224 | if [[ $? -eq 0 ]]; then 225 | if [[ ${ssspeed_limit_per_con} -ge 1 ]] && [[ ${ssspeed_limit_per_con} -le 99999 ]]; then 226 | echo && echo ${Separator_1} && echo -e " 单端口单线程 : \033[32m${ssspeed_limit_per_con} KB/S\033[0m" && echo ${Separator_1} && echo 227 | break 228 | else 229 | echo "输入错误,请输入正确的数字 !" 230 | fi 231 | else 232 | echo "输入错误,请输入正确的数字 !" 233 | fi 234 | done 235 | # 设置端口总限速 236 | while true 237 | do 238 | echo 239 | echo -e "请输入 你要设置的每个端口 总速度 限速上限(单位:KB/S)" 240 | echo -e "\033[32m 注意: \033[0m这个指的是,每个端口 总速度 限速上限,单个端口整体限速。" 241 | read -p "(回车 默认无限):" ssspeed_limit_per_user 242 | [[ -z "$ssspeed_limit_per_user" ]] && ssspeed_limit_per_user=0 && break 243 | expr ${ssspeed_limit_per_user} + 0 &>/dev/null 244 | if [[ $? -eq 0 ]]; then 245 | if [[ ${ssspeed_limit_per_user} -ge 1 ]] && [[ ${ssspeed_limit_per_user} -le 99999 ]]; then 246 | echo && echo ${Separator_1} && echo -e " 单端口总限速 : \033[32m${ssspeed_limit_per_user} KB/S\033[0m" && echo ${Separator_1} && echo 247 | break 248 | else 249 | echo "输入错误,请输入正确的数字 !" 250 | fi 251 | else 252 | echo "输入错误,请输入正确的数字 !" 253 | fi 254 | done 255 | } 256 | #设置用户账号信息 257 | setUser(){ 258 | set_port_pass 259 | set_others 260 | #最后确认 261 | [[ "${ssprotocol_param}" == "" ]] && ssprotocol_param="0(无限)" 262 | echo && echo ${Separator_1} 263 | echo " 请检查Shadowsocks账号配置是否有误 !" && echo 264 | echo -e " 端口\t : \033[32m${ssport}\033[0m" 265 | echo -e " 密码\t : \033[32m${sspwd}\033[0m" 266 | echo -e " 加密\t : \033[32m${ssmethod}\033[0m" 267 | echo -e " 协议\t : \033[32m${ssprotocol}\033[0m" 268 | echo -e " 混淆\t : \033[32m${ssobfs} \033[0m" 269 | echo -e " 设备数限制 : \033[32m${ssprotocol_param}\033[0m" 270 | echo -e " 单线程限速 : \033[32m${ssspeed_limit_per_con} KB/S\033[0m" 271 | echo -e " 端口总限速 : \033[32m${ssspeed_limit_per_user} KB/S\033[0m" 272 | echo ${Separator_1} && echo 273 | read -p "请按任意键继续,如有配置错误请使用 Ctrl+C 退出。" var 274 | [[ "${ssprotocol_param}" = "0(无限)" ]] && ssprotocol_param="" 275 | } 276 | ss_link_qr(){ 277 | SSbase64=`echo -n "${method}:${user_password}@${ip}:${user_port}" | base64 | sed ':a;N;s/\n/ /g;ta' | sed 's/ //g'` 278 | SSurl="ss://"${SSbase64} 279 | SSQRcode="http://pan.baidu.com/share/qrcode?w=300&h=300&url="${SSurl} 280 | ss_link=" SS 链接 : \033[32m${SSurl}\033[0m \n SS 二维码 : \033[32m${SSQRcode}\033[0m" 281 | } 282 | ssr_link_qr(){ 283 | SSRprotocol=`echo ${protocol} | sed 's/_compatible//g'` 284 | SSRobfs=`echo ${obfs} | sed 's/_compatible//g'` 285 | SSRPWDbase64=`echo -n "${password}" | base64 | sed ':a;N;s/\n/ /g;ta' | sed 's/ //g'` 286 | SSRbase64=`echo -n "${ip}:${port}:${SSRprotocol}:${method}:${SSRobfs}:${SSRPWDbase64}" | base64 | sed ':a;N;s/\n/ /g;ta' | sed 's/ //g'` 287 | SSRurl="ssr://"${SSRbase64} 288 | SSRQRcode="http://pan.baidu.com/share/qrcode?w=300&h=300&url="${SSRurl} 289 | ssr_link=" SSR 链接 : \033[32m${SSRurl}\033[0m \n SSR 二维码 : \033[32m${SSRQRcode}\033[0m \n " 290 | } 291 | #显示用户账号信息 292 | viewUser(){ 293 | SSR_install_status 294 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 295 | if [[ -z "${PID}" ]]; then 296 | ssr_status="\033[41;37m 当前状态: \033[0m ShadowsocksR 没有运行!" 297 | else 298 | ssr_status="\033[42;37m 当前状态: \033[0m ShadowsocksR 正在运行!" 299 | fi 300 | getIP 301 | now_mode=`jq '.port_password' ${config_user_file}` 302 | if [[ "${now_mode}" = "null" ]]; then 303 | getUser 304 | SSprotocol=`echo ${protocol} | awk -F "_" '{print $NF}'` 305 | SSobfs=`echo ${obfs} | awk -F "_" '{print $NF}'` 306 | if [[ ${protocol} = "origin" ]]; then 307 | if [[ ${obfs} = "plain" ]]; then 308 | ss_link_qr 309 | ssr_link="" 310 | else 311 | if [[ ${SSobfs} != "compatible" ]]; then 312 | ss_link="" 313 | else 314 | ss_link_qr 315 | fi 316 | fi 317 | else 318 | if [[ ${SSprotocol} != "compatible" ]]; then 319 | ss_link="" 320 | else 321 | if [[ ${SSobfs} != "compatible" ]]; then 322 | if [[ ${SSobfs} = "plain" ]]; then 323 | ss_link_qr 324 | else 325 | ss_link="" 326 | fi 327 | else 328 | ss_link_qr 329 | fi 330 | fi 331 | fi 332 | ssr_link_qr 333 | [[ -z ${protocol_param} ]] && protocol_param="0(无限)" 334 | clear 335 | echo "===================================================" 336 | echo 337 | echo -e " 你的ShadowsocksR 账号配置 : " 338 | echo 339 | echo -e " I P\t : \033[32m${ip}\033[0m" 340 | echo -e " 端口\t : \033[32m${port}\033[0m" 341 | echo -e " 密码\t : \033[32m${password}\033[0m" 342 | echo -e " 加密\t : \033[32m${method}\033[0m" 343 | echo -e " 协议\t : \033[32m${protocol}\033[0m" 344 | echo -e " 混淆\t : \033[32m${obfs}\033[0m" 345 | echo -e " 设备数限制 : \033[32m${protocol_param}\033[0m" 346 | echo -e " 单线程限速 : \033[32m${speed_limit_per_con} KB/S\033[0m" 347 | echo -e " 端口总限速 : \033[32m${speed_limit_per_user} KB/S\033[0m" 348 | echo -e "${ss_link}" 349 | echo -e "${ssr_link}" 350 | echo -e "\033[42;37m 提示: \033[0m" 351 | echo -e " 浏览器中,打开二维码链接,就可以看到二维码图片。" 352 | echo -e " 协议和混淆后面的[ _compatible ],指的是兼容原版Shadowsocks协议/混淆。" 353 | echo 354 | echo -e ${ssr_status} 355 | echo 356 | echo "===================================================" 357 | else 358 | getUser 359 | [[ -z ${protocol_param} ]] && protocol_param="0(无限)" 360 | clear 361 | echo "===================================================" 362 | echo 363 | echo -e " 你的ShadowsocksR 账号配置 : " 364 | echo 365 | echo -e " I P\t : \033[32m${ip}\033[0m" 366 | echo -e " 加密\t : \033[32m${method}\033[0m" 367 | echo -e " 协议\t : \033[32m${protocol}\033[0m" 368 | echo -e " 混淆\t : \033[32m${obfs}\033[0m" 369 | echo -e " 设备数限制 : \033[32m${protocol_param}\033[0m" 370 | echo -e " 单线程限速 : \033[32m${speed_limit_per_con} KB/S\033[0m" 371 | echo -e " 端口总限速 : \033[32m${speed_limit_per_user} KB/S\033[0m" 372 | echo 373 | user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` 374 | [[ ${socat_total} = "0" ]] && echo -e "\033[41;37m [错误] \033[0m 没有发现 多端口用户,请检查 !" && exit 1 375 | user_id=0 376 | check_sys 377 | if [[ ${release} = "centos" ]]; then 378 | for((integer = 1; integer <= ${user_total}; integer++)) 379 | do 380 | 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;}'` 381 | 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;}'` 382 | user_id=$[$user_id+1] 383 | 384 | SSprotocol=`echo ${protocol} | awk -F "_" '{print $NF}'` 385 | SSobfs=`echo ${obfs} | awk -F "_" '{print $NF}'` 386 | if [[ ${protocol} = "origin" ]]; then 387 | if [[ ${obfs} = "plain" ]]; then 388 | ss_link_qr 389 | ssr_link="" 390 | else 391 | if [[ ${SSobfs} != "compatible" ]]; then 392 | ss_link="" 393 | else 394 | ss_link_qr 395 | fi 396 | fi 397 | else 398 | if [[ ${SSprotocol} != "compatible" ]]; then 399 | ss_link="" 400 | else 401 | if [[ ${SSobfs} != "compatible" ]]; then 402 | if [[ ${SSobfs} = "plain" ]]; then 403 | ss_link_qr 404 | else 405 | ss_link="" 406 | fi 407 | else 408 | ss_link_qr 409 | fi 410 | fi 411 | fi 412 | ssr_link_qr 413 | echo -e " ——————————\033[42;37m 用户 ${user_id} \033[0m ——————————" 414 | echo -e " 端口\t : \033[32m${user_port}\033[0m" 415 | echo -e " 密码\t : \033[32m${user_password}\033[0m" 416 | echo -e "${ss_link}" 417 | echo -e "${ssr_link}" 418 | done 419 | else 420 | for((integer = ${user_total}; integer >= 1; integer--)) 421 | do 422 | 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;}'` 423 | 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;}'` 424 | user_id=$[$user_id+1] 425 | 426 | SSprotocol=`echo ${protocol} | awk -F "_" '{print $NF}'` 427 | SSobfs=`echo ${obfs} | awk -F "_" '{print $NF}'` 428 | if [[ ${protocol} = "origin" ]]; then 429 | if [[ ${obfs} = "plain" ]]; then 430 | ss_link_qr 431 | ssr_link="" 432 | else 433 | if [[ ${SSobfs} != "compatible" ]]; then 434 | ss_link="" 435 | else 436 | ss_link_qr 437 | fi 438 | fi 439 | else 440 | if [[ ${SSprotocol} != "compatible" ]]; then 441 | ss_link="" 442 | else 443 | if [[ ${SSobfs} != "compatible" ]]; then 444 | if [[ ${SSobfs} = "plain" ]]; then 445 | ss_link_qr 446 | else 447 | ss_link="" 448 | fi 449 | else 450 | ss_link_qr 451 | fi 452 | fi 453 | fi 454 | ssr_link_qr 455 | echo -e " —————————— \033[42;37m 用户 ${user_id} \033[0m ——————————" 456 | echo -e " 端口\t : \033[32m${user_port}\033[0m" 457 | echo -e " 密码\t : \033[32m${user_password}\033[0m" 458 | echo -e "${ss_link}" 459 | echo -e "${ssr_link}" 460 | done 461 | fi 462 | echo -e "\033[42;37m 提示: \033[0m" 463 | echo -e " 浏览器中,打开二维码链接,就可以看到二维码图片。" 464 | echo -e " 协议和混淆后面的[ _compatible ],指的是兼容原版Shadowsocks协议/混淆。" 465 | echo 466 | echo -e ${ssr_status} 467 | echo 468 | echo "===================================================" 469 | fi 470 | 471 | } 472 | debian_apt(){ 473 | apt-get update 474 | apt-get install -y python-pip python-m2crypto curl unzip vim git gcc build-essential make 475 | } 476 | centos_yum(){ 477 | yum update 478 | yum install -y python-pip python-m2crypto curl unzip vim git gcc make 479 | } 480 | JQ_install(){ 481 | JQ_ver=`jq -V` 482 | if [[ -z ${JQ_ver} ]]; then 483 | #wget --no-check-certificate -N "https://softs.pw/Bash/other/jq-1.5.tar.gz" 484 | wget --no-check-certificate -N "https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/other/jq-1.5.tar.gz" 485 | tar -xzf jq-1.5.tar.gz && cd jq-1.5 486 | ./configure --disable-maintainer-mode && make && make install 487 | ldconfig 488 | cd .. && rm -rf jq-1.5.tar.gz && rm -rf jq-1.5 489 | JQ_ver=`jq -V` 490 | [[ -z ${JQ_ver} ]]&& echo -e "\033[41;37m [错误] \033[0m JSON解析器 JQ 安装失败 !" && exit 1 491 | echo -e "\033[42;37m [信息] \033[0m JSON解析器 JQ 安装完成,继续..." 492 | else 493 | echo -e "\033[42;37m [信息] \033[0m 检测到 JSON解析器 JQ 已安装,继续..." 494 | fi 495 | } 496 | rc.local_ss_set(){ 497 | #添加开机启动 498 | if [[ ${release} = "centos" ]]; then 499 | chmod +x /etc/rc.d/rc.local 500 | sed -i '/cd \/etc\/shadowsocksr\/shadowsocks\//d' /etc/rc.d/rc.local 501 | sed -i '/nohup python server.py a >> ssserver.log 2>&1 &/d' /etc/rc.d/rc.local 502 | echo -e "cd ${ssr_ss_file}" >> /etc/rc.d/rc.local 503 | echo -e "nohup python server.py a >> ssserver.log 2>&1 &" >> /etc/rc.d/rc.local 504 | else 505 | chmod +x /etc/rc.local 506 | sed -i '$d' /etc/rc.local 507 | sed -i '/cd \/etc\/shadowsocksr\/shadowsocks\//d' /etc/rc.local 508 | sed -i '/nohup python server.py a >> ssserver.log 2>&1 &/d' /etc/rc.local 509 | echo -e "cd ${ssr_ss_file}" >> /etc/rc.local 510 | echo -e "nohup python server.py a >> ssserver.log 2>&1 &" >> /etc/rc.local 511 | echo -e "exit 0" >> /etc/rc.local 512 | fi 513 | } 514 | rc.local_ss_del(){ 515 | if [[ ${release} = "centos" ]]; then 516 | sed -i '/cd \/etc\/shadowsocksr\/shadowsocks\//d' /etc/rc.d/rc.local 517 | sed -i '/nohup python server.py a >> ssserver.log 2>&1 &/d' /etc/rc.d/rc.local 518 | else 519 | sed -i '/cd \/etc\/shadowsocksr\/shadowsocks\//d' /etc/rc.local 520 | sed -i '/nohup python server.py a >> ssserver.log 2>&1 &/d' /etc/rc.local 521 | fi 522 | } 523 | rc.local_serverspeed_set(){ 524 | #添加开机启动 525 | if [[ ${release} = "centos" ]]; then 526 | chmod +x /etc/rc.d/rc.local 527 | sed -i '/\/serverspeeder\/bin\/serverSpeeder.sh start/d' /etc/rc.d/rc.local 528 | echo -e "/serverspeeder/bin/serverSpeeder.sh start" >> /etc/rc.d/rc.local 529 | else 530 | chmod +x /etc/rc.local 531 | sed -i '$d' /etc/rc.local 532 | sed -i '/\/serverspeeder\/bin\/serverSpeeder.sh start/d' /etc/rc.local 533 | echo -e "/serverspeeder/bin/serverSpeeder.sh start" >> /etc/rc.local 534 | echo -e "exit 0" >> /etc/rc.local 535 | fi 536 | } 537 | rc.local_serverspeed_del(){ 538 | if [[ ${release} = "centos" ]]; then 539 | sed -i '/\/serverspeeder\/bin\/serverSpeeder.sh start/d' /etc/rc.d/rc.local 540 | else 541 | sed -i '/\/serverspeeder\/bin\/serverSpeeder.sh start/d' /etc/rc.local 542 | fi 543 | } 544 | iptables_add(){ 545 | iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssport} -j ACCEPT 546 | iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssport} -j ACCEPT 547 | } 548 | iptables_del(){ 549 | iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT 550 | iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT 551 | } 552 | iptables_set(){ 553 | #删除旧端口的防火墙规则,添加新端口的规则 554 | iptables_del 555 | iptables_add 556 | } 557 | set_config_port_pass(){ 558 | sed -i 's/"server_port": '$(echo ${port})'/"server_port": '$(echo ${ssport})'/g' ${config_user_file} 559 | sed -i 's/"password": "'$(echo ${password})'"/"password": "'$(echo ${sspwd})'"/g' ${config_user_file} 560 | } 561 | set_config_method_obfs_protocol(){ 562 | sed -i 's/"method": "'$(echo ${method})'"/"method": "'$(echo ${ssmethod})'"/g' ${config_user_file} 563 | sed -i 's/"obfs": "'$(echo ${obfs})'"/"obfs": "'$(echo ${ssobfs})'"/g' ${config_user_file} 564 | sed -i 's/"protocol": "'$(echo ${protocol})'"/"protocol": "'$(echo ${ssprotocol})'"/g' ${config_user_file} 565 | } 566 | set_config_protocol_param(){ 567 | sed -i 's/"protocol_param": "'$(echo ${protocol_param})'"/"protocol_param": "'$(echo ${ssprotocol_param})'"/g' ${config_user_file} 568 | } 569 | set_config_speed_limit_per(){ 570 | 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} 571 | 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} 572 | } 573 | #安装ShadowsocksR 574 | installSSR(){ 575 | [[ -e $config_user_file ]] && echo -e "\033[41;37m [错误] \033[0m 发现已安装ShadowsocksR,如果需要继续安装,请先卸载 !" && exit 1 576 | setUser 577 | check_sys 578 | # 系统判断 579 | if [[ ${release} = "debian" ]]; then 580 | debian_apt 581 | elif [[ ${release} = "ubuntu" ]]; then 582 | debian_apt 583 | elif [[ ${release} = "centos" ]]; then 584 | centos_yum 585 | else 586 | echo -e "\033[41;37m [错误] \033[0m 本脚本不支持当前系统 !" && exit 1 587 | fi 588 | #修改DNS为8.8.8.8 589 | echo "nameserver 8.8.8.8" > /etc/resolv.conf 590 | echo "nameserver 8.8.4.4" >> /etc/resolv.conf 591 | cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 592 | JQ_install 593 | cd /etc 594 | #git config --global http.sslVerify false 595 | env GIT_SSL_NO_VERIFY=true git clone -b manyuser https://github.com/shadowsocksr/shadowsocksr.git 596 | [[ ! -e ${config_file} ]] && echo -e "\033[41;37m [错误] \033[0m ShadowsocksR 下载失败 !" && exit 1 597 | cp ${config_file} ${config_user_file} 598 | #修改配置文件的密码 端口 加密方式 599 | cat > ${config_user_file}<<-EOF 600 | { 601 | "server": "0.0.0.0", 602 | "server_ipv6": "::", 603 | "server_port": ${ssport}, 604 | "local_address": "127.0.0.1", 605 | "local_port": 1080, 606 | "password": "${sspwd}", 607 | "timeout": 120, 608 | "udp_timeout": 60, 609 | "method": "${ssmethod}", 610 | "protocol": "${ssprotocol}", 611 | "protocol_param": "${ssprotocol_param}", 612 | "obfs": "${ssobfs}", 613 | "obfs_param": "", 614 | "speed_limit_per_con": ${ssspeed_limit_per_con}, 615 | "speed_limit_per_user": ${ssspeed_limit_per_user}, 616 | "dns_ipv6": false, 617 | "connect_verbose_info": 0, 618 | "redirect": "", 619 | "fast_open": false 620 | } 621 | EOF 622 | 623 | #添加新端口的规则 624 | iptables_add 625 | rc.local_ss_set 626 | #启动SSR服务端,并判断是否启动成功 627 | cd ${ssr_ss_file} 628 | nohup python server.py a >> ssserver.log 2>&1 & 629 | sleep 2s 630 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 631 | if [[ ! -z "${PID}" ]]; then 632 | viewUser 633 | echo 634 | echo -e "ShadowsocksR 安装完成 !" 635 | echo -e "https://doub.io/ss-jc42/" 636 | echo 637 | echo "############################################################" 638 | else 639 | echo -e "\033[41;37m [错误] \033[0m ShadowsocksR服务端启动失败 !" 640 | fi 641 | } 642 | installLibsodium(){ 643 | # 系统判断 644 | check_sys 645 | if [[ ${release} != "debian" ]]; then 646 | if [[ ${release} != "ubuntu" ]]; then 647 | if [[ ${release} != "centos" ]]; then 648 | echo -e "\033[41;37m [错误] \033[0m 本脚本不支持当前系统 !" && exit 1 649 | fi 650 | fi 651 | fi 652 | if [[ ${release} != "centos" ]]; then 653 | apt-get update && apt-get install -y gcc build-essential make 654 | cd /root 655 | wget --no-check-certificate -O libsodium.tar.gz https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz 656 | tar -xzf libsodium.tar.gz && mv libsodium-${Libsodiumr_ver} libsodium && cd libsodium 657 | ./configure --disable-maintainer-mode && make -j2 && make install 658 | ldconfig 659 | cd .. && rm -rf libsodium.tar.gz && rm -rf libsodium 660 | else 661 | yum update && yum install epel-release -y && yum install libsodium -y 662 | fi 663 | echo ${Separator_1} && echo 664 | echo -e "Libsodium 安装完成 !" 665 | echo -e "https://doub.io/ss-jc42/" 666 | echo && echo ${Separator_1} 667 | } 668 | #修改单端口用户配置 669 | modifyUser(){ 670 | SSR_install_status 671 | now_mode=`jq '.port_password' ${config_user_file}` 672 | [[ "${now_mode}" != "null" ]] && echo -e "\033[41;37m [错误] \033[0m 当前ShadowsocksR模式为 多端口,请检查 !" && exit 1 673 | getUser 674 | setUser 675 | #修改配置文件的密码 端口 加密方式 676 | set_config_port_pass 677 | set_config_method_obfs_protocol 678 | set_config_protocol_param 679 | set_config_speed_limit_per 680 | iptables_set 681 | RestartSSR 682 | } 683 | #手动修改用户配置 684 | manuallyModifyUser(){ 685 | SSR_install_status 686 | port=`jq '.server_port' ${config_user_file}` 687 | vi $config_user_file 688 | ssport=`jq '.server_port' ${config_user_file}` 689 | iptables_set 690 | RestartSSR 691 | } 692 | #卸载ShadowsocksR 693 | UninstallSSR(){ 694 | [[ ! -e $config_file ]] && echo -e "\033[41;37m [错误] \033[0m 没有发现安装ShadowsocksR,请检查 !" && exit 1 695 | echo "确定要卸载ShadowsocksR ? (y/N)" 696 | echo 697 | read -p "(默认: n):" unyn 698 | [[ -z ${unyn} ]] && unyn="n" 699 | if [[ ${unyn} == [Yy] ]]; then 700 | #停止ShadowsocksR服务端并删除防火墙规则,删除Shadowsocks文件夹。 701 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 702 | [[ ! -z "${PID}" ]] && kill -9 ${PID} 703 | cron_ssr=`crontab -l | grep "${ssr_file}/${auto_restart_cron}" | wc -l` 704 | if [[ ${cron_ssr} > "0" ]]; then 705 | crontab -l > ${ssr_file}"/crontab.bak" 706 | sed -i "/\/etc\/shadowsocksr\/${auto_restart_cron}/d" ${ssr_file}"/crontab.bak" 707 | crontab ${ssr_file}"/crontab.bak" 708 | rm -rf ${ssr_file}"/crontab.bak" 709 | fi 710 | now_mode=`jq '.port_password' ${config_user_file}` 711 | if [[ "${now_mode}" = "null" ]]; then 712 | port=`jq '.server_port' ${config_user_file}` 713 | iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT 714 | iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT 715 | else 716 | user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` 717 | for((integer = 1; integer <= ${user_total}; integer++)) 718 | do 719 | port=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` 720 | iptables_del 721 | done 722 | fi 723 | #取消开机启动 724 | check_sys 725 | rc.local_ss_del 726 | rm -rf ${ssr_file} && rm -rf ${Libsodiumr_file} && rm -rf ${Libsodiumr_file}.tar.gz 727 | echo && echo " ShadowsocksR 卸载完成 !" && echo 728 | else 729 | echo && echo "卸载已取消..." && echo 730 | fi 731 | } 732 | # 更新ShadowsocksR 733 | UpdateSSR(){ 734 | SSR_install_status 735 | cd ${ssr_file} 736 | git pull 737 | RestartSSR 738 | } 739 | # 切换 单/多端口模式 740 | Port_mode_switching(){ 741 | SSR_install_status 742 | now_mode=`jq '.port_password' ${config_user_file}` 743 | if [[ "${now_mode}" = "null" ]]; then 744 | echo 745 | echo -e " 当前ShadowsocksR模式:\033[42;37m 单端口 \033[0m" 746 | echo 747 | echo -e "确定要切换模式为 \033[42;37m 多端口 \033[0m ? (y/N)" 748 | echo 749 | read -p "(默认: n):" mode_yn 750 | [[ -z ${mode_yn} ]] && mode_yn="n" 751 | if [[ ${mode_yn} == [Yy] ]]; then 752 | port=`jq '.server_port' ${config_user_file}` 753 | setUser 754 | iptables_set 755 | cat > ${config_user_file}<<-EOF 756 | { 757 | "server": "0.0.0.0", 758 | "server_ipv6": "::", 759 | "local_address": "127.0.0.1", 760 | "local_port": 1080, 761 | "port_password":{ 762 | "${ssport}":"${sspwd}" 763 | }, 764 | "timeout": 120, 765 | "udp_timeout": 60, 766 | "method": "${ssmethod}", 767 | "protocol": "${ssprotocol}", 768 | "protocol_param": "${ssprotocol_param}", 769 | "obfs": "${ssobfs}", 770 | "obfs_param": "", 771 | "speed_limit_per_con": ${ssspeed_limit_per_con}, 772 | "speed_limit_per_user": ${ssspeed_limit_per_user}, 773 | "dns_ipv6": false, 774 | "connect_verbose_info": 0, 775 | "redirect": "", 776 | "fast_open": false 777 | } 778 | EOF 779 | RestartSSR 780 | else 781 | echo && echo " 已取消..." && echo 782 | fi 783 | else 784 | echo 785 | echo -e " 当前ShadowsocksR模式:\033[42;37m 多端口 \033[0m" 786 | echo 787 | echo -e "确定要切换模式为 \033[42;37m 单端口 \033[0m ? (y/N)" 788 | echo 789 | read -p "(默认: n):" mode_yn 790 | [[ -z ${mode_yn} ]] && mode_yn="n" 791 | if [[ ${mode_yn} == [Yy] ]]; then 792 | user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` 793 | for((integer = 1; integer <= ${user_total}; integer++)) 794 | do 795 | port=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | awk -F ":" '{print $1}' | sed -n "${integer}p" | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` 796 | iptables_del 797 | done 798 | setUser 799 | iptables_add 800 | cat > ${config_user_file}<<-EOF 801 | { 802 | "server": "0.0.0.0", 803 | "server_ipv6": "::", 804 | "server_port": ${ssport}, 805 | "local_address": "127.0.0.1", 806 | "local_port": 1080, 807 | "password": "${sspwd}", 808 | "timeout": 120, 809 | "udp_timeout": 60, 810 | "method": "${ssmethod}", 811 | "protocol": "${ssprotocol}", 812 | "protocol_param": "${ssprotocol_param}", 813 | "obfs": "${ssobfs}", 814 | "obfs_param": "", 815 | "speed_limit_per_con": ${ssspeed_limit_per_con}, 816 | "speed_limit_per_user": ${ssspeed_limit_per_user}, 817 | "dns_ipv6": false, 818 | "connect_verbose_info": 0, 819 | "redirect": "", 820 | "fast_open": false 821 | } 822 | EOF 823 | RestartSSR 824 | else 825 | echo && echo " 已取消..." && echo 826 | fi 827 | fi 828 | } 829 | List_multi_port_user(){ 830 | user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` 831 | [[ ${socat_total} = "0" ]] && echo -e "\033[41;37m [错误] \033[0m 没有发现 多端口用户,请检查 !" && exit 1 832 | user_list_all="" 833 | user_id=0 834 | check_sys 835 | if [[ ${release} = "centos" ]]; then 836 | for((integer = 1; integer <= ${user_total}; integer++)) 837 | do 838 | 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;}'` 839 | 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;}'` 840 | user_id=$[$user_id+1] 841 | user_list_all=${user_list_all}${user_id}". 用户端口: "${user_port}" 用户密码: "${user_password}"\n" 842 | done 843 | else 844 | for((integer = ${user_total}; integer >= 1; integer--)) 845 | do 846 | 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;}'` 847 | 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;}'` 848 | user_id=$[$user_id+1] 849 | user_list_all=${user_list_all}${user_id}". 用户端口: "${user_port}" 用户密码: "${user_password}"\n" 850 | done 851 | fi 852 | echo 853 | echo -e "当前有 \033[42;37m "${user_total}" \033[0m 个用户配置。" 854 | echo -e ${user_list_all} 855 | } 856 | # 添加 多端口用户配置 857 | Add_multi_port_user(){ 858 | SSR_install_status 859 | now_mode=`jq '.port_password' ${config_user_file}` 860 | [[ "${now_mode}" = "null" ]] && echo -e "\033[41;37m [错误] \033[0m 当前ShadowsocksR模式为 单端口,请检查 !" && exit 1 861 | set_port_pass 862 | sed -i "7 i \" \"${ssport}\":\"${sspwd}\"," ${config_user_file} 863 | sed -i "7s/^\"//" ${config_user_file} 864 | iptables_add 865 | RestartSSR 866 | echo -e "\033[42;37m [信息] \033[0m ShadowsocksR 多端口用户 \033[42;37m [端口: ${ssport} , 密码: ${sspwd}] \033[0m 已添加!" 867 | } 868 | # 修改 多端口用户配置 869 | Modify_multi_port_user(){ 870 | SSR_install_status 871 | now_mode=`jq '.port_password' ${config_user_file}` 872 | [[ "${now_mode}" = "null" ]] && echo -e "\033[41;37m [错误] \033[0m 当前ShadowsocksR模式为 单端口,请检查 !" && exit 1 873 | echo "请输入数字 来选择你要修改的类型 :" 874 | echo "1. 修改 用户端口/密码" 875 | echo "2. 修改 全局协议/混淆" 876 | read -p "(默认回车取消):" modify_type 877 | [[ -z "${modify_type}" ]] && exit 1 878 | if [[ ${modify_type} == "1" ]]; then 879 | List_multi_port_user 880 | while true 881 | do 882 | echo -e "请选择并输入 你要修改的用户前面的数字 :" 883 | read -p "(默认回车取消):" del_user_num 884 | [[ -z "${del_user_num}" ]] && exit 1 885 | expr ${del_user_num} + 0 &>/dev/null 886 | if [ $? -eq 0 ]; then 887 | if [[ ${del_user_num} -ge 1 ]] && [[ ${del_user_num} -le ${user_total} ]]; then 888 | set_port_pass 889 | del_user_num_3=$[ $del_user_num + 6] 890 | port=`sed -n "${del_user_num_3}p" ${config_user_file} | awk -F ":" '{print $1}' | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` 891 | password=`sed -n "${del_user_num_3}p" ${config_user_file} | awk -F ":" '{print $2}' | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` 892 | sed -i 's/"'$(echo ${port})'":"'$(echo ${password})'"/"'$(echo ${ssport})'":"'$(echo ${sspwd})'"/g' ${config_user_file} 893 | iptables_set 894 | RestartSSR 895 | echo -e "\033[42;37m [信息] \033[0m ShadowsocksR 多端口用户 \033[42;37m ${del_user_num} \033[0m 已修改!" 896 | break 897 | else 898 | echo "输入错误,请输入正确的数字 !" 899 | fi 900 | else 901 | echo "输入错误,请输入正确的数字 !" 902 | fi 903 | done 904 | elif [[ ${modify_type} == "2" ]]; then 905 | set_others 906 | getUser 907 | set_config_method_obfs_protocol 908 | set_config_protocol_param 909 | set_config_speed_limit_per 910 | RestartSSR 911 | echo -e "\033[42;37m [信息] \033[0m ShadowsocksR 加密方式/协议/混淆等 已修改!" 912 | fi 913 | } 914 | # 删除 多端口用户配置 915 | Del_multi_port_user(){ 916 | SSR_install_status 917 | now_mode=`jq '.port_password' ${config_user_file}` 918 | [[ "${now_mode}" = "null" ]] && echo -e "\033[41;37m [错误] \033[0m 当前ShadowsocksR模式为 单端口,请检查 !" && exit 1 919 | List_multi_port_user 920 | user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` 921 | [[ "${user_total}" -le "1" ]] && echo -e "\033[41;37m [错误] \033[0m 当前仅剩下一个多端口用户,无法删除 !" && exit 1 922 | while true 923 | do 924 | echo -e "请选择并输入 你要删除的用户前面的数字 :" 925 | read -p "(默认回车取消):" del_user_num 926 | [[ -z "${del_user_num}" ]] && exit 1 927 | expr ${del_user_num} + 0 &>/dev/null 928 | if [[ $? -eq 0 ]]; then 929 | if [[ ${del_user_num} -ge 1 ]] && [[ ${del_user_num} -le ${user_total} ]]; then 930 | del_user_num_4=$[ $del_user_num + 6] 931 | port=`sed -n "${del_user_num_4}p" ${config_user_file} | awk -F ":" '{print $1}' | perl -e 'while($_=<>){ /\"(.*)\"/; print $1;}'` 932 | iptables_del 933 | del_user_num_1=$[ $del_user_num + 6 ] 934 | sed -i "${del_user_num_1}d" ${config_user_file} 935 | if [[ ${del_user_num} = ${user_total} ]]; then 936 | del_user_num_1=$[ $del_user_num_1 - 1 ] 937 | sed -i "${del_user_num_1}s/,$//g" ${config_user_file} 938 | fi 939 | RestartSSR 940 | echo -e "\033[42;37m [信息] \033[0m ShadowsocksR 多端口用户 \033[42;37m ${del_user_num} \033[0m 已删除!" 941 | break 942 | else 943 | echo "输入错误,请输入正确的数字 !" 944 | fi 945 | else 946 | echo "输入错误,请输入正确的数字 !" 947 | fi 948 | done 949 | } 950 | # 显示用户连接信息 951 | View_user_connection_info(){ 952 | SSR_install_status 953 | check_sys 954 | if [[ ${release} = "debian" ]]; then 955 | debian_View_user_connection_info 956 | elif [[ ${release} = "ubuntu" ]]; then 957 | debian_View_user_connection_info 958 | elif [[ ${release} = "centos" ]]; then 959 | centos_View_user_connection_info 960 | fi 961 | } 962 | debian_View_user_connection_info(){ 963 | now_mode=`jq '.port_password' ${config_user_file}` 964 | if [[ "${now_mode}" = "null" ]]; then 965 | now_mode="单端口模式" && user_total="1" 966 | IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |wc -l` 967 | user_port=`jq '.server_port' ${config_user_file}` 968 | user_IP=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep "${user_port}" |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u` 969 | 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` 970 | user_list_all="1. 用户端口: "${user_port}", 链接端口的IP总数: "${user_IP_total}", 链接端口的IP: "${user_IP}"\n" 971 | echo -e "当前是 \033[42;37m "${now_mode}" \033[0m ,当前共有 \033[42;37m "${IP_total}" \033[0m 个IP正在链接。" 972 | echo -e ${user_list_all} 973 | else 974 | now_mode="多端口模式" && user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` 975 | IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |wc -l` 976 | user_list_all="" 977 | user_id=0 978 | for((integer = ${user_total}; integer >= 1; integer--)) 979 | do 980 | 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;}'` 981 | user_IP=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep "${user_port}" |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u` 982 | 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` 983 | user_id=$[$user_id+1] 984 | user_list_all=${user_list_all}${user_id}". 用户端口: "${user_port}" 链接端口的IP总数: "${user_IP_total}" 链接端口的IP: "${user_IP}"\n" 985 | done 986 | echo -e "当前是 \033[42;37m "${now_mode}" \033[0m ,当前有 \033[42;37m "${user_total}" \033[0m 个用户配置,当前共有 \033[42;37m "${IP_total}" \033[0m 个IP正在链接。" 987 | echo -e ${user_list_all} 988 | fi 989 | } 990 | centos_View_user_connection_info(){ 991 | now_mode=`jq '.port_password' ${config_user_file}` 992 | if [[ "${now_mode}" = "null" ]]; then 993 | now_mode="单端口模式" && user_total="1" 994 | IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $4}' |sort -u |wc -l` 995 | user_port=`jq '.server_port' ${config_user_file}` 996 | user_IP=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep "${user_port}" | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u` 997 | 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` 998 | user_list_all="1. 用户端口: "${user_port}" 链接端口的IP总数: "${user_IP_total}" 链接端口的IP: "${user_IP}"\n" 999 | echo -e "当前是 \033[42;37m "${now_mode}" \033[0m ,当前共有 \033[42;37m "${IP_total}" \033[0m 个IP正在链接。" 1000 | echo -e ${user_list_all} 1001 | else 1002 | now_mode="多端口模式" && user_total=`jq '.port_password' ${config_user_file} | sed '$d' | sed "1d" | wc -l` 1003 | IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $4}' |sort -u |wc -l` 1004 | user_list_all="" 1005 | user_id=0 1006 | for((integer = 1; integer <= ${user_total}; integer++)) 1007 | do 1008 | 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;}'` 1009 | user_IP=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep "${user_port}" | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u` 1010 | 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` 1011 | user_id=$[$user_id+1] 1012 | user_list_all=${user_list_all}${user_id}". 用户端口: "${user_port}" 链接端口的IP总数: "${user_IP_total}" 链接端口的IP: "${user_IP}"\n" 1013 | done 1014 | echo -e "当前是 \033[42;37m "${now_mode}" \033[0m ,当前有 \033[42;37m "${user_total}" \033[0m 个用户配置,当前共有 \033[42;37m "${IP_total}" \033[0m 个IP正在链接。" 1015 | echo -e ${user_list_all} 1016 | fi 1017 | } 1018 | SSR_start(){ 1019 | cd ${ssr_ss_file} 1020 | nohup python server.py a >> ssserver.log 2>&1 & 1021 | sleep 2s 1022 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 1023 | if [[ ! -z "${PID}" ]]; then 1024 | viewUser 1025 | echo ${Separator_1} && echo && echo -e " ShadowsocksR 已启动 !" && echo && echo ${Separator_1} 1026 | else 1027 | echo -e "\033[41;37m [错误] \033[0m ShadowsocksR 启动失败, 请检查日志 !" 1028 | fi 1029 | } 1030 | #启动ShadowsocksR 1031 | StartSSR(){ 1032 | SSR_install_status 1033 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 1034 | [[ ! -z ${PID} ]] && echo -e "\033[41;37m [错误] \033[0m 发现ShadowsocksR正在运行,请检查 !" && exit 1 1035 | SSR_start 1036 | } 1037 | #停止ShadowsocksR 1038 | StopSSR(){ 1039 | SSR_install_status 1040 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 1041 | [[ -z $PID ]] && echo -e "\033[41;37m [错误] \033[0m 发现ShadowsocksR没有运行,请检查 !" && exit 1 1042 | kill -9 ${PID} && sleep 2s 1043 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 1044 | if [[ -z "${PID}" ]]; then 1045 | echo ${Separator_1} && echo && echo -e " ShadowsocksR 已停止 !" && echo && echo ${Separator_1} 1046 | else 1047 | echo -e "\033[41;37m [错误] \033[0m ShadowsocksR 停止失败 !" 1048 | fi 1049 | } 1050 | #重启ShadowsocksR 1051 | RestartSSR(){ 1052 | SSR_install_status 1053 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 1054 | [[ ! -z "${PID}" ]] && kill -9 ${PID} 1055 | SSR_start 1056 | } 1057 | #查看 ShadowsocksR 日志 1058 | TailSSR(){ 1059 | [[ ! -f ${ssr_ss_file}"ssserver.log" ]] && echo -e "\033[41;37m [错误] \033[0m 没有发现ShadowsocksR日志文件,请检查 !" && exit 1 1060 | echo 1061 | echo -e "使用 \033[41;37m Ctrl+C \033[0m 键退出查看日志 !" 1062 | echo 1063 | tail -f ${ssr_ss_file}"ssserver.log" 1064 | } 1065 | #查看 ShadowsocksR 状态 1066 | StatusSSR(){ 1067 | SSR_install_status 1068 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 1069 | if [[ -z "${PID}" ]]; then 1070 | echo ${Separator_1} && echo && echo -e " ShadowsocksR 没有运行!" && echo && echo ${Separator_1} 1071 | else 1072 | echo ${Separator_1} && echo && echo -e " ShadowsocksR 正在运行(PID: ${PID}) !" && echo && echo ${Separator_1} 1073 | fi 1074 | } 1075 | #安装锐速 1076 | installServerSpeeder(){ 1077 | [[ -d "/serverspeeder" ]] && echo -e "\033[41;37m [错误] \033[0m 锐速(ServerSpeeder) 已安装 !" && exit 1 1078 | cd /root 1079 | #借用91yun.rog的开心版锐速 1080 | wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder-all.sh 1081 | bash serverspeeder-all.sh 1082 | sleep 2s 1083 | PID=`ps -ef |grep -v grep |grep "serverspeeder" |awk '{print $2}'` 1084 | if [[ ! -z ${PID} ]]; then 1085 | check_sys 1086 | rc.local_serverspeed_set 1087 | echo -e "\033[42;37m [信息] \033[0m 锐速(ServerSpeeder) 安装完成 !" && exit 1 1088 | else 1089 | echo -e "\033[41;37m [错误] \033[0m 锐速(ServerSpeeder) 安装失败 !" && exit 1 1090 | fi 1091 | } 1092 | #查看锐速状态 1093 | StatusServerSpeeder(){ 1094 | [[ ! -d "/serverspeeder" ]] && echo -e "\033[41;37m [错误] \033[0m 锐速(ServerSpeeder) 没有安装,请检查 !" && exit 1 1095 | /serverspeeder/bin/serverSpeeder.sh status 1096 | } 1097 | #停止锐速 1098 | StopServerSpeeder(){ 1099 | [[ ! -d "/serverspeeder" ]] && echo -e "\033[41;37m [错误] \033[0m 锐速(ServerSpeeder) 没有安装,请检查 !" && exit 1 1100 | /serverspeeder/bin/serverSpeeder.sh stop 1101 | } 1102 | #重启锐速 1103 | RestartServerSpeeder(){ 1104 | [[ ! -d "/serverspeeder" ]] && echo -e "\033[41;37m [错误] \033[0m 锐速(ServerSpeeder) 没有安装,请检查 !" && exit 1 1105 | /serverspeeder/bin/serverSpeeder.sh restart 1106 | } 1107 | #卸载锐速 1108 | UninstallServerSpeeder(){ 1109 | [[ ! -d "/serverspeeder" ]] && echo -e "\033[41;37m [错误] \033[0m 锐速(ServerSpeeder) 没有安装,请检查 !" && exit 1 1110 | echo "确定要卸载 锐速(ServerSpeeder) ? (y/N)" 1111 | echo 1112 | read -p "(默认: n):" unyn 1113 | [[ -z ${unyn} ]] && unyn="n" 1114 | if [[ ${unyn} == [Yy] ]]; then 1115 | rm -rf /root/serverspeeder-all.sh 1116 | rm -rf /root/91yunserverspeeder 1117 | rm -rf /root/91yunserverspeeder.tar.gz 1118 | check_sys 1119 | rc.local_serverspeed_del 1120 | chattr -i /serverspeeder/etc/apx* 1121 | /serverspeeder/bin/serverSpeeder.sh uninstall -f 1122 | echo && echo "锐速(ServerSpeeder) 卸载完成 !" && echo 1123 | else 1124 | echo && echo "卸载已取消..." && echo 1125 | fi 1126 | } 1127 | BanBTPTSPAM(){ 1128 | wget -4qO- raw.githubusercontent.com/ToyoDAdoubi/doubi/master/Get_Out_Spam.sh | bash 1129 | } 1130 | InstallBBR(){ 1131 | echo -e "\033[42;37m [安装前 请注意] \033[0m" 1132 | echo -e "1. 安装开启BBR,需要更换内核,存在更换失败等风险(重启后无法开机)" 1133 | echo -e "2. 本脚本仅支持 Debian / Ubuntu 系统更换内核,OpenVZ虚拟化 不支持更换内核 !" 1134 | echo -e "3. Debian 更换内核过程中会提示 [ 是否终止卸载内核 ] ,请选择 \033[42;37m NO \033[0m" 1135 | echo -e "4. 安装BBR并重启后,需要重新运行脚本开启BBR \033[42;37m bash bbr.sh start \033[0m" 1136 | echo 1137 | echo "确定要安装 BBR ? (y/n)" 1138 | read -p "(默认回车取消):" unyn 1139 | [[ -z ${unyn} ]] && echo "安装已取消..." && exit 1 1140 | if [[ ${unyn} == [Yy] ]]; then 1141 | wget -N --no-check-certificate https://softs.pw/Bash/bbr.sh && chmod +x bbr.sh && bash bbr.sh 1142 | fi 1143 | } 1144 | SetCrontab_interval(){ 1145 | echo -e "\033[42;37m 格式说明 : \033[0m" 1146 | echo -e " 格式为:\033[42;37m * * * * * \033[0m,分别对应 \033[42;37m 分钟 小时 日 月 星期 \033[0m" 1147 | echo -e " 示例:\033[42;37m 30 2 * * * \033[0m,每天 凌晨2点30分时 重启一次" 1148 | echo -e " 示例:\033[42;37m 30 2 */3 * * \033[0m,每隔3天 凌晨2点30分时 重启一次" 1149 | echo -e " 示例:\033[42;37m 30 */2 * * * \033[0m,每天 每隔两小时 在30分时 重启一次" 1150 | echo "请输入ShadowsocksR 定时重启的间隔" 1151 | read -p "(默认: 每天凌晨2点0分 [0 2 * * *] ):" crontab_interval 1152 | [[ -z "${crontab_interval}" ]] && crontab_interval="0 2 * * *" 1153 | echo 1154 | echo "——————————————————————————————" 1155 | echo -e " 定时间隔 : \033[41;37m ${crontab_interval} \033[0m" 1156 | echo "——————————————————————————————" 1157 | echo 1158 | } 1159 | SetCrontab(){ 1160 | SSR_install_status 1161 | check_sys 1162 | if [[ ${release} = "centos" ]]; then 1163 | corn_status=`service crond status` 1164 | else 1165 | corn_status=`service cron status` 1166 | fi 1167 | if [[ -z ${corn_status} ]]; then 1168 | echo -e "\033[42;37m [信息] \033[0m 检测到没有安装 corn ,开始安装..." 1169 | if [[ ${release} = "centos" ]]; then 1170 | yum update && yum install crond -y 1171 | else 1172 | apt-get update && apt-get install cron -y 1173 | fi 1174 | if [[ ${release} = "centos" ]]; then 1175 | corn_status=`service crond status` 1176 | else 1177 | corn_status=`service cron status` 1178 | fi 1179 | [[ -z ${corn_status} ]] && echo -e "\033[41;37m [错误] \033[0m corn 安装失败 !" && exit 1 1180 | fi 1181 | echo "请输入数字 来选择你要做什么" 1182 | echo "1. 添加 定时任务" 1183 | echo "2. 删除 定时任务" 1184 | echo -e "\033[32m 注意: \033[0m暂时只能添加设置一个定时重启任务。" 1185 | echo 1186 | read -p "(默认回车取消):" setcron_select 1187 | [[ -z "${setcron_select}" ]] && exit 1 1188 | if [[ ${setcron_select} != "1" ]]; then 1189 | if [[ ${setcron_select} != "2" ]]; then 1190 | exit 1 1191 | fi 1192 | fi 1193 | cron_ssr=`crontab -l | grep "${ssr_file}/${auto_restart_cron}" | wc -l` 1194 | if [[ ${cron_ssr} > "0" ]]; then 1195 | crontab -l > ${ssr_file}"/crontab.bak" 1196 | sed -i "/\/etc\/shadowsocksr\/${auto_restart_cron}/d" ${ssr_file}"/crontab.bak" 1197 | crontab ${ssr_file}"/crontab.bak" 1198 | rm -rf ${ssr_file}"/crontab.bak" 1199 | cron_ssr=`crontab -l | grep "${ssr_file}/${auto_restart_cron}" | wc -l` 1200 | if [[ ${cron_ssr} > "0" ]]; then 1201 | echo -e "\033[41;37m [错误] \033[0m corn 删除定时重启任务失败 !" && exit 1 1202 | fi 1203 | else 1204 | if [[ ${setcron_select} == "2" ]]; then 1205 | echo -e "\033[42;37m [信息] \033[0m corn 当前没有定时重启任务 !" && exit 1 1206 | fi 1207 | fi 1208 | if [[ ${setcron_select} == "2" ]]; then 1209 | echo -e "\033[42;37m [信息] \033[0m corn 删除定时重启任务成功 !" && exit 1 1210 | fi 1211 | SetCrontab_interval 1212 | cat > ${ssr_file}"/"${auto_restart_cron}<<-EOF 1213 | #!/usr/bin/env bash 1214 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 1215 | export PATH 1216 | server_ss_file="/etc/shadowsocksr/shadowsocks/" 1217 | server_file=${server_ss_file}"server.py" 1218 | config_user_file="/etc/shadowsocksr/user-config.json" 1219 | 1220 | [ ! -e $config_user_file ] && exit 1 1221 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 1222 | [ ! -z "${PID}" ] && kill -9 ${PID} 1223 | cd ${server_ss_file} 1224 | nohup python server.py a >> ssserver.log 2>&1 & 1225 | sleep 2s 1226 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 1227 | if [ ! -z "${PID}" ]; then 1228 | echo -e " ShadowsocksR 重启完成 !" 1229 | else 1230 | echo -e "\033[41;37m [错误] \033[0m ShadowsocksR 启动失败 !" 1231 | fi 1232 | EOF 1233 | if [[ -s ${ssr_file}"/"${auto_restart_cron} ]]; then 1234 | chmod +x ${ssr_file}"/"${auto_restart_cron} 1235 | crontab -l > ${ssr_file}"/crontab.bak" 1236 | echo "${crontab_interval} /bin/bash ${ssr_file}/${auto_restart_cron}" >> ${ssr_file}"/crontab.bak" 1237 | crontab ${ssr_file}"/crontab.bak" 1238 | rm -rf ${ssr_file}"/crontab.bak" 1239 | cron_ssr=`crontab -l | grep "${ssr_file}/${auto_restart_cron}" | wc -l` 1240 | if [[ ${cron_ssr} > "0" ]]; then 1241 | cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 1242 | if [[ ${release} = "centos" ]]; then 1243 | service crond restart 1244 | else 1245 | service cron restart 1246 | fi 1247 | echo -e "\033[42;37m [信息] \033[0m ShadowsocksR 定时重启任务添加成功 !" 1248 | else 1249 | echo -e "\033[41;37m [错误] \033[0m ShadowsocksR 定时重启任务添加失败 !" && exit 1 1250 | fi 1251 | 1252 | else 1253 | rm -rf ${ssr_file}"/"${auto_restart_cron} 1254 | echo -e "\033[41;37m [错误] \033[0m ShadowsocksR 重启脚本写入失败,请检查 !" 1255 | fi 1256 | } 1257 | # 设置设备数 1258 | Client_limit(){ 1259 | SSR_install_status 1260 | getUser 1261 | if [[ ${protocol} != "origin" ]]; then 1262 | protocol_1=`echo ${protocol} | sed 's/_compatible//g'` 1263 | if [[ ${protocol} == ${protocol_1} ]]; then 1264 | while true 1265 | do 1266 | echo 1267 | echo -e "请输入 ShadowsocksR账号欲限制的设备数 (\033[32m auth_* 系列协议 不兼容原版才有效 \033[0m)" 1268 | echo -e "\033[32m 注意: \033[0m该设备数限制,指的是每个端口同一时间能链接的客户端数量(多端口模式,每个端口都是独立计算)。" 1269 | read -p "(回车 默认无限):" ssprotocol_param 1270 | [[ -z "$ssprotocol_param" ]] && ssprotocol_param="" && break 1271 | expr ${ssprotocol_param} + 0 &>/dev/null 1272 | if [[ $? -eq 0 ]]; then 1273 | if [[ ${ssprotocol_param} -ge 1 ]] && [[ ${ssprotocol_param} -le 99999 ]]; then 1274 | echo && echo ${Separator_1} && echo -e " 设备数 : \033[32m${ssprotocol_param}\033[0m" && echo ${Separator_1} && echo 1275 | break 1276 | else 1277 | echo "输入错误,请输入正确的数字 !" 1278 | fi 1279 | else 1280 | echo "输入错误,请输入正确的数字 !" 1281 | fi 1282 | done 1283 | else 1284 | echo -e "\033[41;37m [错误] \033[0m ShadowsocksR当前协议为 兼容原版(${protocol}),限制设备数无效 !" && exit 1 1285 | fi 1286 | else 1287 | echo -e "\033[41;37m [错误] \033[0m ShadowsocksR当前协议为 原版(origin),限制设备数无效 !" && exit 1 1288 | fi 1289 | set_config_protocol_param 1290 | RestartSSR 1291 | echo -e "\033[42;37m [信息] \033[0m ShadowsocksR 设备数限制 已修改 !" 1292 | } 1293 | Speed_limit(){ 1294 | SSR_install_status 1295 | # 设置单线程限速 1296 | while true 1297 | do 1298 | echo 1299 | echo -e "请输入 你要设置的每个端口 单线程 限速上限(单位:KB/S)" 1300 | echo -e "\033[32m 注意: \033[0m这个指的是,每个端口 单线程的限速上限,多线程即无效。" 1301 | read -p "(回车 默认无限):" ssspeed_limit_per_con 1302 | [[ -z "$ssspeed_limit_per_con" ]] && ssspeed_limit_per_con=0 && break 1303 | expr ${ssspeed_limit_per_con} + 0 &>/dev/null 1304 | if [[ $? -eq 0 ]]; then 1305 | if [[ ${ssspeed_limit_per_con} -ge 1 ]] && [[ ${ssspeed_limit_per_con} -le 99999 ]]; then 1306 | echo && echo ${Separator_1} && echo -e " 单端口单线程 : \033[32m${ssspeed_limit_per_con} KB/S \033[0m" && echo ${Separator_1} && echo 1307 | break 1308 | else 1309 | echo "输入错误,请输入正确的数字 !" 1310 | fi 1311 | else 1312 | echo "输入错误,请输入正确的数字 !" 1313 | fi 1314 | done 1315 | # 设置端口总限速 1316 | while true 1317 | do 1318 | echo 1319 | echo -e "请输入 你要设置的每个端口 总速度 限速上限(单位:KB/S)" 1320 | echo -e "\033[32m 注意: \033[0m这个指的是,每个端口 总速度 限速上限,单个端口整体限速。" 1321 | read -p "(回车 默认无限):" ssspeed_limit_per_user 1322 | [[ -z "$ssspeed_limit_per_user" ]] && ssspeed_limit_per_user=0 && break 1323 | expr ${ssspeed_limit_per_user} + 0 &>/dev/null 1324 | if [[ $? -eq 0 ]]; then 1325 | if [[ ${ssspeed_limit_per_user} -ge 1 ]] && [[ ${ssspeed_limit_per_user} -le 99999 ]]; then 1326 | echo && echo ${Separator_1} && echo -e " 单端口总限速 : \033[32m${ssspeed_limit_per_user} KB/S \033[0m" && echo ${Separator_1} && echo 1327 | break 1328 | else 1329 | echo "输入错误,请输入正确的数字 !" 1330 | fi 1331 | else 1332 | echo "输入错误,请输入正确的数字 !" 1333 | fi 1334 | done 1335 | getUser 1336 | set_config_speed_limit_per 1337 | RestartSSR 1338 | echo -e "\033[42;37m [信息] \033[0m ShadowsocksR 端口限速 已修改 !" 1339 | } 1340 | 1341 | #菜单判断 1342 | echo 1343 | echo && echo "请输入一个数字来选择对应的选项。" && echo 1344 | echo -e "\033[32m 1. \033[0m安装 ShadowsocksR" 1345 | echo -e "\033[32m 2. \033[0m安装 libsodium(chacha20)" 1346 | echo -e "\033[32m 3. \033[0m显示 单/多端口 账号信息" 1347 | echo -e "\033[32m 4. \033[0m显示 单/多端口 连接信息" 1348 | echo -e "\033[32m 5. \033[0m修改 单端口用户配置" 1349 | echo -e "\033[32m 6. \033[0m手动 修改 用户配置" 1350 | echo -e "\033[32m 7. \033[0m卸载 ShadowsocksR" 1351 | echo -e "\033[32m 8. \033[0m更新 ShadowsocksR" 1352 | echo "——————————————————" 1353 | echo -e "\033[32m 9. \033[0m切换 单/多端口 模式" 1354 | echo -e "\033[32m 10. \033[0m添加 多端口用户配置" 1355 | echo -e "\033[32m 11. \033[0m修改 多端口用户配置" 1356 | echo -e "\033[32m 12. \033[0m删除 多端口用户配置" 1357 | echo "——————————————————" 1358 | echo -e "\033[32m 13. \033[0m启动 ShadowsocksR" 1359 | echo -e "\033[32m 14. \033[0m停止 ShadowsocksR" 1360 | echo -e "\033[32m 15. \033[0m重启 ShadowsocksR" 1361 | echo -e "\033[32m 16. \033[0m查看 ShadowsocksR 状态" 1362 | echo -e "\033[32m 17. \033[0m查看 ShadowsocksR 日志" 1363 | echo "——————————————————" 1364 | echo -e "\033[32m 18. \033[0m安装 锐速(ServerSpeeder)" 1365 | echo -e "\033[32m 19. \033[0m停止 锐速(ServerSpeeder)" 1366 | echo -e "\033[32m 20. \033[0m重启 锐速(ServerSpeeder)" 1367 | echo -e "\033[32m 21. \033[0m查看 锐速(ServerSpeeder) 状态" 1368 | echo -e "\033[32m 22. \033[0m卸载 锐速(ServerSpeeder)" 1369 | echo "——————————————————" 1370 | check_sys 1371 | [[ ${release} != "centos" ]] && echo -e "\033[32m 23. \033[0m安装 BBR(需更换内核, 存在风险)" 1372 | echo -e "\033[32m 24. \033[0m封禁 BT/PT/垃圾邮件(SPAM)" 1373 | echo -e "\033[32m 25. \033[0m设置 ShadowsocksR 定时重启" 1374 | echo -e "\033[32m 26. \033[0m设置 ShadowsocksR 设备数限制" 1375 | echo -e "\033[32m 27. \033[0m设置 ShadowsocksR 速度限制" 1376 | echo "——————————————————" 1377 | echo -e " 注意事项: 锐速/BBR 不支持 OpenVZ !" 1378 | if [[ -e $config_user_file ]]; then 1379 | PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` 1380 | if [[ ! -z "${PID}" ]]; then 1381 | echo -e " 当前状态:\033[42;37m 已安装 \033[0m 并 \033[42;37m 已启动 \033[0m" 1382 | else 1383 | echo -e " 当前状态:\033[42;37m 已安装 \033[0m 但 \033[41;37m 未启动 \033[0m" 1384 | fi 1385 | now_mode_1=`jq '.port_password' ${config_user_file}` 1386 | if [[ "${now_mode_1}" = "null" ]]; then 1387 | echo -e " 当前模式:\033[42;37m 单端口 \033[0m" 1388 | else 1389 | echo -e " 当前模式:\033[42;37m 多端口 \033[0m" 1390 | fi 1391 | else 1392 | echo -e " 当前状态:\033[41;37m 未安装 \033[0m" 1393 | fi 1394 | echo 1395 | read -p "(请输入 1-27 数字):" num 1396 | 1397 | case "$num" in 1398 | 1) 1399 | installSSR 1400 | ;; 1401 | 2) 1402 | installLibsodium 1403 | ;; 1404 | 3) 1405 | viewUser 1406 | ;; 1407 | 4) 1408 | View_user_connection_info 1409 | ;; 1410 | 5) 1411 | modifyUser 1412 | ;; 1413 | 6) 1414 | manuallyModifyUser 1415 | ;; 1416 | 7) 1417 | UninstallSSR 1418 | ;; 1419 | 8) 1420 | UpdateSSR 1421 | ;; 1422 | 9) 1423 | Port_mode_switching 1424 | ;; 1425 | 10) 1426 | Add_multi_port_user 1427 | ;; 1428 | 11) 1429 | Modify_multi_port_user 1430 | ;; 1431 | 12) 1432 | Del_multi_port_user 1433 | ;; 1434 | 13) 1435 | StartSSR 1436 | ;; 1437 | 14) 1438 | StopSSR 1439 | ;; 1440 | 15) 1441 | RestartSSR 1442 | ;; 1443 | 16) 1444 | StatusSSR 1445 | ;; 1446 | 17) 1447 | TailSSR 1448 | ;; 1449 | 18) 1450 | installServerSpeeder 1451 | ;; 1452 | 19) 1453 | StopServerSpeeder 1454 | ;; 1455 | 20) 1456 | RestartServerSpeeder 1457 | ;; 1458 | 21) 1459 | StatusServerSpeeder 1460 | ;; 1461 | 22) 1462 | UninstallServerSpeeder 1463 | ;; 1464 | 23) 1465 | InstallBBR 1466 | ;; 1467 | 24) 1468 | BanBTPTSPAM 1469 | ;; 1470 | 25) 1471 | SetCrontab 1472 | ;; 1473 | 26) 1474 | Client_limit 1475 | ;; 1476 | 27) 1477 | Speed_limit 1478 | ;; 1479 | *) 1480 | echo '请选择并输入 1-27 的数字。' 1481 | ;; 1482 | esac --------------------------------------------------------------------------------