#!/bin/bash # singbox一键安装脚本 # Author: Slotheve # 修复原脚本错误,添加290,291处脚本,修改298处/usr/local/bin为/usr/local/bin/sing-box cp /root/sa.sh /bin/sa && chmod +x /bin/sa RED="\033[31m" GREEN="\033[32m" YELLOW="\033[33m" BLUE="\033[36m" PLAIN='\033[0m' CONFIG_FILE="/usr/local/etc/sing-box/config.json" OS=`hostnamectl | grep -i system | cut -d: -f2` stls_conf="/etc/systemd/system/shadowtls.service" STLS="false" IP=`curl -sL -4 ip.sb` VMESS="false" VLESS="false" TROJAN="false" SS="false" SOCKS="false" ciphers=( aes-256-gcm 2022-blake3-aes-256-gcm chacha20-ietf-poly1305 2022-blake3-chacha20-poly1305 none ) domains=( gateway.icloud.com cn.bing.com mp.weixin.qq.com 自定义 ) checkSystem() { result=$(id | awk '{print $1}') if [[ $result != "uid=0(root)" ]]; then result=$(id | awk '{print $1}') if [[ $result != "用户id=0(root)" ]]; then colorEcho $RED " 请以root身份执行该脚本" exit 1 fi fi res=`which yum 2>/dev/null` if [[ "$?" != "0" ]]; then res=`which apt 2>/dev/null` if [[ "$?" != "0" ]]; then colorEcho $RED " 不受支持的Linux系统" exit 1 fi PMT="apt" CMD_INSTALL="apt install -y " CMD_REMOVE="apt remove -y " CMD_UPGRADE="apt update; apt upgrade -y; apt autoremove -y" else PMT="yum" CMD_INSTALL="yum install -y " CMD_REMOVE="yum remove -y " CMD_UPGRADE="yum update -y" fi res=`which systemctl 2>/dev/null` if [[ "$?" != "0" ]]; then colorEcho $RED " 系统版本过低,请升级到最新版本" exit 1 fi } colorEcho() { echo -e "${1}${@:2}${PLAIN}" } config() { local conf=`grep wsSettings $CONFIG_FILE` if [[ -z "$conf" ]]; then echo no return fi echo yes } status() { if [[ ! -f /usr/local/bin/sing-box ]]; then echo 0 return fi if [[ ! -f $CONFIG_FILE ]]; then echo 1 return fi port=`grep port $CONFIG_FILE| head -n 1| cut -d: -f2| tr -d \",' '` res=`ss -nutlp| grep ${port} | grep -i sing-box` if [[ -z "$res" ]]; then echo 2 return fi if [[ `config` != "yes" ]]; then echo 3 fi } Check_singbox() { ress=`status` if [[ "${ress}" = "0" || "${ress}" = "1" ]]; then colorEcho $RED "未安装Singbox, 请先安装Singbox" exit 1 fi } statusText() { res=`status` case $res in 2) echo -e ${GREEN}已安装${PLAIN} ${RED}未运行${PLAIN} ;; 3) echo -e ${GREEN}已安装${PLAIN} ${GREEN}正在运行${PLAIN} ;; *) echo -e ${RED}未安装${PLAIN} ;; esac } normalizeVersion() { if [ -n "$1" ]; then case "$1" in v*) echo "$1" ;; http*) echo "v1.2.5" ;; *) echo "v$1" ;; esac else echo "" fi } # 1: new Xray. 0: no. 1: yes. 2: not installed. 3: check failed. getVersion() { VER=v`/usr/local/bin/sing-box version|head -n1 | awk '{print $3}'` RETVAL=$? CUR_VER="$(normalizeVersion "$(echo "$VER" | head -n 1 | cut -d " " -f2)")" TAG_URL="https://ghproxy.lvedong.eu.org/https://api.github.com/repos/SagerNet/sing-box/releases/latest" NEW_VER_V="$(normalizeVersion "$(curl -s "${TAG_URL}" --connect-timeout 10| grep -Eo '\"tag_name\"(.*?)\",' | cut -d\" -f4)")" NEW_VER=`curl -s "${TAG_URL}" --connect-timeout 10| grep -Eo '\"tag_name\"(.*?)\",' | cut -d\" -f4 | awk -F 'v' '{print $2}'` if [[ $? -ne 0 ]] || [[ $NEW_VER_V == "" ]]; then colorEcho $RED " 检查Sing-Box版本信息失败,请检查网络" return 3 elif [[ $RETVAL -ne 0 ]];then return 2 elif [[ $NEW_VER_V != $CUR_VER ]];then return 1 fi return 0 } selectciphers() { for ((i=1;i<=${#ciphers[@]};i++ )); do hint="${ciphers[$i-1]}" echo -e "${green}${i}${plain}) ${hint}" done read -p " 你选择什么加密方式(默认: ${ciphers[0]}):" pick [ -z "$pick" ] && pick=1 expr ${pick} + 1 &>/dev/null if [ $? -ne 0 ]; then echo -e "[${red}Error${plain}] Please enter a number" continue fi if [[ "$pick" -lt 1 || "$pick" -gt ${#ciphers[@]} ]]; then echo -e "${BLUE}[${PLAIN}${RED}Error${PLAIN}${BLUE}]${PLAIN} ${BLUE}请正确选择${PLAIN}" exit 0 fi METHOD=${ciphers[$pick-1]} colorEcho $BLUE " 加密:${ciphers[$pick-1]}" } getData() { read -p " 请输入SingBox监听端口[100-65535的一个数字]:" PORT [[ -z "${PORT}" ]] && PORT=`shuf -i200-65000 -n1` if [[ "${PORT:0:1}" = "0" ]]; then colorEcho ${RED} " 端口不能以0开头" exit 1 fi colorEcho ${BLUE} " SingBox端口:$PORT" if [[ "$TROJAN" = "true" ]]; then echo "" read -p " 请设置trojan密码(不输则随机生成):" PASSWORD [[ -z "$PASSWORD" ]] && PASSWORD=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1` colorEcho $BLUE " 密码:$PASSWORD" echo "" read -p " 请设置trojan域名(不输则随机生成):" DOMAIN [[ -z "$DOMAIN" ]] && DOMAIN=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1`.xyz colorEcho $BLUE " 域名:$DOMAIN" echo "" read -p " 请设置域名证书(不输默认生成):" KEY [[ -z "$KEY" ]] && mkdir -pv /usr/local/etc/sing-box && openssl genrsa \ -out /usr/local/etc/sing-box/sing-box.key 2048 && chmod \ +x /usr/local/etc/sing-box/sing-box.key && KEY="/usr/local/etc/sing-box/sing-box.key" colorEcho $BLUE " 密钥路径:$KEY" echo "" read -p " 请设置域名证书(不输默认生成):" CERT [[ -z "$CERT" ]] && openssl req -new -x509 -days 3650 -key /usr/local/etc/sing-box/sing-box.key \ -out /usr/local/etc/sing-box/sing-box.crt -subj "/C=US/ST=LA/L=LAX/O=Xray/OU=Trojan/CN=&DOMAIN" \ && chmod +x /usr/local/etc/sing-box/sing-box.crt && CERT="/usr/local/etc/sing-box/sing-box.crt" colorEcho $BLUE " 证书路径:$CERT" elif [[ "$SS" = "true" ]]; then selectciphers if [[ "$METHOD" = "2022-blake3-aes-256-gcm" || "$METHOD" = "2022-blake3-chacha20-poly1305" ]]; then echo "" read -p " 请设置ss2022密钥(不会设置请默认生成):" PASSWORD [[ -z "$PASSWORD" ]] && PASSWORD=`openssl rand -base64 32` colorEcho $BLUE " 密码:$PASSWORD" else echo "" read -p " 请设置ss密码(不输则随机生成):" PASSWORD [[ -z "$PASSWORD" ]] && PASSWORD=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1` colorEcho $BLUE " 密码:$PASSWORD" fi elif [[ "$VLESS" = "true" ]]; then echo "" read -p " 请设置vless的UUID(不输则随机生成):" UUID [[ -z "$UUID" ]] && UUID="$(cat '/proc/sys/kernel/random/uuid')" colorEcho $BLUE " UUID:$UUID" elif [[ "$SOCKS" = "true" ]]; then echo "" read -p " 请设置socks的用户名(不输则随机生成):" USER [[ -z "$USER" ]] && USER=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 6 | head -n 1` colorEcho $BLUE " 用户名:$USER" echo "" read -p " 请设置socks的密码(不输则随机生成):" PASSWORD [[ -z "$PASSWORD" ]] && PASSWORD=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1` colorEcho $BLUE " 密码:$PASSWORD" elif [[ "$VMESS" = "true" ]]; then echo "" read -p " 请设置vmess的UUID(不输则随机生成):" UUID [[ -z "$UUID" ]] && UUID="$(cat '/proc/sys/kernel/random/uuid')" colorEcho $BLUE " UUID:$UUID" fi } setSelinux() { if [[ -s /etc/selinux/config ]] && grep 'SELINUX=enforcing' /etc/selinux/config; then sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config setenforce 0 fi } archAffix() { case "$(uname -m)" in x86_64|amd64) ARCH="amd64" CPU="x86_64" ;; armv8|aarch64) ARCH="arm64" CPU="aarch64" ;; *) colorEcho $RED " 不支持的CPU架构!" exit 1 ;; esac return 0 } installSingBox() { archAffix rm -rf /tmp/sing-box mkdir -p /tmp/sing-box DOWNLOAD_LINK="https://ghproxy.lvedong.eu.org/https://github.com/SagerNet/sing-box/releases/download/${NEW_VER_V}/sing-box-${NEW_VER}-linux-${ARCH}.tar.gz" colorEcho $BLUE " 下载SingBox: ${DOWNLOAD_LINK}" wget -O /tmp/sing-box/sing-box.tar.gz ${DOWNLOAD_LINK} if [ $? != 0 ];then colorEcho $RED " 下载SingBox文件失败,请检查服务器网络设置" exit 1 fi systemctl stop sing-box rm -rf /usr/local/bin mkdir -p /usr/local/bin mkdir -p /usr/local/etc/sing-box /usr/local/share/sing-box && \ tar -xvf /tmp/sing-box/sing-box.tar.gz -C /tmp/sing-box cp /tmp/sing-box/sing-box-${NEW_VER}-linux-${ARCH}/sing-box /usr/local/bin/sing-box rm -rf /tmp/sing-box chmod +x /usr/local/bin/sing-box || { colorEcho $RED " SingBox安装失败" exit 1 } cat >/etc/systemd/system/sing-box.service<<-EOF [Unit] Description=sing-box Service Documentation=https://sing-box.sagernet.org/ After=network.target nss-lookup.target Wants=network.target [Service] Type=simple ExecStart=/usr/local/bin/sing-box run -c ${CONFIG_FILE} Restart=on-failure RestartSec=30s RestartPreventExitStatus=23 LimitNPROC=10000 LimitNOFILE=1000000 [Install] WantedBy=multi-user.target EOF chmod 644 /etc/systemd/system/sing-box.service systemctl daemon-reload systemctl enable sing-box.service } Download_stls() { rm -rf /usr/local/etc/sing-box/shadowtls archAffix TAG_URL="https://ghproxy.lvedong.eu.org/https://api.github.com/repos/ihciah/shadow-tls/releases/latest" DOWN_VER=`curl -s "${TAG_URL}" --connect-timeout 10| grep -Eo '\"tag_name\"(.*?)\",' | cut -d\" -f4` DOWNLOAD_LINK="https://ghproxy.lvedong.eu.org/https://github.com/ihciah/shadow-tls/releases/download/${DOWN_VER}/shadow-tls-${CPU}-unknown-linux-musl" colorEcho $YELLOW "下载ShadowTLS: ${DOWNLOAD_LINK}" curl -L -H "Cache-Control: no-cache" -o /usr/local/etc/sing-box/shadowtls ${DOWNLOAD_LINK} chmod +x /usr/local/etc/sing-box/shadowtls } Generate_stls() { Set_sport Set_domain Set_pass } Deploy_stls() { cd /etc/systemd/system cat > shadowtls.service<<-EOF [Unit] Description=Shadow-TLS Server Service Documentation=man:sstls-server After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/usr/local/etc/sing-box/shadowtls --fastopen --v3 server --listen 0.0.0.0:$SPORT --server 127.0.0.1:$PORT --tls $DOMAIN --password $PASS StandardOutput=syslog StandardError=syslog SyslogIdentifier=shadow-tls [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable shadowtls systemctl restart shadowtls colorEcho $BLUE "ShadowTLS安装完成" } Set_sport() { read -p $'请输入协议端口 [1-65535]:' PORT echo $((${PORT}+0)) &>/dev/null if [[ $? -eq 0 ]]; then if [[ ${PORT} -ge 1 ]] && [[ ${PORT} -le 65535 ]]; then colorEcho $BLUE "协议端口: ${PORT}" echo "" else colorEcho $RED "输入错误, 请输入正确的端口。" echo "" exit 1 fi else colorEcho $RED "输入错误, 请输入数字。" echo "" exit 1 fi read -p $'请输入 ShadowTLS 端口 [1-65535]\n(默认: 9999,回车):' SPORT [[ -z "${SPORT}" ]] && SPORT="9999" echo $((${SPORT}+0)) &>/dev/null if [[ $? -eq 0 ]]; then if [[ ${SPORT} -ge 1 ]] && [[ ${SPORT} -le 65535 ]]; then colorEcho $BLUE "端口: ${SPORT}" echo "" else colorEcho $RED "输入错误, 请输入正确的端口。" echo "" exit 1 fi else colorEcho $RED "输入错误, 请输入数字。" echo "" exit 1 fi } Set_domain() { for ((i=1;i<=${#domains[@]};i++ )); do hint="${domains[$i-1]}" echo -e "${GREEN}${i}${PLAIN}) ${hint}" done read -p "请选择域名[1-4] (默认: ${domains[0]}):" pick [ -z "$pick" ] && pick=1 expr ${pick} + 1 &>/dev/null if [ $? -ne 0 ]; then colorEcho $RED "错误, 请输入正确选项" continue fi if [[ "$pick" -lt 1 || "$pick" -gt ${#domains[@]} ]]; then echo -e "${red}错误, 请输入正确选项${plain}" exit 0 fi DOMAIN=${domains[$pick-1]} if [[ "$pick" = "4" ]]; then colorEcho $BLUE "已选择: ${domains[$pick-1]}" echo "" read -p $'请输入自定义域名: ' DOMAIN if [[ -z "${DOMAIN}" ]]; then colorEcho $RED "错误, 请输入正确的域名" echo "" exit 1 else colorEcho $BLUE "域名:$DOMAIN" echo "" fi else colorEcho $BLUE "域名:${domains[$pick-1]}" echo "" fi } Set_pass() { read -p $'请设置ShadowTLS的密码\n(默认随机生成, 回车):' PASS [[ -z "$PASS" ]] && PASS=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1` colorEcho $BLUE " 密码:$PASS" echo "" } vmessConfig() { cat > $CONFIG_FILE<<-EOF { "inbounds":[ { "type": "vmess", "listen":"0.0.0.0", "listen_port":$PORT, "tag":"VMessWS", "users": [{ "uuid":"$UUID", "alterId": 0 }], "transport": { "headers": { "Host": [ "hnqywd.ha.189.cn" ] }, "type": "ws", "path": "/", "max_early_data": 2048, "early_data_header_name": "Sec-WebSocket-Protocol" } } ], "outbounds": [{ "type": "direct" }] } EOF } vlessConfig() { cat > $CONFIG_FILE<<-EOF { "inbounds": [ { "type": "vless", "listen": "0.0.0.0", "listen_port": $PORT, "users": [{ "uuid": "$UUID", "flow": "" }], "transport": { "headers": { "Host": [ "hnqywd.ha.189.cn" ] }, "type": "ws", "path": "", "max_early_data": 2048, "early_data_header_name": "Sec-WebSocket-Protocol" } } ], "outbounds": [{ "type": "direct" } ] } EOF } trojanConfig() { cat > $CONFIG_FILE<<-EOF { "inbounds": [ { "type": "trojan", "listen": "0.0.0.0", "listen_port": $PORT, "domain_strategy": "prefer_ipv4", "users": [{ "password": "$PASSWORD" }], "tcp_fast_open": true, "udp_fragment": true, "sniff": true, "proxy_protocol": false, "tls": { "enabled": true, "server_name": "$DOMAIN", "certificate_path": "$CERT", "key_path": "$KEY" } } ], "outbounds": [{ "type": "direct" } ] } EOF } ssConfig() { cat > $CONFIG_FILE<<-EOF { "inbounds": [ { "type": "shadowsocks", "listen": "0.0.0.0", "listen_port": $PORT, "method": "$METHOD", "password": "$PASSWORD", "tcp_fast_open": true, "udp_fragment": true, "sniff": true, "proxy_protocol": false } ], "outbounds": [{ "type": "direct" } ] } EOF } socksConfig() { cat > $CONFIG_FILE<<-EOF { "inbounds": [ { "type": "socks", "listen": "0.0.0.0", "listen_port": $PORT, "users": [{ "username": "$USER", "password": "$PASSWORD" }], "tcp_fast_open": true, "udp_fragment": true, "sniff": true, "proxy_protocol": false } ], "outbounds": [{ "type": "direct" } ] } EOF } configSingBox() { mkdir -p /usr/local/sing-box if [[ "$VMESS" = "true" ]]; then vmessConfig elif [[ "$VLESS" = "true" ]]; then vlessConfig elif [[ "$TROJAN" = "true" ]]; then trojanConfig elif [[ "$SS" = "true" ]]; then ssConfig elif [[ "$SOCKS" = "true" ]]; then socksConfig fi } install() { getData $PMT clean all [[ "$PMT" = "apt" ]] && $PMT update $CMD_INSTALL wget vim tar openssl $CMD_INSTALL net-tools if [[ "$PMT" = "apt" ]]; then $CMD_INSTALL libssl-dev fi colorEcho $BLUE " 安装SingBox..." getVersion RETVAL="$?" if [[ $RETVAL == 0 ]]; then colorEcho $BLUE " SingBox最新版 ${CUR_VER} 已经安装" elif [[ $RETVAL == 3 ]]; then exit 1 else colorEcho $BLUE " 安装SingBox ${NEW_VER_V} ,架构$(archAffix)" installSingBox fi configSingBox setSelinux start showInfo } Install_stls() { Check_singbox Generate_stls Download_stls Deploy_stls ShowInfo_stls echo "" echo -e " ${YELLOW}请将${PLAIN}${RED} 端口 ${PLAIN}${YELLOW}替换为${PLAIN}${RED} ${sport} ${PLAIN}" } update() { res=`status` if [[ $res -lt 2 ]]; then colorEcho $RED " SingBox未安装,请先安装!" return fi getVersion RETVAL="$?" if [[ $RETVAL == 0 ]]; then colorEcho $BLUE " SingBox最新版 ${CUR_VER} 已经安装" elif [[ $RETVAL == 3 ]]; then exit 1 else colorEcho $BLUE " 安装SingBox ${NEW_VER} ,架构$(archAffix)" installXray stop start colorEcho $GREEN " 最新版SingBox安装成功!" fi } uninstall() { res=`status` if [[ $res -lt 2 ]]; then colorEcho $RED " SingBox未安装,请先安装!" return fi echo "" read -p " 确定卸载SingBox?[y/n]:" answer if [[ "${answer,,}" = "y" ]]; then if [[ -f "$stls_conf" ]]; then stop systemctl disable sing-box systemctl stop shadowtls systemctl disable shadowtls rm -rf /etc/systemd/system/sing-box.service rm -rf /etc/systemd/system/shadowtls.service systemctl daemon-reload rm -rf /usr/local/bin/sing-box rm -rf /bin/sa rm -rf /usr/local/etc/sing-box colorEcho $GREEN " SingBox卸载成功" else stop systemctl disable sing-box rm -rf /etc/systemd/system/sing-box.service systemctl daemon-reload rm -rf /usr/local/bin/sing-box rm -rf /usr/local/etc/sing-box rm -rf /bin/sa colorEcho $GREEN " SingBox卸载成功" fi elif [[ "${answer}" = "n" || -z "${answer}" ]]; then colorEcho $BLUE " 取消卸载" else colorEcho $RED " 输入错误, 请输入正确操作。" exit 1 fi } Uninstall_stls() { read -p $' 是否卸载ShadowTLS?[y/n]:\n (默认n, 回车)' answer if [[ "${answer}" = "y" ]]; then systemctl stop shadowtls systemctl disable shadowtls rm -rf /etc/systemd/system/shadowtls.service systemctl daemon-reload colorEcho $BLUE " ShadowTLS已经卸载完毕" elif [[ "${answer}" = "n" || -z "${answer}" ]]; then colorEcho $BLUE " 取消卸载" else colorEcho $RED " 输入错误, 请输入正确操作。" exit 1 fi } start() { res=`status` if [[ $res -lt 2 ]]; then colorEcho $RED " SingBox未安装,请先安装!" return fi systemctl restart sing-box sleep 2 port=`grep listen_port $CONFIG_FILE| head -n 1| cut -d: -f2| tr -d \",' '` res=`ss -nutlp| grep ${port} | grep -i sing-box` if [[ "$res" = "" ]]; then colorEcho $RED " SingBox启动失败,请检查日志或查看端口是否被占用!" else colorEcho $BLUE " SingBox启动成功" fi } stop() { systemctl stop sing-box colorEcho $BLUE " SingBox停止成功" } restart() { res=`status` if [[ $res -lt 2 ]]; then colorEcho $RED " SingBox未安装,请先安装!" return fi stop start } getConfigFileInfo() { protocol="vmess" network="ws" port=`grep listen_port $CONFIG_FILE | cut -d: -f2 | tr -d \",' '` uuid=`grep id $CONFIG_FILE | head -n1| cut -d: -f2 | tr -d \",' '` alterid=`grep alterId $CONFIG_FILE | cut -d: -f2 | tr -d \",' '` method=`grep method $CONFIG_FILE | cut -d: -f2 | tr -d \",' '` username=`grep username $CONFIG_FILE | cut -d: -f2 | tr -d \",' '` cert=`grep certificate_path $CONFIG_FILE | tail -n1| cut -d: -f2 | tr -d \",' '` key=`grep key_path $CONFIG_FILE | tail -n1 | cut -d: -f2 | tr -d \",' '` domain=`grep server_name $CONFIG_FILE | cut -d: -f2 | tr -d \",' '` singbox=`grep type $CONFIG_FILE | head -n1 | cut -d: -f2 | tr -d \",' '` password=`grep password $CONFIG_FILE | cut -d: -f2 | tr -d \",' '` if [[ "$singbox" = "$protocol" ]]; then protocol="vmess" elif [[ "$VLESS" != "$protocol" ]]; then protocol="$singbox" fi } outputVmess() { raw="{ \"v\":\"2\", \"ps\":\"\", \"add\":\"$IP\", \"port\":\"${port}\", \"id\":\"${uuid}\", \"aid\":\"$alterid\", \"net\":\"ws\", \"type\":\"none\", \"host\":\"hnqywd.ha.189.cn\", \"path\":\"\", \"tls\":\"\" }" link=`echo -n ${raw} | base64 -w 0` link="vmess://${link}" echo -e " ${BLUE}协议: ${PLAIN} ${RED}${protocol}${PLAIN}" echo -e " ${BLUE}IP(address): ${PLAIN} ${RED}${IP}${PLAIN}" echo -e " ${BLUE}端口(port):${PLAIN} ${RED}${port}${PLAIN}" echo -e " ${BLUE}id(uuid):${PLAIN} ${RED}${uuid}${PLAIN}" echo -e " ${BLUE}额外id(alterid):${PLAIN} ${RED}${alterid}${PLAIN}" echo -e " ${BLUE}传输协议(network):${PLAIN} ${RED}ws${PLAIN}" echo "" echo -e " ${BLUE}vmess链接:${PLAIN} $RED$link$PLAIN" } outputVless() { raw="${uuid}@$IP:${port}?encryption=none&type=ws&host=hnqywd.ha.189.cn&path=/" link="vless://${raw}" echo -e " ${BLUE}协议: ${PLAIN} ${RED}${protocol}${PLAIN}" echo -e " ${BLUE}IP(address): ${PLAIN} ${RED}${IP}${PLAIN}" echo -e " ${BLUE}端口(port):${PLAIN} ${RED}${port}${PLAIN}" echo -e " ${BLUE}id(uuid):${PLAIN} ${RED}${uuid}${PLAIN}" echo -e " ${BLUE}传输协议(network):${PLAIN} ${RED}ws${PLAIN}" echo "" echo -e " ${BLUE}vless链接:${PLAIN} $RED$link$PLAIN" } outputTrojan() { raw="${password}@$IP:${port}?type=tcp&security=tls&sni=$domain&headerType=none" link="trojan://${raw}" echo -e " ${BLUE}协议: ${PLAIN} ${RED}${protocol}${PLAIN}" echo -e " ${BLUE}IP/域名(address): ${PLAIN} ${RED}${IP}${PLAIN}" echo -e " ${BLUE}端口(port):${PLAIN} ${RED}${port}${PLAIN}" echo -e " ${BLUE}密码(password):${PLAIN} ${RED}${password}${PLAIN}" echo -e " ${BLUE}传输协议(network):${PLAIN} ${RED}tcp${PLAIN}" echo -e " ${BLUE}加密协议(security):${PLAIN} ${RED}tls${PLAIN}" echo -e " ${BLUE}域名(domain):${PLAIN} ${RED}${domain}${PLAIN}" echo -e " ${BLUE}证书路径(cert):${PLAIN} ${RED}${cert}${PLAIN}" echo -e " ${BLUE}密钥路径(key):${PLAIN} ${RED}${key}${PLAIN}" echo "" echo -e " ${BLUE}trojan链接:${PLAIN} $RED$link$PLAIN" echo -e " ${BLUE}非自定义证书路径请务必开启:${PLAIN} ${YELLOW}skip-cert-verify:${PLAIN} ${RED}true${PLAIN} ${YELLOW}(允许不安全连接)${PLAIN}" } outputSS() { raw="${method}:${password}@$IP:${port}" link=`echo -n ${raw} | base64 -w 0` link="ss://${link}" echo -e " ${BLUE}协议: ${PLAIN} ${RED}${protocol}${PLAIN}" echo -e " ${BLUE}IP/域名(address): ${PLAIN} ${RED}${IP}${PLAIN}" echo -e " ${BLUE}端口(port):${PLAIN} ${RED}${port}${PLAIN}" echo -e " ${BLUE}密码(password):${PLAIN} ${RED}${password}${PLAIN}" echo -e " ${BLUE}加密协议(method):${PLAIN} ${RED}${method}${PLAIN}" echo -e " ${BLUE}传输协议(network):${PLAIN} ${RED}tcp${PLAIN}" echo "" echo -e " ${BLUE}ss链接:${PLAIN} $RED$link$PLAIN" } outputSocks() { echo -e " ${BLUE}协议: ${PLAIN} ${RED}${protocol}${PLAIN}" echo -e " ${BLUE}IP/域名(address): ${PLAIN} ${RED}${IP}${PLAIN}" echo -e " ${BLUE}端口(port):${PLAIN} ${RED}${port}${PLAIN}" echo -e " ${BLUE}用户名(username):${PLAIN} ${RED}${username}${PLAIN}" echo -e " ${BLUE}密码(password):${PLAIN} ${RED}${password}${PLAIN}" } showInfo() { res=`status` if [[ $res -lt 2 ]]; then colorEcho $RED " SingBox未安装,请先安装!" return fi echo "" echo -n -e " ${BLUE}SingBox运行状态:${PLAIN}" statusText echo -e " ${BLUE}SingBox配置文件: ${PLAIN} ${RED}${CONFIG_FILE}${PLAIN}" colorEcho $BLUE " SingBox配置信息:" getConfigFileInfo if [[ "$protocol" = vmess ]]; then outputVmess elif [[ "$protocol" = vless ]]; then outputVless elif [[ "$protocol" = trojan ]]; then outputTrojan elif [[ "$protocol" = shadowsocks ]]; then outputSS elif [[ "$protocol" = socks ]]; then outputSocks fi } ShowInfo_stls() { echo "" colorEcho $BLUE " ShadowTLS配置信息:" GetConfig_stls outputSTLS } GetConfig_stls() { sport=`grep listen ${stls_conf} | cut -d- -f8 | cut -d: -f2` pass=`grep password ${stls_conf} | cut -d " " -f12` domain=`grep password ${stls_conf} | cut -d- -f12 | cut -d " " -f 2` } outputSTLS() { echo -e " ${BLUE}端口(PORT):${PLAIN} ${RED}${sport}${PLAIN}" echo -e " ${BLUE}密码(PASS):${PLAIN} ${RED}${pass}${PLAIN}" echo -e " ${BLUE}域名(DOMAIN):${PLAIN} ${RED}${domain}${PLAIN}" echo -e " ${BLUE}版本(VER):${PLAIN} ${RED}v3${PLAIN}" } showLog() { res=`status` if [[ $res -lt 2 ]]; then colorEcho $RED " SingBox未安装,请先安装!" return fi journalctl -xen -u sing-box --no-pager } menu() { clear echo "####################################################" echo -e "# ${RED}SingBox一键安装脚本${PLAIN} #" echo -e "# ${GREEN}作者${PLAIN}: 怠惰(Slotheve) #" echo -e "# ${GREEN}网址${PLAIN}: https://slotheve.com #" echo -e "# ${GREEN}频道${PLAIN}: https://t.me/SlothNews #" echo "####################################################" echo " -----------------------------------------------" colorEcho $GREEN " 全协议支持UDP over TCP , 且ss/socks支持原生UDP" echo " -----------------------------------------------" echo -e " ${GREEN}1.${PLAIN} 安装vmess-ws" echo -e " ${GREEN}2.${PLAIN} 安装vless-ws" echo -e " ${GREEN}3.${PLAIN} 安装Trojan" echo -e " ${GREEN}4.${PLAIN} 安装Shadowsocks" echo -e " ${GREEN}5.${PLAIN} 安装Socks ${RED}不推荐${PLAIN}" echo -e " ${GREEN}6.${PLAIN} ${YELLOW}切换Snell脚本${PLAIN}" echo " --------------------" echo -e " ${GREEN}7.${PLAIN} 安装ShadowTls" echo -e " ${GREEN}8.${PLAIN} ${RED}卸载ShadowTls${PLAIN}" echo " --------------------" echo -e " ${GREEN}9.${PLAIN} 更新SingBox" echo -e " ${GREEN}10.${PLAIN} ${RED}卸载SingBox${PLAIN}" echo " --------------------" echo -e " ${GREEN}11.${PLAIN} 启动SingBox" echo -e " ${GREEN}12.${PLAIN} 重启SingBox" echo -e " ${GREEN}13.${PLAIN} 停止SingBox" echo " --------------------" echo -e " ${GREEN}14.${PLAIN} 查看SingBox配置" echo -e " ${GREEN}15.${PLAIN} 查看ShadowTls配置" echo -e " ${GREEN}16.${PLAIN} 查看SingBox日志" echo " --------------------" echo -e " ${GREEN}0.${PLAIN} 退出" echo "" echo -n " 当前状态:" statusText echo read -p " 请选择操作[0-16]:" answer case $answer in 0) exit 0 ;; 1) VMESS="true" install ;; 2) VLESS="true" install ;; 3) TROJAN="true" install ;; 4) SS="true" install ;; 5) SOCKS="true" install ;; 6) bash <(curl -fsSL https://codeberg.org/asdf88/stn-28/raw/branch/master/sa/snell.sh) ;; 7) Install_stls ;; 8) Uninstall_stls ;; 9) update ;; 10) uninstall ;; 11) start ;; 12) restart ;; 13) stop ;; 14) showInfo ;; 15) ShowInfo_stls ;; 16) showLog ;; *) colorEcho $RED " 请选择正确的操作!" exit 1 ;; esac } checkSystem action=$1 [[ -z $1 ]] && action=menu case "$action" in menu|update|uninstall|start|restart|stop|showInfo|showLog) ${action} ;; *) echo " 参数错误" echo " 用法: `basename $0` [menu|update|uninstall|start|restart|stop|showInfo|showLog]" ;; esac