#!/usr/bin/env bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH #================================================= # System Required: CentOS/Debian/Ubuntu # Description: Snell Server 管理脚本 # Author: 翠花 (整点猫咪修改版) # WebSite: https://surge.tel #================================================= sh_ver="1.4.9" filepath=$(cd "$(dirname "$0")"; pwd) file_1=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') FOLDER="/etc/snell/" FILE="/usr/local/bin/snell-server" CONF="/etc/snell/config.conf" Now_ver_File="/etc/snell/ver.txt" Local="/etc/sysctl.d/local.conf" Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" && Yellow_font_prefix="\033[0;33m" Info="${Green_font_prefix}[信息]${Font_color_suffix}" Error="${Red_font_prefix}[错误]${Font_color_suffix}" Tip="${Yellow_font_prefix}[注意]${Font_color_suffix}" check_root(){ [[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1 } #检查系统 check_sys(){ if [[ -f /etc/redhat-release ]]; then release="centos" elif cat /etc/issue | grep -q -E -i "debian"; then release="debian" elif cat /etc/issue | grep -q -E -i "ubuntu"; then release="ubuntu" elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then release="centos" elif cat /proc/version | grep -q -E -i "debian"; then release="debian" elif cat /proc/version | grep -q -E -i "ubuntu"; then release="ubuntu" elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then release="centos" fi } Installation_dependency(){ if [[ ${release} == "centos" ]]; then yum update && yum install gzip wget curl unzip jq -y else apt-get update && apt-get install gzip wget curl unzip jq -y fi sysctl -w net.core.rmem_max=26214400 sysctl -w net.core.rmem_default=26214400 \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime } #检查系统内核版本 sysArch() { uname=$(uname -m) if [[ "$uname" == "i686" ]] || [[ "$uname" == "i386" ]]; then arch="i386" elif [[ "$uname" == *"armv7"* ]] || [[ "$uname" == "armv6l" ]]; then arch="armv7l" elif [[ "$uname" == *"armv8"* ]] || [[ "$uname" == "aarch64" ]]; then arch="aarch64" else arch="amd64" fi } #开启系统 TCP Fast Open enable_systfo() { kernel=$(uname -r | awk -F . '{print $1}') if [ "$kernel" -ge 3 ]; then echo 3 >/proc/sys/net/ipv4/tcp_fastopen [[ ! -e $Local ]] && echo "fs.file-max = 51200 net.core.rmem_max = 67108864 net.core.wmem_max = 67108864 net.core.rmem_default = 65536 net.core.wmem_default = 65536 net.core.netdev_max_backlog = 4096 net.core.somaxconn = 4096 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 10000 65000 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_fastopen = 3 net.ipv4.tcp_rmem = 4096 87380 67108864 net.ipv4.tcp_wmem = 4096 65536 67108864 net.ipv4.tcp_mtu_probing = 1 net.core.default_qdisc=fq net.ipv4.tcp_congestion_control = bbr" >>/etc/sysctl.d/local.conf && sysctl --system >/dev/null 2>&1 else echo -e "$Error系统内核版本过低,无法支持 TCP Fast Open !" fi } check_installed_status(){ [[ ! -e ${FILE} ]] && echo -e "${Error} Snell Server 没有安装,请检查 !" && exit 1 } check_status(){ status=`systemctl status snell-server | grep Active | awk '{print $3}' | cut -d "(" -f2 | cut -d ")" -f1` } stable_Download() { echo -e "${Info} 正在请求下载 Snell Server ……" wget --no-check-certificate -N "https://dl.nssurge.com/snell/snell-server-v4.0.1-linux-${arch}.zip" if [[ ! -e "snell-server-v4.0.1-linux-${arch}.zip" ]]; then echo -e "${Error} Snell Server 下载失败!" return 1 && exit 1 else unzip -o "snell-server-v4.0.1-linux-${arch}.zip" fi if [[ ! -e "snell-server" ]]; then echo -e "${Error} Snell Server 解压失败 !" echo -e "${Error} Snell Server 安装失败 !" return 1 && exit 1 else rm -rf "snell-server-v4.0.1-linux-${arch}.zip" chmod +x snell-server mv -f snell-server "${FILE}" echo "v4.0.1" > ${Now_ver_File} echo -e "${Info} Snell Server 主程序下载安装完毕!" return 0 fi } Download() { if [[ ! -e "${FOLDER}" ]]; then mkdir "${FOLDER}" # else # [[ -e "${FILE}" ]] && rm -rf "${FILE}" fi stable_Download if [[ $? != 0 ]]; then backup_Download fi } Service(){ echo ' [Unit] Description= Snell Service After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service [Service] LimitNOFILE=32767 Type=simple User=root Restart=on-failure RestartSec=5s ExecStartPre=/bin/sh -c 'ulimit -n 51200' ExecStart=/usr/local/bin/snell-server -c /etc/snell/config.conf [Install] WantedBy=multi-user.target' > /etc/systemd/system/snell-server.service systemctl enable --now snell-server echo -e "${Info} Snell Server 服务配置完成 !" } Write_config(){ cat > ${CONF}<<-EOF [snell-server] listen = ::0:${port} ipv6 = ${ipv6} psk = ${psk} obfs = ${obfs} obfs-host = ${host} tfo = ${tfo} version = ${ver} EOF } Read_config(){ [[ ! -e ${CONF} ]] && echo -e "${Error} Snell Server 配置文件不存在 !" && exit 1 ipv6=$(cat ${CONF}|grep 'ipv6 = '|awk -F 'ipv6 = ' '{print $NF}') port=$(cat ${CONF}|grep ':'|awk -F ':' '{print $NF}') psk=$(cat ${CONF}|grep 'psk = '|awk -F 'psk = ' '{print $NF}') obfs=$(cat ${CONF}|grep 'obfs = '|awk -F 'obfs = ' '{print $NF}') host=$(cat ${CONF}|grep 'obfs-host = '|awk -F 'obfs-host = ' '{print $NF}') tfo=$(cat ${CONF}|grep 'tfo = '|awk -F 'tfo = ' '{print $NF}') ver=$(cat ${CONF}|grep 'version = '|awk -F 'version = ' '{print $NF}') } Set_port(){ while true do echo -e "${Tip} 本步骤不涉及系统防火墙端口操作,请手动放行相应端口!" echo -e "请输入 Snell Server 端口 [1-65535]" read -e -p "(默认: 2345):" port [[ -z "${port}" ]] && port="2345" echo $((${port}+0)) &>/dev/null if [[ $? -eq 0 ]]; then if [[ ${port} -ge 1 ]] && [[ ${port} -le 65535 ]]; then echo && echo "==============================" echo -e "端口 : ${Red_background_prefix} ${port} ${Font_color_suffix}" echo "==============================" && echo break else echo "输入错误, 请输入正确的端口。" fi else echo "输入错误, 请输入正确的端口。" fi done } Set_ipv6(){ echo -e "是否开启 IPv6 解析 ? ================================== ${Green_font_prefix} 1.${Font_color_suffix} 开启 ${Green_font_prefix} 2.${Font_color_suffix} 关闭 ==================================" read -e -p "(默认:1.开启):" ipv6 [[ -z "${ipv6}" ]] && ipv6="1" if [[ ${ipv6} == "1" ]]; then ipv6=true else ipv6=false fi echo && echo "==================================" echo -e "IPv6 解析 开启状态:${Red_background_prefix} ${ipv6} ${Font_color_suffix}" echo "==================================" && echo } Set_psk(){ echo "请输入 Snell Server 密钥 [0-9][a-z][A-Z]" read -e -p "(默认: 随机生成):" psk [[ -z "${psk}" ]] && psk=$(tr -dc A-Za-z0-9