ss-rust.sh 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867
  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. # System Required: CentOS/Debian/Ubuntu
  6. # Description: Shadowsocks Rust 管理脚本
  7. # Author: 翠花
  8. # WebSite: https://about.nange.cn
  9. #=================================================
  10. # 当前脚本版本号
  11. sh_ver="1.5.3"
  12. # Shadowsocks Rust 相关路径
  13. SS_Folder="/etc/ss-rust"
  14. SS_File="/usr/local/bin/ss-rust"
  15. SS_Conf="/etc/ss-rust/config.json"
  16. SS_Now_ver_File="/etc/ss-rust/ver.txt"
  17. # BBR 配置文件
  18. BBR_Local="/etc/sysctl.d/local.conf"
  19. # Shadow TLS 相关路径
  20. STLS_Folder="/etc/shadowtls"
  21. STLS_File="/usr/local/bin/shadow-tls"
  22. STLS_Conf="/etc/shadowtls/config.json"
  23. STLS_Now_ver_File="/etc/shadowtls/ver.txt"
  24. 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"
  25. Info="${Green_font_prefix}[信息]${Font_color_suffix}"
  26. Error="${Red_font_prefix}[错误]${Font_color_suffix}"
  27. Tip="${Yellow_font_prefix}[注意]${Font_color_suffix}"
  28. check_root(){
  29. if [[ $EUID != 0 ]]; then
  30. echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo su${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。"
  31. exit 1
  32. fi
  33. }
  34. check_sys(){
  35. if [[ -f /etc/redhat-release ]]; then
  36. release="centos"
  37. elif cat /etc/issue | grep -q -E -i "debian"; then
  38. release="debian"
  39. elif cat /etc/issue | grep -q -E -i "ubuntu"; then
  40. release="ubuntu"
  41. elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then
  42. release="centos"
  43. elif cat /proc/version | grep -q -E -i "debian"; then
  44. release="debian"
  45. elif cat /proc/version | grep -q -E -i "ubuntu"; then
  46. release="ubuntu"
  47. elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then
  48. release="centos"
  49. fi
  50. }
  51. sys_arch() {
  52. uname=$(uname -m)
  53. if [[ "$uname" == "i686" ]] || [[ "$uname" == "i386" ]]; then
  54. arch="i686"
  55. elif [[ "$uname" == *"armv7"* ]] || [[ "$uname" == "armv6l" ]]; then
  56. arch="arm"
  57. elif [[ "$uname" == *"armv8"* ]] || [[ "$uname" == "aarch64" ]]; then
  58. arch="aarch64"
  59. else
  60. arch="x86_64"
  61. fi
  62. }
  63. #开启系统 TCP Fast Open
  64. enable_systfo() {
  65. kernel=$(uname -r | awk -F . '{print $1}')
  66. if [ "$kernel" -ge 3 ]; then
  67. echo 3 >/proc/sys/net/ipv4/tcp_fastopen
  68. [[ ! -e $BBR_Local ]] && echo "fs.file-max = 51200
  69. net.core.rmem_max = 67108864
  70. net.core.wmem_max = 67108864
  71. net.core.rmem_default = 65536
  72. net.core.wmem_default = 65536
  73. net.core.netdev_max_backlog = 4096
  74. net.core.somaxconn = 4096
  75. net.ipv4.tcp_syncookies = 1
  76. net.ipv4.tcp_tw_reuse = 1
  77. net.ipv4.tcp_tw_recycle = 0
  78. net.ipv4.tcp_fin_timeout = 30
  79. net.ipv4.tcp_keepalive_time = 1200
  80. net.ipv4.ip_local_port_range = 10000 65000
  81. net.ipv4.tcp_max_syn_backlog = 4096
  82. net.ipv4.tcp_max_tw_buckets = 5000
  83. net.ipv4.tcp_fastopen = 3
  84. net.ipv4.tcp_rmem = 4096 87380 67108864
  85. net.ipv4.tcp_wmem = 4096 65536 67108864
  86. net.ipv4.tcp_mtu_probing = 1
  87. net.ipv4.tcp_ecn=1
  88. net.core.default_qdisc=fq
  89. net.ipv4.tcp_congestion_control = bbr" >>/etc/sysctl.d/local.conf && sysctl --system >/dev/null 2>&1
  90. else
  91. echo -e "$Error系统内核版本过低,无法支持 TCP Fast Open !"
  92. fi
  93. }
  94. check_installed_status(){
  95. [[ ! -e ${SS_File} ]] && echo -e "${Error} Shadowsocks Rust 没有安装,请检查!" && exit 1
  96. }
  97. check_status(){
  98. status=`systemctl status ss-rust | grep Active | awk '{print $3}' | cut -d "(" -f2 | cut -d ")" -f1`
  99. }
  100. check_new_ver(){
  101. new_ver=$(wget -qO- https://api.github.com/repos/shadowsocks/shadowsocks-rust/releases| jq -r '[.[] | select(.prerelease == false) | select(.draft == false) | .tag_name] | .[0]')
  102. [[ -z ${new_ver} ]] && echo -e "${Error} Shadowsocks Rust 最新版本获取失败!" && exit 1
  103. echo -e "${Info} 检测到 Shadowsocks Rust 最新版本为 [ ${new_ver} ]"
  104. }
  105. check_ver_comparison(){
  106. now_ver=$(cat ${SS_Now_ver_File})
  107. if [[ "${now_ver}" != "${new_ver}" ]]; then
  108. echo -e "${Info} 发现 Shadowsocks Rust 已有新版本 [ ${new_ver} ],旧版本 [ ${now_ver} ]"
  109. read -e -p "是否更新 ? [Y/n]:" yn
  110. [[ -z "${yn}" ]] && yn="y"
  111. if [[ $yn == [Yy] ]]; then
  112. check_status
  113. # [[ "$status" == "running" ]] && systemctl stop ss-rust
  114. \cp "${SS_Conf}" "/tmp/config.json"
  115. # rm -rf ${SS_Folder}
  116. download
  117. mv -f "/tmp/config.json" "${SS_Conf}"
  118. restart
  119. fi
  120. else
  121. echo -e "${Info} 当前 Shadowsocks Rust 已是最新版本 [ ${new_ver} ] !" && exit 1
  122. fi
  123. }
  124. # 官方源
  125. stable_download() {
  126. echo -e "${Info} 默认开始下载官方源 Shadowsocks Rust ……"
  127. wget --no-check-certificate -N "https://github.com/shadowsocks/shadowsocks-rust/releases/download/${new_ver}/shadowsocks-${new_ver}.${arch}-unknown-linux-gnu.tar.xz"
  128. if [[ ! -e "shadowsocks-${new_ver}.${arch}-unknown-linux-gnu.tar.xz" ]]; then
  129. echo -e "${Error} Shadowsocks Rust 官方源下载失败!"
  130. return 1 && exit 1
  131. else
  132. tar -xvf "shadowsocks-${new_ver}.${arch}-unknown-linux-gnu.tar.xz"
  133. fi
  134. if [[ ! -e "ssserver" ]]; then
  135. echo -e "${Error} Shadowsocks Rust 解压失败!"
  136. echo -e "${Error} Shadowsocks Rust 安装失败 !"
  137. return 1 && exit 1
  138. else
  139. rm -rf "shadowsocks-${new_ver}.${arch}-unknown-linux-gnu.tar.xz"
  140. chmod +x ssserver
  141. mv -f ssserver "${SS_File}"
  142. rm sslocal ssmanager ssservice ssurl
  143. echo "${new_ver}" > ${SS_Now_ver_File}
  144. echo -e "${Info} Shadowsocks Rust 主程序下载安装完毕!"
  145. return 0
  146. fi
  147. }
  148. # 备用源
  149. backup_download() {
  150. echo -e "${Info} 试图请求 备份源(旧版本) Shadowsocks Rust ……"
  151. wget --no-check-certificate -N "https://raw.githubusercontent.com/xOS/Others/master/shadowsocks-rust/v1.14.1/shadowsocks-v1.14.1.${arch}-unknown-linux-gnu.tar.xz"
  152. if [[ ! -e "shadowsocks-v1.14.1.${arch}-unknown-linux-gnu.tar.xz" ]]; then
  153. echo -e "${Error} Shadowsocks Rust 备份源(旧版本) 下载失败!"
  154. return 1 && exit 1
  155. else
  156. tar -xvf "shadowsocks-v1.14.1.${arch}-unknown-linux-gnu.tar.xz"
  157. fi
  158. if [[ ! -e "ssserver" ]]; then
  159. echo -e "${Error} Shadowsocks Rust 备份源(旧版本) 解压失败 !"
  160. echo -e "${Error} Shadowsocks Rust 备份源(旧版本) 安装失败 !"
  161. return 1 && exit 1
  162. else
  163. rm -rf "shadowsocks-v1.14.1.${arch}-unknown-linux-gnu.tar.xz"
  164. chmod +x ssserver
  165. mv -f ssserver "${SS_File}"
  166. rm sslocal ssmanager ssservice ssurl
  167. echo "v1.14.1" > ${SS_Now_ver_File}
  168. echo -e "${Info} Shadowsocks Rust 备份源(旧版本) 主程序下载安装完毕!"
  169. return 0
  170. fi
  171. }
  172. download() {
  173. if [[ ! -e "${SS_Folder}" ]]; then
  174. mkdir "${SS_Folder}"
  175. # else
  176. # [[ -e "${SS_File}" ]] && rm -rf "${SS_File}"
  177. fi
  178. stable_download
  179. if [[ $? != 0 ]]; then
  180. backup_download
  181. fi
  182. }
  183. # Shadow TLS 官方源下载
  184. stable_download_stls() {
  185. echo -e "${Info} 默认开始下载官方源 Shadow TLS ……"
  186. wget --no-check-certificate -N "https://github.com/ihciah/shadow-tls/releases/download/${stls_new_ver}/shadow-tls-${arch}-unknown-linux-musl"
  187. if [[ ! -e "shadow-tls-${arch}-unknown-linux-musl" ]]; then
  188. echo -e "${Error} Shadow TLS 官方源下载失败!"
  189. return 1 && exit 1
  190. else
  191. chmod +x "shadow-tls-${arch}-unknown-linux-musl"
  192. mv -f "shadow-tls-${arch}-unknown-linux-musl" "${STLS_File}"
  193. echo "${stls_new_ver}" > ${STLS_Now_ver_File}
  194. echo -e "${Info} Shadow TLS 主程序下载安装完毕!"
  195. return 0
  196. fi
  197. }
  198. download_stls() {
  199. if [[ ! -e "${STLS_Folder}" ]]; then
  200. mkdir "${STLS_Folder}"
  201. fi
  202. stable_download_stls
  203. }
  204. # Shadow TLS 配置相关函数
  205. set_stls_port(){
  206. while true
  207. do
  208. echo -e "${Tip} Shadow TLS 端口需与防火墙端口一致!"
  209. echo -e "请输入 Shadow TLS 端口 [1-65535]"
  210. read -e -p "(默认:8443):" stls_port
  211. [[ -z "${stls_port}" ]] && stls_port="8443"
  212. echo $((${stls_port}+0)) &>/dev/null
  213. if [[ $? -eq 0 ]]; then
  214. if [[ ${stls_port} -ge 1 ]] && [[ ${stls_port} -le 65535 ]]; then
  215. echo && echo "========================================"
  216. echo -e "Shadow TLS 端口:${Red_background_prefix} ${stls_port} ${Font_color_suffix}"
  217. echo "========================================" && echo
  218. break
  219. else
  220. echo "输入错误, 请输入正确的端口。"
  221. fi
  222. else
  223. echo "输入错误, 请输入正确的端口。"
  224. fi
  225. done
  226. }
  227. set_stls_password(){
  228. echo "请输入 Shadow TLS 密码 [0-9][a-z][A-Z]"
  229. read -e -p "(默认:随机生成):" stls_password
  230. [[ -z "${stls_password}" ]] && stls_password=$(< /dev/urandom tr -dc 'a-zA-Z0-9' | head -c 16)
  231. echo && echo "========================================"
  232. echo -e "Shadow TLS 密码:${Red_background_prefix} ${stls_password} ${Font_color_suffix}"
  233. echo "========================================" && echo
  234. }
  235. set_stls_sni(){
  236. echo "请输入 Shadow TLS SNI 域名"
  237. read -e -p "(默认:cloudflare.com):" stls_sni
  238. [[ -z "${stls_sni}" ]] && stls_sni="cloudflare.com"
  239. echo && echo "========================================"
  240. echo -e "Shadow TLS SNI:${Red_background_prefix} ${stls_sni} ${Font_color_suffix}"
  241. echo "========================================" && echo
  242. }
  243. set_stls_fastopen(){
  244. echo -e "是否开启 Shadow TLS TCP Fast Open ?
  245. ========================================
  246. ${Green_font_prefix} 1.${Font_color_suffix} 开启 ${Green_font_prefix} 2.${Font_color_suffix} 关闭
  247. ========================================"
  248. read -e -p "(默认:1.开启):" stls_fastopen_choice
  249. [[ -z "${stls_fastopen_choice}" ]] && stls_fastopen_choice="1"
  250. if [[ ${stls_fastopen_choice} == "1" ]]; then
  251. stls_fastopen="true"
  252. else
  253. stls_fastopen="false"
  254. fi
  255. echo && echo "========================================"
  256. echo -e "Shadow TLS FastOpen:${Red_background_prefix} ${stls_fastopen} ${Font_color_suffix}"
  257. echo "========================================" && echo
  258. }
  259. set_stls_strict(){
  260. echo -e "是否开启 Shadow TLS Strict 模式 ?
  261. ========================================
  262. ${Green_font_prefix} 1.${Font_color_suffix} 开启 ${Green_font_prefix} 2.${Font_color_suffix} 关闭
  263. ========================================"
  264. read -e -p "(默认:1.开启):" stls_strict_choice
  265. [[ -z "${stls_strict_choice}" ]] && stls_strict_choice="1"
  266. if [[ ${stls_strict_choice} == "1" ]]; then
  267. stls_strict="true"
  268. else
  269. stls_strict="false"
  270. fi
  271. echo && echo "========================================"
  272. echo -e "Shadow TLS Strict:${Red_background_prefix} ${stls_strict} ${Font_color_suffix}"
  273. echo "========================================" && echo
  274. }
  275. set_stls_tls_wildcard_sni(){
  276. echo -e "请选择 Shadow TLS Wildcard SNI 模式:
  277. ========================================
  278. ${Green_font_prefix} 1.${Font_color_suffix} authed (默认)
  279. ${Green_font_prefix} 2.${Font_color_suffix} off
  280. ${Green_font_prefix} 3.${Font_color_suffix} all
  281. ========================================"
  282. read -e -p "(默认:1.authed):" stls_tls_wildcard_sni_choice
  283. [[ -z "${stls_tls_wildcard_sni_choice}" ]] && stls_tls_wildcard_sni_choice="1"
  284. case "${stls_tls_wildcard_sni_choice}" in
  285. 1) stls_tls_wildcard_sni="authed" ;;
  286. 2) stls_tls_wildcard_sni="off" ;;
  287. 3) stls_tls_wildcard_sni="all" ;;
  288. *) stls_tls_wildcard_sni="authed" ;;
  289. esac
  290. echo && echo "========================================"
  291. echo -e "TLS Wildcard SNI:${Red_background_prefix} ${stls_tls_wildcard_sni} ${Font_color_suffix}"
  292. echo "========================================" && echo
  293. }
  294. set_stls_fallback(){
  295. echo "请输入 Shadow TLS 回退域名"
  296. read -e -p "(默认:cloud.tencent.com:443):" stls_fallback
  297. [[ -z "${stls_fallback}" ]] && stls_fallback="cloud.tencent.com:443"
  298. echo && echo "========================================"
  299. echo -e "Shadow TLS 回退域名:${Red_background_prefix} ${stls_fallback} ${Font_color_suffix}"
  300. echo "========================================" && echo
  301. }
  302. service(){
  303. echo "
  304. [Unit]
  305. Description= Shadowsocks Rust Service
  306. After=network-online.target
  307. Wants=network-online.target systemd-networkd-wait-online.service
  308. [Service]
  309. LimitNOFILE=32767
  310. Type=simple
  311. User=root
  312. Restart=on-failure
  313. RestartSec=5s
  314. DynamicUser=true
  315. ExecStartPre=/bin/sh -c 'ulimit -n 51200'
  316. ExecStart=${SS_File} -c ${SS_Conf}
  317. [Install]
  318. WantedBy=multi-user.target" > /etc/systemd/system/ss-rust.service
  319. systemctl enable --now ss-rust
  320. echo -e "${Info} Shadowsocks Rust 服务配置完成!"
  321. }
  322. service_stls(){
  323. cat > /etc/systemd/system/shadowtls.service<<-EOF
  324. [Unit]
  325. Description=Shadow TLS Service
  326. After=network-online.target
  327. Wants=network-online.target systemd-networkd-wait-online.service
  328. [Service]
  329. LimitNOFILE=32767
  330. Type=simple
  331. User=root
  332. Restart=on-failure
  333. RestartSec=5s
  334. Environment=MONOIO_FORCE_LEGACY_DRIVER=1
  335. ExecStartPre=/bin/sh -c 'ulimit -n 51200'
  336. ExecStart=${STLS_File} config --config ${STLS_Conf}
  337. [Install]
  338. WantedBy=multi-user.target
  339. EOF
  340. systemctl enable --now shadowtls
  341. echo -e "${Info} Shadow TLS 服务配置完成!"
  342. }
  343. installation_dependency(){
  344. if [[ ${release} == "centos" ]]; then
  345. yum update
  346. yum install jq gzip wget curl unzip xz openssl -y
  347. else
  348. apt-get update
  349. apt-get install jq gzip wget curl unzip xz-utils openssl -y
  350. fi
  351. \cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  352. }
  353. write_config(){
  354. cat > ${SS_Conf}<<-EOF
  355. {
  356. "server": "::",
  357. "server_port": ${port},
  358. "password": "${password}",
  359. "method": "${cipher}",
  360. "fast_open": ${tfo},
  361. "mode": "tcp_and_udp",
  362. "user":"nobody",
  363. "timeout":300,
  364. "nameserver":"1.1.1.1"
  365. }
  366. EOF
  367. }
  368. write_stls_config(){
  369. # 设置默认值
  370. [[ -z "${stls_fastopen}" ]] && stls_fastopen="true"
  371. [[ -z "${stls_strict}" ]] && stls_strict="true"
  372. [[ -z "${stls_tls_wildcard_sni}" ]] && stls_tls_wildcard_sni="authed"
  373. [[ -z "${stls_fallback}" ]] && stls_fallback="cloud.tencent.com:443"
  374. # 构建 dispatch 配置
  375. if [[ -z "${stls_dispatch}" ]]; then
  376. # 没有现有配置,使用默认配置
  377. # SNI 域名对应的目标地址也使用相同的域名:443
  378. stls_dispatch_config="\"${stls_sni}\": \"${stls_sni}:443\",
  379. \"captive.apple.com\": \"captive.apple.com:443\""
  380. else
  381. # 有现有配置,需要智能更新 SNI
  382. if [[ ! -z "${stls_sni}" && -e ${STLS_Conf} ]]; then
  383. # 查找需要更新的 SNI(排除 captive.apple.com)
  384. old_sni=$(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | keys[] | select(. != "captive.apple.com")' 2>/dev/null | head -1)
  385. if [[ ! -z "${old_sni}" && "${old_sni}" != "null" && "${old_sni}" != "${stls_sni}" ]]; then
  386. # 需要替换旧的 SNI 为新的 SNI,同时更新键和值
  387. echo -e "${Info} 更新主要 SNI 从 ${old_sni} 到 ${stls_sni}"
  388. # 使用 jq 来精确替换键和值
  389. stls_dispatch_config=$(cat ${STLS_Conf} | jq -r --arg old_sni "${old_sni}" --arg new_sni "${stls_sni}" '
  390. .server.tls_addr.dispatch |
  391. to_entries |
  392. map(if .key == $old_sni then (.key = $new_sni | .value = ($new_sni + ":443")) else . end) |
  393. map("\"\(.key)\": \"\(.value)\"") |
  394. join(",\n ")
  395. ' 2>/dev/null)
  396. # 如果 jq 处理失败,回退到字符串替换
  397. if [[ -z "${stls_dispatch_config}" || "${stls_dispatch_config}" == "null" ]]; then
  398. echo -e "${Info} jq 处理失败,使用字符串替换"
  399. # 先替换键,再替换对应的值
  400. stls_dispatch_config=$(echo "${stls_dispatch}" | sed "s/\"${old_sni}\": \"[^\"]*\"/\"${stls_sni}\": \"${stls_sni}:443\"/g")
  401. fi
  402. else
  403. # 如果没有找到需要更新的 SNI,或者 SNI 已经是正确的,直接使用现有配置
  404. stls_dispatch_config="${stls_dispatch}"
  405. fi
  406. else
  407. stls_dispatch_config="${stls_dispatch}"
  408. fi
  409. fi
  410. # 调试信息(可选,用于排查问题)
  411. # echo -e "${Info} 调试信息:"
  412. # echo -e " stls_sni: ${stls_sni}"
  413. # echo -e " stls_dispatch_config: ${stls_dispatch_config}"
  414. cat > ${STLS_Conf}<<-EOF
  415. {
  416. "disable_nodelay": false,
  417. "fastopen": ${stls_fastopen},
  418. "v3": true,
  419. "strict": ${stls_strict},
  420. "server": {
  421. "listen": "0.0.0.0:${stls_port}",
  422. "server_addr": "127.0.0.1:${port}",
  423. "tls_addr": {
  424. "wildcard_sni": "${stls_tls_wildcard_sni}",
  425. "dispatch": {
  426. ${stls_dispatch_config}
  427. },
  428. "fallback": "${stls_fallback}"
  429. },
  430. "password": "${stls_password}",
  431. "wildcard_sni": "authed"
  432. }
  433. }
  434. EOF
  435. # 验证配置文件是否正确生成
  436. if [[ -e ${STLS_Conf} ]]; then
  437. # 检查配置文件是否为有效的 JSON
  438. if ! jq . ${STLS_Conf} >/dev/null 2>&1; then
  439. echo -e "${Error} Shadow TLS 配置文件格式错误!"
  440. return 1
  441. fi
  442. echo -e "${Info} Shadow TLS 配置文件写入成功"
  443. # 显示当前配置的 SNI
  444. current_sni=$(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | keys[0]' 2>/dev/null)
  445. if [[ ! -z "${current_sni}" && "${current_sni}" != "null" ]]; then
  446. echo -e "${Info} 当前配置的 SNI: ${Green_font_prefix}${current_sni}${Font_color_suffix}"
  447. fi
  448. else
  449. echo -e "${Error} Shadow TLS 配置文件写入失败!"
  450. return 1
  451. fi
  452. }
  453. read_config(){
  454. [[ ! -e ${SS_Conf} ]] && echo -e "${Error} Shadowsocks Rust 配置文件不存在!" && exit 1
  455. port=$(cat ${SS_Conf}|jq -r '.server_port')
  456. password=$(cat ${SS_Conf}|jq -r '.password')
  457. cipher=$(cat ${SS_Conf}|jq -r '.method')
  458. tfo=$(cat ${SS_Conf}|jq -r '.fast_open')
  459. }
  460. read_stls_config(){
  461. [[ ! -e ${STLS_Conf} ]] && echo -e "${Error} Shadow TLS 配置文件不存在!" && exit 1
  462. stls_port=$(cat ${STLS_Conf}|jq -r '.server.listen' | grep -oE '[0-9]+$')
  463. stls_password=$(cat ${STLS_Conf}|jq -r '.server.password')
  464. stls_sni=$(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | keys[0]')
  465. stls_fastopen=$(cat ${STLS_Conf}|jq -r '.fastopen')
  466. stls_strict=$(cat ${STLS_Conf}|jq -r '.strict')
  467. stls_tls_wildcard_sni=$(cat ${STLS_Conf}|jq -r '.server.tls_addr.wildcard_sni')
  468. stls_fallback=$(cat ${STLS_Conf}|jq -r '.server.tls_addr.fallback')
  469. # 读取完整的 dispatch 配置
  470. stls_dispatch=$(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | to_entries | map("\"\(.key)\": \"\(.value)\"") | join(",\n ")')
  471. }
  472. set_port(){
  473. while true
  474. do
  475. echo -e "${Tip} 本步骤不涉及系统防火墙端口操作,请手动放行相应端口!"
  476. echo -e "请输入 Shadowsocks Rust 端口 [1-65535]"
  477. read -e -p "(默认:2525):" port
  478. [[ -z "${port}" ]] && port="2525"
  479. echo $((${port}+0)) &>/dev/null
  480. if [[ $? -eq 0 ]]; then
  481. if [[ ${port} -ge 1 ]] && [[ ${port} -le 65535 ]]; then
  482. echo && echo "========================================"
  483. echo -e "端口:${Red_background_prefix} ${port} ${Font_color_suffix}"
  484. echo "========================================" && echo
  485. break
  486. else
  487. echo "输入错误, 请输入正确的端口。"
  488. fi
  489. else
  490. echo "输入错误, 请输入正确的端口。"
  491. fi
  492. done
  493. }
  494. set_tfo(){
  495. echo -e "是否开启 TCP Fast Open ?
  496. ========================================
  497. ${Green_font_prefix} 1.${Font_color_suffix} 开启 ${Green_font_prefix} 2.${Font_color_suffix} 关闭
  498. ========================================"
  499. read -e -p "(默认:1.开启):" tfo
  500. [[ -z "${tfo}" ]] && tfo="1"
  501. if [[ ${tfo} == "1" ]]; then
  502. tfo=true
  503. enable_systfo
  504. else
  505. tfo=false
  506. fi
  507. echo && echo "=================================="
  508. echo -e "TCP Fast Open 开启状态:${Red_background_prefix} ${tfo} ${Font_color_suffix}"
  509. echo "==================================" && echo
  510. }
  511. set_password(){
  512. echo "请输入 Shadowsocks Rust 密码 [0-9][a-z][A-Z]"
  513. read -e -p "(默认:随机生成):" password
  514. # 当用户未输入密码时,执行默认生成逻辑
  515. if [[ -z "${password}" ]]; then
  516. # 判断是否为2022系列加密
  517. if [[ ${cipher} == "2022-blake3-aes-256-gcm" || ${cipher} == "2022-blake3-chacha20-poly1305" ]]; then
  518. # 2022系列必须使用指定长度的Base64密钥
  519. echo -e "${Tip} 为 ${cipher} 生成 32 字节 Base64 密钥..."
  520. password=$(openssl rand -base64 32)
  521. elif [[ ${cipher} == "2022-blake3-aes-128-gcm" ]]; then
  522. # 2022系列必须使用指定长度的Base64密钥
  523. echo -e "${Tip} 为 ${cipher} 生成 16 字节 Base64 密钥..."
  524. password=$(openssl rand -base64 16)
  525. else
  526. # 其他加密方式,生成一个普通的16位字母和数字的随机密码
  527. echo -e "${Tip} 为 ${cipher} 生成 16 位随机密码 (非Base64)..."
  528. password=$(< /dev/urandom tr -dc 'a-zA-Z0-9' | head -c 16)
  529. fi
  530. fi
  531. echo && echo "========================================"
  532. echo -e "密码:${Red_font_prefix} ${password} ${Font_color_suffix}"
  533. echo "========================================" && echo
  534. }
  535. set_cipher(){
  536. echo -e "请选择 Shadowsocks Rust 加密方式
  537. ========================================
  538. ${Green_font_prefix} 1.${Font_color_suffix} aes-128-gcm ${Green_font_prefix}(默认)${Font_color_suffix}
  539. ${Green_font_prefix} 2.${Font_color_suffix} aes-256-gcm ${Green_font_prefix}(推荐)${Font_color_suffix}
  540. ${Green_font_prefix} 3.${Font_color_suffix} chacha20-ietf-poly1305 ${Green_font_prefix}${Font_color_suffix}
  541. ${Green_font_prefix} 4.${Font_color_suffix} plain ${Red_font_prefix}(不推荐)${Font_color_suffix}
  542. ${Green_font_prefix} 5.${Font_color_suffix} none ${Red_font_prefix}(不推荐)${Font_color_suffix}
  543. ${Green_font_prefix} 6.${Font_color_suffix} table
  544. ${Green_font_prefix} 7.${Font_color_suffix} aes-128-cfb
  545. ${Green_font_prefix} 8.${Font_color_suffix} aes-256-cfb
  546. ${Green_font_prefix} 9.${Font_color_suffix} aes-256-ctr
  547. ${Green_font_prefix}10.${Font_color_suffix} camellia-256-cfb
  548. ${Green_font_prefix}11.${Font_color_suffix} rc4-md5
  549. ${Green_font_prefix}12.${Font_color_suffix} chacha20-ietf
  550. ========================================
  551. ${Tip} AEAD 2022 加密(须v1.15.0及以上版本且密码须经过Base64加密)
  552. ========================================
  553. ${Green_font_prefix}13.${Font_color_suffix} 2022-blake3-aes-128-gcm ${Green_font_prefix}(推荐)${Font_color_suffix}
  554. ${Green_font_prefix}14.${Font_color_suffix} 2022-blake3-aes-256-gcm ${Green_font_prefix}(推荐)${Font_color_suffix}
  555. ${Green_font_prefix}15.${Font_color_suffix} 2022-blake3-chacha20-poly1305
  556. ========================================
  557. ${Tip} 如需其它加密方式请手动修改配置文件 !" && echo
  558. read -e -p "(默认: 1. aes-128-gcm):" cipher
  559. [[ -z "${cipher}" ]] && cipher="1"
  560. if [[ ${cipher} == "1" ]]; then
  561. cipher="aes-128-gcm"
  562. elif [[ ${cipher} == "2" ]]; then
  563. cipher="aes-256-gcm"
  564. elif [[ ${cipher} == "3" ]]; then
  565. cipher="chacha20-ietf-poly1305"
  566. elif [[ ${cipher} == "4" ]]; then
  567. cipher="plain"
  568. elif [[ ${cipher} == "5" ]]; then
  569. cipher="none"
  570. elif [[ ${cipher} == "6" ]]; then
  571. cipher="table"
  572. elif [[ ${cipher} == "7" ]]; then
  573. cipher="aes-128-cfb"
  574. elif [[ ${cipher} == "8" ]]; then
  575. cipher="aes-256-cfb"
  576. elif [[ ${cipher} == "9" ]]; then
  577. cipher="aes-256-ctr"
  578. elif [[ ${cipher} == "10" ]]; then
  579. cipher="camellia-256-cfb"
  580. elif [[ ${cipher} == "11" ]]; then
  581. cipher="arc4-md5"
  582. elif [[ ${cipher} == "12" ]]; then
  583. cipher="chacha20-ietf"
  584. elif [[ ${cipher} == "13" ]]; then
  585. cipher="2022-blake3-aes-128-gcm"
  586. elif [[ ${cipher} == "14" ]]; then
  587. cipher="2022-blake3-aes-256-gcm"
  588. elif [[ ${cipher} == "15" ]]; then
  589. cipher="2022-blake3-chacha20-poly1305"
  590. else
  591. cipher="aes-128-gcm"
  592. fi
  593. echo && echo "========================================"
  594. echo -e "加密:${Red_background_prefix} ${cipher} ${Font_color_suffix}"
  595. echo "========================================" && echo
  596. }
  597. set_config(){
  598. check_installed_status
  599. echo && echo -e "你要做什么?
  600. ========================================
  601. ${Green_font_prefix}1.${Font_color_suffix} 修改 端口配置
  602. ${Green_font_prefix}2.${Font_color_suffix} 修改 加密配置
  603. ${Green_font_prefix}3.${Font_color_suffix} 修改 密码配置
  604. ${Green_font_prefix}4.${Font_color_suffix} 修改 TFO 配置
  605. ========================================
  606. ${Green_font_prefix}5.${Font_color_suffix} 修改 全部配置" && echo
  607. read -e -p "(默认:取消):" modify
  608. [[ -z "${modify}" ]] && echo "已取消..." && exit 1
  609. if [[ "${modify}" == "1" ]]; then
  610. read_config
  611. set_port
  612. cipher=${cipher}
  613. password=${password}
  614. tfo=${tfo}
  615. write_config
  616. restart
  617. elif [[ "${modify}" == "2" ]]; then
  618. read_config
  619. set_cipher
  620. port=${port}
  621. password=${password}
  622. tfo=${tfo}
  623. write_config
  624. restart
  625. elif [[ "${modify}" == "3" ]]; then
  626. read_config
  627. cipher=${cipher}
  628. set_password
  629. port=${port}
  630. tfo=${tfo}
  631. write_config
  632. restart
  633. elif [[ "${modify}" == "4" ]]; then
  634. read_config
  635. set_tfo
  636. cipher=${cipher}
  637. port=${port}
  638. password=${password}
  639. write_config
  640. restart
  641. elif [[ "${modify}" == "5" ]]; then
  642. read_config
  643. set_port
  644. set_cipher
  645. set_password
  646. set_tfo
  647. write_config
  648. restart
  649. else
  650. echo -e "${Error} 请输入正确的数字(1-5)" && exit 1
  651. fi
  652. }
  653. install(){
  654. [[ -e ${SS_File} ]] && echo -e "${Error} 检测到 Shadowsocks Rust 已安装!" && exit 1
  655. echo -e "${Info} 开始设置 配置..."
  656. set_port
  657. set_cipher
  658. set_password
  659. set_tfo
  660. echo -e "${Info} 开始安装/配置 依赖..."
  661. installation_dependency
  662. echo -e "${Info} 开始下载/安装..."
  663. check_new_ver
  664. download
  665. echo -e "${Info} 开始安装系统服务脚本..."
  666. service
  667. echo -e "${Info} 开始写入 配置文件..."
  668. write_config
  669. echo -e "${Info} 所有步骤 安装完毕,开始启动..."
  670. start
  671. echo -e "${Info} Shadowsocks Rust 安装完成!"
  672. # 询问是否继续安装 Shadow TLS
  673. echo && echo -e "${Tip} 是否继续安装 Shadow TLS 流量伪装?"
  674. read -e -p "(默认: N 不安装) [y/N]: " install_stls_choice
  675. [[ -z "${install_stls_choice}" ]] && install_stls_choice="n"
  676. if [[ ${install_stls_choice} == [Yy] ]]; then
  677. echo -e "${Info} 开始安装 Shadow TLS..."
  678. install_stls_after_ss
  679. else
  680. echo -e "${Info} 跳过 Shadow TLS 安装,显示 Shadowsocks Rust 配置..."
  681. view_ss_only
  682. fi
  683. }
  684. install_stls(){
  685. [[ -e ${STLS_File} ]] && echo -e "${Error} 检测到 Shadow TLS 已安装!" && exit 1
  686. # 检查 Shadowsocks Rust 是否已安装
  687. if [[ ! -e ${SS_File} ]]; then
  688. echo -e "${Error} 检测到 Shadowsocks Rust 尚未安装!"
  689. echo -e "${Info} Shadow TLS 需要配合 Shadowsocks Rust 使用。"
  690. echo -e "${Info} 建议先安装 Shadowsocks Rust,再安装 Shadow TLS。"
  691. echo && read -e -p "是否现在安装 Shadowsocks Rust?[Y/n]:" install_ss_choice
  692. [[ -z "${install_ss_choice}" ]] && install_ss_choice="Y"
  693. if [[ ${install_ss_choice} == [Yy] ]]; then
  694. echo -e "${Info} 开始安装 Shadowsocks Rust..."
  695. install
  696. echo -e "${Info} Shadowsocks Rust 安装完成,现在开始安装 Shadow TLS..."
  697. else
  698. echo -e "${Info} 已取消安装,返回上级菜单..."
  699. shadowtls_menu
  700. return
  701. fi
  702. fi
  703. echo -e "${Info} 开始设置 Shadow TLS 配置..."
  704. read_config # 读取现有 SS 配置
  705. # 使用交互式配置,每项都有默认值
  706. echo -e "${Info} 请配置 Shadow TLS 参数(可直接回车使用默认值):"
  707. set_stls_port
  708. set_stls_password
  709. set_stls_sni
  710. set_stls_fastopen
  711. set_stls_strict
  712. set_stls_tls_wildcard_sni
  713. set_stls_fallback
  714. manage_stls_dispatch
  715. echo -e "${Info} 开始下载/安装 Shadow TLS..."
  716. check_stls_new_ver
  717. download_stls
  718. echo -e "${Info} 开始安装 Shadow TLS 服务脚本..."
  719. service_stls
  720. echo -e "${Info} 开始写入 Shadow TLS 配置文件..."
  721. write_stls_config
  722. echo -e "${Info} Shadow TLS 安装完毕,开始启动..."
  723. start_stls
  724. echo -e "${Info} Shadow TLS 安装完成!显示完整配置信息..."
  725. view_combined_config_with_return
  726. }
  727. install_stls_after_ss(){
  728. echo -e "${Info} 开始设置 Shadow TLS 配置..."
  729. read_config # 读取现有 SS 配置
  730. # 使用交互式配置,每项都有默认值
  731. echo -e "${Info} 请配置 Shadow TLS 参数(可直接回车使用默认值):"
  732. set_stls_port
  733. set_stls_password
  734. set_stls_sni
  735. set_stls_fastopen
  736. set_stls_strict
  737. set_stls_tls_wildcard_sni
  738. set_stls_fallback
  739. manage_stls_dispatch
  740. echo -e "${Info} 开始下载/安装 Shadow TLS..."
  741. check_stls_new_ver
  742. download_stls
  743. echo -e "${Info} 开始安装 Shadow TLS 服务脚本..."
  744. service_stls
  745. echo -e "${Info} 开始写入 Shadow TLS 配置文件..."
  746. write_stls_config
  747. echo -e "${Info} Shadow TLS 安装完毕,开始启动..."
  748. start_stls
  749. echo -e "${Info} Shadow TLS 安装完成!显示完整配置信息..."
  750. view_combined_config_with_return
  751. }
  752. view(){
  753. check_installed_status
  754. read_config
  755. getipv4
  756. getipv6
  757. link_qr
  758. clear && echo
  759. echo -e "Shadowsocks Rust 配置:"
  760. echo -e "————————————————————————————————————————"
  761. [[ "${ipv4}" != "IPv4_Error" ]] && echo -e " 地址:${Green_font_prefix}${ipv4}${Font_color_suffix}"
  762. [[ "${ipv6}" != "IPv6_Error" ]] && echo -e " 地址:${Green_font_prefix}${ipv6}${Font_color_suffix}"
  763. echo -e " 端口:${Green_font_prefix}${port}${Font_color_suffix}"
  764. echo -e " 密码:${Green_font_prefix}${password}${Font_color_suffix}"
  765. echo -e " 加密:${Green_font_prefix}${cipher}${Font_color_suffix}"
  766. echo -e " TFO :${Green_font_prefix}${tfo}${Font_color_suffix}"
  767. echo -e "————————————————————————————————————————"
  768. [[ ! -z "${link_ipv4}" ]] && echo -e "${link_ipv4}"
  769. [[ ! -z "${link_ipv6}" ]] && echo -e "${link_ipv6}"
  770. echo -e "—————————————————————————"
  771. echo -e "${Info} Surge 配置:"
  772. if [[ "${ipv4}" != "IPv4_Error" ]]; then
  773. echo -e "$(uname -n) = ss, ${ipv4},${port}, encrypt-method=${cipher}, password=${password}, tfo=${tfo}, udp-relay=true, ecn=true"
  774. else
  775. echo -e "$(uname -n) = ss, ${ipv6},${port}, encrypt-method=${cipher}, password=${password}, tfo=${tfo}, udp-relay=true, ecn=true"
  776. fi
  777. echo -e "—————————————————————————"
  778. echo && echo -n " 按回车键返回主菜单..." && read
  779. start_menu
  780. }
  781. view_ss_only(){
  782. check_installed_status
  783. read_config
  784. getipv4
  785. getipv6
  786. link_qr
  787. clear && echo
  788. echo -e "Shadowsocks Rust 配置:"
  789. echo -e "————————————————————————————————————————"
  790. [[ "${ipv4}" != "IPv4_Error" ]] && echo -e " 地址:${Green_font_prefix}${ipv4}${Font_color_suffix}"
  791. [[ "${ipv6}" != "IPv6_Error" ]] && echo -e " 地址:${Green_font_prefix}${ipv6}${Font_color_suffix}"
  792. echo -e " 端口:${Green_font_prefix}${port}${Font_color_suffix}"
  793. echo -e " 密码:${Green_font_prefix}${password}${Font_color_suffix}"
  794. echo -e " 加密:${Green_font_prefix}${cipher}${Font_color_suffix}"
  795. echo -e " TFO :${Green_font_prefix}${tfo}${Font_color_suffix}"
  796. echo -e "————————————————————————————————————————"
  797. [[ ! -z "${link_ipv4}" ]] && echo -e "${link_ipv4}"
  798. [[ ! -z "${link_ipv6}" ]] && echo -e "${link_ipv6}"
  799. echo -e "—————————————————————————"
  800. echo -e "${Info} Surge 配置:"
  801. if [[ "${ipv4}" != "IPv4_Error" ]]; then
  802. echo -e "$(uname -n) = ss, ${ipv4},${port}, encrypt-method=${cipher}, password=${password}, tfo=${tfo}, udp-relay=true, ecn=true"
  803. else
  804. echo -e "$(uname -n) = ss, ${ipv6},${port}, encrypt-method=${cipher}, password=${password}, tfo=${tfo}, udp-relay=true, ecn=true"
  805. fi
  806. echo -e "—————————————————————————"
  807. echo && echo -n " 按回车键返回主菜单..." && read
  808. start_menu
  809. }
  810. view_combined_config(){
  811. local menu_source="$1" # 接收调用来源参数
  812. check_installed_status
  813. read_config
  814. getipv4
  815. getipv6
  816. link_qr
  817. clear && echo
  818. echo -e "完整配置信息:"
  819. echo -e "========================================"
  820. # 显示 Shadow TLS + SS 配置
  821. if [[ -e ${STLS_File} ]]; then
  822. read_stls_config
  823. echo -e "${Info} Shadow TLS + Shadowsocks Rust 配置:"
  824. echo -e "————————————————————————————————————————"
  825. [[ "${ipv4}" != "IPv4_Error" ]] && echo -e " 服务器:${Green_font_prefix}${ipv4}${Font_color_suffix}"
  826. [[ "${ipv6}" != "IPv6_Error" ]] && echo -e " 服务器:${Green_font_prefix}${ipv6}${Font_color_suffix}"
  827. echo -e " Shadow TLS 端口:${Green_font_prefix}${stls_port}${Font_color_suffix}"
  828. echo -e " Shadow TLS 密码:${Green_font_prefix}${stls_password}${Font_color_suffix}"
  829. echo -e " Shadow TLS SNI:${Green_font_prefix}${stls_sni}${Font_color_suffix}"
  830. echo -e " SS 本地端口:${Green_font_prefix}${port}${Font_color_suffix}"
  831. echo -e " SS 密码:${Green_font_prefix}${password}${Font_color_suffix}"
  832. echo -e " SS 加密:${Green_font_prefix}${cipher}${Font_color_suffix}"
  833. echo -e "————————————————————————————————————————"
  834. echo -e "${Info} Shadow TLS + SS Surge 配置:"
  835. if [[ "${ipv4}" != "IPv4_Error" ]]; then
  836. echo -e "$(uname -n) = ss, ${ipv4}, ${stls_port}, encrypt-method=${cipher}, password=${password}, shadow-tls-password=${stls_password}, shadow-tls-sni=${stls_sni}, shadow-tls-version=3, tfo=${tfo}, udp-relay=true, ecn=true, udp-port=${port}"
  837. else
  838. echo -e "$(uname -n) = ss, ${ipv6}, ${stls_port}, encrypt-method=${cipher}, password=${password}, shadow-tls-password=${stls_password}, shadow-tls-sni=${stls_sni}, shadow-tls-version=3, tfo=${tfo}, udp-relay=true, ecn=true, udp-port=${port}"
  839. fi
  840. echo && echo -e "========================================"
  841. fi
  842. # 显示纯 SS 配置
  843. echo -e "${Info} 原始 Shadowsocks Rust 配置:"
  844. echo -e "————————————————————————————————————————"
  845. [[ "${ipv4}" != "IPv4_Error" ]] && echo -e " 地址:${Green_font_prefix}${ipv4}${Font_color_suffix}"
  846. [[ "${ipv6}" != "IPv6_Error" ]] && echo -e " 地址:${Green_font_prefix}${ipv6}${Font_color_suffix}"
  847. echo -e " 端口:${Green_font_prefix}${port}${Font_color_suffix}"
  848. echo -e " 密码:${Green_font_prefix}${password}${Font_color_suffix}"
  849. echo -e " 加密:${Green_font_prefix}${cipher}${Font_color_suffix}"
  850. echo -e "————————————————————————————————————————"
  851. [[ ! -z "${link_ipv4}" ]] && echo -e "${link_ipv4}"
  852. [[ ! -z "${link_ipv6}" ]] && echo -e "${link_ipv6}"
  853. echo -e "—————————————————————————"
  854. echo -e "${Info} 原始 SS Surge 配置:"
  855. if [[ "${ipv4}" != "IPv4_Error" ]]; then
  856. echo -e "$(uname -n) = ss, ${ipv4}, ${port}, encrypt-method=${cipher}, password=${password}, tfo=${tfo}, udp-relay=true, ecn=true"
  857. fi
  858. echo -e "========================================"
  859. # 根据调用来源返回到相应菜单
  860. if [[ "$menu_source" == "shadowtls" ]]; then
  861. echo && echo -n " 按回车键返回 Shadow TLS 菜单..." && read
  862. shadowtls_menu
  863. else
  864. echo && echo -n " 按回车键返回主菜单..." && read
  865. start_menu
  866. fi
  867. }
  868. view_combined_config_with_return(){
  869. check_installed_status
  870. read_config
  871. getipv4
  872. getipv6
  873. link_qr
  874. clear && echo
  875. echo -e "完整配置信息:"
  876. echo -e "========================================"
  877. # 显示 Shadow TLS + SS 配置
  878. if [[ -e ${STLS_File} ]]; then
  879. read_stls_config
  880. echo -e "${Info} Shadow TLS + Shadowsocks Rust 配置:"
  881. echo -e "————————————————————————————————————————"
  882. [[ "${ipv4}" != "IPv4_Error" ]] && echo -e " 服务器:${Green_font_prefix}${ipv4}${Font_color_suffix}"
  883. [[ "${ipv6}" != "IPv6_Error" ]] && echo -e " 服务器:${Green_font_prefix}${ipv6}${Font_color_suffix}"
  884. echo -e " Shadow TLS 端口:${Green_font_prefix}${stls_port}${Font_color_suffix}"
  885. echo -e " Shadow TLS 密码:${Green_font_prefix}${stls_password}${Font_color_suffix}"
  886. echo -e " Shadow TLS SNI:${Green_font_prefix}${stls_sni}${Font_color_suffix}"
  887. echo -e " SS 本地端口:${Green_font_prefix}${port}${Font_color_suffix}"
  888. echo -e " SS 密码:${Green_font_prefix}${password}${Font_color_suffix}"
  889. echo -e " SS 加密:${Green_font_prefix}${cipher}${Font_color_suffix}"
  890. echo -e "————————————————————————————————————————"
  891. echo -e "${Info} Shadow TLS + SS Surge 配置:"
  892. if [[ "${ipv4}" != "IPv4_Error" ]]; then
  893. echo -e "$(uname -n) = ss, ${ipv4}, ${stls_port}, encrypt-method=${cipher}, password=${password}, shadow-tls-password=${stls_password}, shadow-tls-sni=${stls_sni}, shadow-tls-version=3, tfo=${tfo}, ecn=true, udp-relay=true, udp-port=${port}"
  894. else
  895. echo -e "$(uname -n) = ss, ${ipv6}, ${stls_port}, encrypt-method=${cipher}, password=${password}, shadow-tls-password=${stls_password}, shadow-tls-sni=${stls_sni}, shadow-tls-version=3, tfo=${tfo}, ecn=true, udp-relay=true, udp-port=${port}"
  896. fi
  897. echo && echo -e "========================================"
  898. fi
  899. # 显示纯 SS 配置
  900. echo -e "${Info} 原始 Shadowsocks Rust 配置:"
  901. echo -e "————————————————————————————————————————"
  902. [[ "${ipv4}" != "IPv4_Error" ]] && echo -e " 地址:${Green_font_prefix}${ipv4}${Font_color_suffix}"
  903. [[ "${ipv6}" != "IPv6_Error" ]] && echo -e " 地址:${Green_font_prefix}${ipv6}${Font_color_suffix}"
  904. echo -e " 端口:${Green_font_prefix}${port}${Font_color_suffix}"
  905. echo -e " 密码:${Green_font_prefix}${password}${Font_color_suffix}"
  906. echo -e " 加密:${Green_font_prefix}${cipher}${Font_color_suffix}"
  907. echo -e "————————————————————————————————————————"
  908. [[ ! -z "${link_ipv4}" ]] && echo -e "${link_ipv4}"
  909. [[ ! -z "${link_ipv6}" ]] && echo -e "${link_ipv6}"
  910. echo -e "—————————————————————————"
  911. echo -e "${Info} SS Surge 配置:"
  912. if [[ "${ipv4}" != "IPv4_Error" ]]; then
  913. echo -e "$(uname -n) = ss, ${ipv4}, ${port}, encrypt-method=${cipher}, password=${password}, tfo=${tfo}, udp-relay=true, ecn=true"
  914. fi
  915. echo -e "========================================"
  916. echo && echo -n " 按回车键继续..." && read
  917. }
  918. # 综合 Shadow TLS 配置函数
  919. set_stls_config(){
  920. check_stls_installed_status
  921. read_config
  922. read_stls_config
  923. echo && echo -e "你要修改哪项 Shadow TLS 配置?
  924. ========================================
  925. ${Green_font_prefix}1.${Font_color_suffix} 修改 端口配置
  926. ${Green_font_prefix}2.${Font_color_suffix} 修改 密码配置
  927. ${Green_font_prefix}3.${Font_color_suffix} 修改 Shadow TLS SNI 域名
  928. ${Green_font_prefix}4.${Font_color_suffix} 修改 FastOpen 配置
  929. ${Green_font_prefix}5.${Font_color_suffix} 修改 Strict 模式配置
  930. ${Green_font_prefix}6.${Font_color_suffix} 修改 TLS Wildcard SNI 配置
  931. ${Green_font_prefix}7.${Font_color_suffix} 修改 回退域名配置
  932. ${Green_font_prefix}8.${Font_color_suffix} 管理 Dispatch 分发配置
  933. ========================================
  934. ${Green_font_prefix}9.${Font_color_suffix} 修改 全部配置" && echo
  935. read -e -p "(默认:取消):" modify
  936. [[ -z "${modify}" ]] && echo "已取消..." && return
  937. case "${modify}" in
  938. 1)
  939. set_stls_port
  940. write_stls_config
  941. restart_stls
  942. ;;
  943. 2)
  944. set_stls_password
  945. write_stls_config
  946. restart_stls
  947. ;;
  948. 3)
  949. set_stls_sni
  950. write_stls_config
  951. restart_stls
  952. ;;
  953. 4)
  954. set_stls_fastopen
  955. write_stls_config
  956. restart_stls
  957. ;;
  958. 5)
  959. set_stls_strict
  960. write_stls_config
  961. restart_stls
  962. ;;
  963. 6)
  964. set_stls_tls_wildcard_sni
  965. write_stls_config
  966. restart_stls
  967. ;;
  968. 7)
  969. set_stls_fallback
  970. write_stls_config
  971. restart_stls
  972. ;;
  973. 8)
  974. manage_stls_dispatch
  975. if [[ ! -z "${stls_dispatch}" ]]; then
  976. write_stls_config
  977. restart_stls
  978. fi
  979. ;;
  980. 9)
  981. set_stls_port
  982. set_stls_password
  983. set_stls_sni
  984. set_stls_fastopen
  985. set_stls_strict
  986. set_stls_tls_wildcard_sni
  987. set_stls_fallback
  988. manage_stls_dispatch
  989. write_stls_config
  990. restart_stls
  991. ;;
  992. *)
  993. echo -e "${Error} 请输入正确的数字(1-9)"
  994. set_stls_config
  995. ;;
  996. esac
  997. }
  998. # Dispatch 管理的简化版本
  999. manage_stls_dispatch(){
  1000. echo -e "${Info} 当前 dispatch 配置:"
  1001. if [[ -e ${STLS_Conf} ]]; then
  1002. echo -e "${Green_font_prefix}$(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | to_entries | map(" \(.key) -> \(.value)") | join("\n")')${Font_color_suffix}"
  1003. else
  1004. echo -e " ${stls_sni} -> 1.1.1.1:443"
  1005. echo -e " captive.apple.com -> captive.apple.com:443"
  1006. fi
  1007. echo && echo -e "是否需要修改 dispatch 配置?
  1008. ========================================
  1009. ${Green_font_prefix} 1.${Font_color_suffix} 使用默认配置(推荐)
  1010. ${Green_font_prefix} 2.${Font_color_suffix} 自定义配置所有条目
  1011. ========================================"
  1012. read -e -p "(默认:1.使用默认):" dispatch_choice
  1013. [[ -z "${dispatch_choice}" ]] && dispatch_choice="1"
  1014. if [[ "${dispatch_choice}" == "1" ]]; then
  1015. # 使用默认配置,确保使用当前设置的 SNI
  1016. echo -e "${Info} 使用默认 dispatch 配置,SNI: ${stls_sni}"
  1017. # 不设置 stls_dispatch,让 write_stls_config 使用默认逻辑
  1018. stls_dispatch=""
  1019. elif [[ "${dispatch_choice}" == "2" ]]; then
  1020. echo -e "${Info} 重新配置 dispatch 条目"
  1021. echo "请输入 dispatch 配置 (每行格式: 域名:目标地址,回车结束):"
  1022. echo "示例: cloudflare.com:1.1.1.1:443"
  1023. local dispatch_entries=""
  1024. local line_count=0
  1025. while true; do
  1026. read -e -p "条目 $((line_count+1)) (直接回车结束):" dispatch_entry
  1027. if [[ -z "${dispatch_entry}" ]]; then
  1028. break
  1029. fi
  1030. if [[ "${dispatch_entry}" =~ ^([^:]+):(.+)$ ]]; then
  1031. local sni="${BASH_REMATCH[1]}"
  1032. local target="${BASH_REMATCH[2]}"
  1033. if [[ ${line_count} -gt 0 ]]; then
  1034. dispatch_entries="${dispatch_entries},
  1035. "
  1036. fi
  1037. dispatch_entries="${dispatch_entries}\"${sni}\": \"${target}\""
  1038. line_count=$((line_count+1))
  1039. else
  1040. echo -e "${Error} 格式错误,请使用格式: 域名:目标地址"
  1041. fi
  1042. done
  1043. if [[ ${line_count} -gt 0 ]]; then
  1044. stls_dispatch="${dispatch_entries}"
  1045. echo -e "${Info} 已配置 ${line_count} 个 dispatch 条目"
  1046. else
  1047. echo -e "${Info} 没有输入条目,使用默认 dispatch 配置"
  1048. # 不设置 stls_dispatch,让 write_stls_config 使用默认逻辑
  1049. stls_dispatch=""
  1050. fi
  1051. fi
  1052. }
  1053. # 增强版 Dispatch 管理(支持单条增删改)
  1054. manage_stls_dispatch_advanced(){
  1055. echo -e "${Info} 当前 dispatch 配置:"
  1056. if [[ -e ${STLS_Conf} ]]; then
  1057. echo -e "${Green_font_prefix}$(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | to_entries | map(" \(.key) -> \(.value)") | join("\n")')${Font_color_suffix}"
  1058. else
  1059. echo -e " ${stls_sni} -> 1.1.1.1:443"
  1060. echo -e " captive.apple.com -> captive.apple.com:443"
  1061. fi
  1062. echo && echo -e "请选择 dispatch 管理操作:
  1063. ========================================
  1064. ${Green_font_prefix} 1.${Font_color_suffix} 保持当前配置
  1065. ${Green_font_prefix} 2.${Font_color_suffix} 添加新条目
  1066. ${Green_font_prefix} 3.${Font_color_suffix} 删除指定条目
  1067. ${Green_font_prefix} 4.${Font_color_suffix} 修改指定条目
  1068. ${Green_font_prefix} 5.${Font_color_suffix} 重新配置所有条目
  1069. ========================================"
  1070. read -e -p "(默认:1.保持当前):" dispatch_choice
  1071. [[ -z "${dispatch_choice}" ]] && dispatch_choice="1"
  1072. case "${dispatch_choice}" in
  1073. 1)
  1074. echo -e "${Info} 保持当前配置"
  1075. ;;
  1076. 2)
  1077. add_dispatch_entry
  1078. ;;
  1079. 3)
  1080. delete_dispatch_entry
  1081. ;;
  1082. 4)
  1083. modify_dispatch_entry
  1084. ;;
  1085. 5)
  1086. reconfigure_all_dispatch
  1087. ;;
  1088. *)
  1089. echo -e "${Error} 输入错误,保持当前配置"
  1090. ;;
  1091. esac
  1092. }
  1093. # 添加 dispatch 条目
  1094. add_dispatch_entry(){
  1095. echo -e "${Info} 添加新的 dispatch 条目"
  1096. read -e -p "请输入域名 (如: example.com):" new_sni
  1097. if [[ -z "${new_sni}" ]]; then
  1098. echo -e "${Error} 域名不能为空"
  1099. return
  1100. fi
  1101. read -e -p "请输入目标地址 (如: 1.1.1.1:443):" new_target
  1102. if [[ -z "${new_target}" ]]; then
  1103. echo -e "${Error} 目标地址不能为空"
  1104. return
  1105. fi
  1106. # 获取当前 dispatch 配置
  1107. if [[ -e ${STLS_Conf} ]]; then
  1108. current_dispatch=$(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | to_entries | map("\"\(.key)\": \"\(.value)\"") | join(",\n ")')
  1109. stls_dispatch="${current_dispatch},
  1110. \"${new_sni}\": \"${new_target}\""
  1111. else
  1112. stls_dispatch="\"${stls_sni}\": \"1.1.1.1:443\",
  1113. \"captive.apple.com\": \"captive.apple.com:443\",
  1114. \"${new_sni}\": \"${new_target}\""
  1115. fi
  1116. echo -e "${Info} 已添加条目: ${new_sni} -> ${new_target}"
  1117. }
  1118. # 删除 dispatch 条目
  1119. delete_dispatch_entry(){
  1120. if [[ ! -e ${STLS_Conf} ]]; then
  1121. echo -e "${Error} 配置文件不存在"
  1122. return
  1123. fi
  1124. echo -e "${Info} 当前 dispatch 条目:"
  1125. # 显示带编号的列表
  1126. local domains=($(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | keys[]'))
  1127. local targets=($(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | to_entries | map(.value) | .[]'))
  1128. if [[ ${#domains[@]} -eq 0 ]]; then
  1129. echo -e "${Error} 没有可删除的条目"
  1130. return
  1131. fi
  1132. for i in "${!domains[@]}"; do
  1133. echo -e " ${Green_font_prefix}$((i+1)).${Font_color_suffix} ${domains[i]} -> ${targets[i]}"
  1134. done
  1135. read -e -p "请输入要删除的条目编号 (1-${#domains[@]}):" del_num
  1136. if [[ -z "${del_num}" ]] || [[ ${del_num} -lt 1 ]] || [[ ${del_num} -gt ${#domains[@]} ]]; then
  1137. echo -e "${Error} 输入的编号无效"
  1138. return
  1139. fi
  1140. # 重新构建 dispatch 配置,排除删除的条目
  1141. local del_domain="${domains[$((del_num-1))]}"
  1142. local new_entries=""
  1143. local count=0
  1144. for i in "${!domains[@]}"; do
  1145. if [[ "${domains[i]}" != "${del_domain}" ]]; then
  1146. if [[ ${count} -gt 0 ]]; then
  1147. new_entries="${new_entries},
  1148. "
  1149. fi
  1150. new_entries="${new_entries}\"${domains[i]}\": \"${targets[i]}\""
  1151. count=$((count+1))
  1152. fi
  1153. done
  1154. if [[ ${count} -eq 0 ]]; then
  1155. # 如果删除后没有条目,使用默认配置
  1156. stls_dispatch="\"${stls_sni}\": \"1.1.1.1:443\",
  1157. \"captive.apple.com\": \"captive.apple.com:443\""
  1158. else
  1159. stls_dispatch="${new_entries}"
  1160. fi
  1161. echo -e "${Info} 已删除条目: ${del_domain}"
  1162. }
  1163. # 修改 dispatch 条目
  1164. modify_dispatch_entry(){
  1165. if [[ ! -e ${STLS_Conf} ]]; then
  1166. echo -e "${Error} 配置文件不存在"
  1167. return
  1168. fi
  1169. echo -e "${Info} 当前 dispatch 条目:"
  1170. # 显示带编号的列表
  1171. local domains=($(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | keys[]'))
  1172. local targets=($(cat ${STLS_Conf}|jq -r '.server.tls_addr.dispatch | to_entries | map(.value) | .[]'))
  1173. if [[ ${#domains[@]} -eq 0 ]]; then
  1174. echo -e "${Error} 没有可修改的条目"
  1175. return
  1176. fi
  1177. for i in "${!domains[@]}"; do
  1178. echo -e " ${Green_font_prefix}$((i+1)).${Font_color_suffix} ${domains[i]} -> ${targets[i]}"
  1179. done
  1180. read -e -p "请输入要修改的条目编号 (1-${#domains[@]}):" mod_num
  1181. if [[ -z "${mod_num}" ]] || [[ ${mod_num} -lt 1 ]] || [[ ${mod_num} -gt ${#domains[@]} ]]; then
  1182. echo -e "${Error} 输入的编号无效"
  1183. return
  1184. fi
  1185. local mod_domain="${domains[$((mod_num-1))]}"
  1186. local mod_target="${targets[$((mod_num-1))]}"
  1187. echo -e "${Info} 当前条目: ${mod_domain} -> ${mod_target}"
  1188. read -e -p "请输入新的域名 (直接回车保持不变):" new_domain
  1189. read -e -p "请输入新的目标地址 (直接回车保持不变):" new_target
  1190. [[ -z "${new_domain}" ]] && new_domain="${mod_domain}"
  1191. [[ -z "${new_target}" ]] && new_target="${mod_target}"
  1192. # 重新构建 dispatch 配置
  1193. local new_entries=""
  1194. for i in "${!domains[@]}"; do
  1195. if [[ ${i} -gt 0 ]]; then
  1196. new_entries="${new_entries},
  1197. "
  1198. fi
  1199. if [[ ${i} -eq $((mod_num-1)) ]]; then
  1200. new_entries="${new_entries}\"${new_domain}\": \"${new_target}\""
  1201. else
  1202. new_entries="${new_entries}\"${domains[i]}\": \"${targets[i]}\""
  1203. fi
  1204. done
  1205. stls_dispatch="${new_entries}"
  1206. echo -e "${Info} 已修改条目: ${mod_domain} -> ${mod_target} => ${new_domain} -> ${new_target}"
  1207. }
  1208. # 重新配置所有 dispatch 条目
  1209. reconfigure_all_dispatch(){
  1210. echo -e "${Info} 重新配置所有 dispatch 条目"
  1211. echo "请输入 dispatch 配置 (每行格式: 域名:目标地址,回车结束):"
  1212. echo "示例: cloudflare.com:1.1.1.1:443"
  1213. local dispatch_entries=""
  1214. local line_count=0
  1215. while true; do
  1216. read -e -p "条目 $((line_count+1)) (直接回车结束):" dispatch_entry
  1217. if [[ -z "${dispatch_entry}" ]]; then
  1218. break
  1219. fi
  1220. if [[ "${dispatch_entry}" =~ ^([^:]+):(.+)$ ]]; then
  1221. local sni="${BASH_REMATCH[1]}"
  1222. local target="${BASH_REMATCH[2]}"
  1223. if [[ ${line_count} -gt 0 ]]; then
  1224. dispatch_entries="${dispatch_entries},
  1225. "
  1226. fi
  1227. dispatch_entries="${dispatch_entries}\"${sni}\": \"${target}\""
  1228. line_count=$((line_count+1))
  1229. else
  1230. echo -e "${Error} 格式错误,请使用格式: 域名:目标地址"
  1231. fi
  1232. done
  1233. if [[ ${line_count} -gt 0 ]]; then
  1234. stls_dispatch="${dispatch_entries}"
  1235. echo -e "${Info} 已配置 ${line_count} 个 dispatch 条目"
  1236. else
  1237. echo -e "${Info} 使用默认 dispatch 配置"
  1238. stls_dispatch="\"${stls_sni}\": \"1.1.1.1:443\",
  1239. \"captive.apple.com\": \"captive.apple.com:443\""
  1240. fi
  1241. }
  1242. start(){
  1243. check_installed_status
  1244. check_status
  1245. if [[ "$status" == "running" ]]; then
  1246. echo -e "${Info} Shadowsocks Rust 已在运行!"
  1247. else
  1248. systemctl start ss-rust
  1249. check_status
  1250. if [[ "$status" == "running" ]]; then
  1251. echo -e "${Info} Shadowsocks Rust 启动成功!"
  1252. else
  1253. echo -e "${Error} Shadowsocks Rust 启动失败!"
  1254. exit 1
  1255. fi
  1256. fi
  1257. sleep 3s
  1258. }
  1259. start_stls(){
  1260. check_stls_installed_status
  1261. check_stls_status
  1262. if [[ "$stls_status" == "running" ]]; then
  1263. echo -e "${Info} Shadow TLS 已在运行!"
  1264. else
  1265. systemctl start shadowtls
  1266. check_stls_status
  1267. if [[ "$stls_status" == "running" ]]; then
  1268. echo -e "${Info} Shadow TLS 启动成功!"
  1269. else
  1270. echo -e "${Error} Shadow TLS 启动失败!"
  1271. exit 1
  1272. fi
  1273. fi
  1274. sleep 3s
  1275. }
  1276. stop(){
  1277. check_installed_status
  1278. check_status
  1279. [[ !"$status" == "running" ]] && echo -e "${Error} Shadowsocks Rust 没有运行,请检查!" && exit 1
  1280. systemctl stop ss-rust
  1281. sleep 3s
  1282. start_menu
  1283. }
  1284. stop_stls(){
  1285. check_stls_installed_status
  1286. check_stls_status
  1287. [[ !"$stls_status" == "running" ]] && echo -e "${Error} Shadow TLS 没有运行,请检查!" && exit 1
  1288. systemctl stop shadowtls
  1289. sleep 3s
  1290. }
  1291. restart(){
  1292. check_installed_status
  1293. systemctl restart ss-rust
  1294. echo -e "${Info} Shadowsocks Rust 重启完毕 !"
  1295. sleep 3s
  1296. start_menu
  1297. }
  1298. restart_stls(){
  1299. check_stls_installed_status
  1300. systemctl restart shadowtls
  1301. echo -e "${Info} Shadow TLS 重启完毕 !"
  1302. sleep 3s
  1303. }
  1304. update(){
  1305. check_installed_status
  1306. check_new_ver
  1307. check_ver_comparison
  1308. echo -e "${Info} Shadowsocks Rust 更新完毕!"
  1309. sleep 3s
  1310. start_menu
  1311. }
  1312. update_stls(){
  1313. check_stls_installed_status
  1314. check_stls_new_ver
  1315. check_stls_ver_comparison
  1316. echo -e "${Info} Shadow TLS 更新完毕!"
  1317. sleep 3s
  1318. }
  1319. # 脚本更新函数
  1320. update_sh(){
  1321. echo -e "当前版本为 [ ${sh_ver} ],开始检测最新版本..."
  1322. sh_new_ver=$(wget --no-check-certificate -qO- "https://raw.githubusercontent.com/xOS/Shadowsocks-Rust/master/ss-rust.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1)
  1323. [[ -z ${sh_new_ver} ]] && echo -e "${Error} 检测最新版本失败 !" && start_menu
  1324. if [[ ${sh_new_ver} != ${sh_ver} ]]; then
  1325. echo -e "发现新版本[ ${sh_new_ver} ],是否更新?[Y/n]"
  1326. read -p "(默认:y):" yn
  1327. [[ -z "${yn}" ]] && yn="y"
  1328. if [[ ${yn} == [Yy] ]]; then
  1329. wget -O ss-rust.sh --no-check-certificate https://raw.githubusercontent.com/xOS/Shadowsocks-Rust/master/ss-rust.sh && chmod +x ss-rust.sh
  1330. echo -e "脚本已更新为最新版本[ ${sh_new_ver} ]!"
  1331. echo -e "3s后执行新脚本"
  1332. sleep 3s
  1333. bash ss-rust.sh
  1334. else
  1335. echo && echo " 已取消..." && echo
  1336. sleep 3s
  1337. start_menu
  1338. fi
  1339. else
  1340. echo -e "当前已是最新版本[ ${sh_new_ver} ] !"
  1341. sleep 3s
  1342. start_menu
  1343. fi
  1344. sleep 3s
  1345. bash ss-rust.sh
  1346. }
  1347. uninstall(){
  1348. check_installed_status
  1349. echo "确定要卸载 Shadowsocks Rust ? (y/N)"
  1350. echo
  1351. read -e -p "(默认:n):" unyn
  1352. [[ -z ${unyn} ]] && unyn="n"
  1353. if [[ ${unyn} == [Yy] ]]; then
  1354. check_status
  1355. [[ "$status" == "running" ]] && systemctl stop ss-rust
  1356. systemctl disable ss-rust
  1357. rm -rf "${SS_Folder}"
  1358. rm -rf "${SS_File}"
  1359. echo && echo "Shadowsocks Rust 卸载完成!" && echo
  1360. else
  1361. echo && echo "卸载已取消..." && echo
  1362. fi
  1363. sleep 3s
  1364. start_menu
  1365. }
  1366. uninstall_stls(){
  1367. check_stls_installed_status
  1368. echo "确定要卸载 Shadow TLS ? (y/N)"
  1369. echo
  1370. read -e -p "(默认:n):" unyn
  1371. [[ -z ${unyn} ]] && unyn="n"
  1372. if [[ ${unyn} == [Yy] ]]; then
  1373. check_stls_status
  1374. [[ "$stls_status" == "running" ]] && systemctl stop shadowtls
  1375. systemctl disable shadowtls
  1376. rm -rf "${STLS_Folder}"
  1377. rm -rf "${STLS_File}"
  1378. rm -f "/etc/systemd/system/shadowtls.service"
  1379. systemctl daemon-reload
  1380. echo && echo "Shadow TLS 卸载完成!" && echo
  1381. else
  1382. echo && echo "卸载已取消..." && echo
  1383. fi
  1384. sleep 3s
  1385. }
  1386. getipv4(){
  1387. ipv4=$(wget -qO- -4 -t1 -T2 ipinfo.io/ip)
  1388. if [[ -z "${ipv4}" ]]; then
  1389. ipv4=$(wget -qO- -4 -t1 -T2 api.ip.sb/ip)
  1390. if [[ -z "${ipv4}" ]]; then
  1391. ipv4=$(wget -qO- -4 -t1 -T2 members.3322.org/dyndns/getip)
  1392. if [[ -z "${ipv4}" ]]; then
  1393. ipv4="IPv4_Error"
  1394. fi
  1395. fi
  1396. fi
  1397. }
  1398. getipv6(){
  1399. ipv6=$(wget -qO- -6 -t1 -T2 ifconfig.co)
  1400. if [[ -z "${ipv6}" ]]; then
  1401. ipv6="IPv6_Error"
  1402. fi
  1403. }
  1404. urlsafe_base64(){
  1405. date=$(echo -n "$1"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g;s/+/-/g;s/\//_/g')
  1406. echo -e "${date}"
  1407. }
  1408. link_qr(){
  1409. if [[ "${ipv4}" != "IPv4_Error" ]]; then
  1410. SSbase64=$(urlsafe_base64 "${cipher}:${password}@${ipv4}:${port}")
  1411. SSurl="ss://${SSbase64}"
  1412. SSQRcode="https://cli.im/api/qrcode/code?text=${SSurl}"
  1413. link_ipv4=" 链接 [IPv4]:${Red_font_prefix}${SSurl}${Font_color_suffix} \n 二维码[IPv4]:${Red_font_prefix}${SSQRcode}${Font_color_suffix}"
  1414. fi
  1415. if [[ "${ipv6}" != "IPv6_Error" ]]; then
  1416. SSbase64=$(urlsafe_base64 "${cipher}:${password}@${ipv6}:${port}")
  1417. SSurl="ss://${SSbase64}"
  1418. SSQRcode="https://cli.im/api/qrcode/code?text=${SSurl}"
  1419. link_ipv6=" 链接 [IPv6]:${Red_font_prefix}${SSurl}${Font_color_suffix} \n 二维码[IPv6]:${Red_font_prefix}${SSQRcode}${Font_color_suffix}"
  1420. fi
  1421. }
  1422. before_start_menu(){
  1423. echo && echo -n " 任意键继续..." && read
  1424. start_menu
  1425. }
  1426. before_shadowtls_menu(){
  1427. echo && echo -n " 任意键继续..." && read
  1428. shadowtls_menu
  1429. }
  1430. # Shadow TLS 状态和版本检查函数
  1431. check_stls_installed_status(){
  1432. [[ ! -e ${STLS_File} ]] && echo -e "${Error} Shadow TLS 没有安装,请检查!" && exit 1
  1433. }
  1434. check_stls_status(){
  1435. stls_status=`systemctl status shadowtls | grep Active | awk '{print $3}' | cut -d "(" -f2 | cut -d ")" -f1`
  1436. }
  1437. check_stls_new_ver(){
  1438. stls_new_ver=$(wget -qO- https://api.github.com/repos/ihciah/shadow-tls/releases| jq -r '[.[] | select(.prerelease == false) | select(.draft == false) | .tag_name] | .[0]')
  1439. [[ -z ${stls_new_ver} ]] && echo -e "${Error} Shadow TLS 最新版本获取失败!" && exit 1
  1440. echo -e "${Info} 检测到 Shadow TLS 最新版本为 [ ${stls_new_ver} ]"
  1441. }
  1442. check_stls_ver_comparison(){
  1443. stls_now_ver=$(cat ${STLS_Now_ver_File})
  1444. if [[ "${stls_now_ver}" != "${stls_new_ver}" ]]; then
  1445. echo -e "${Info} 发现 Shadow TLS 已有新版本 [ ${stls_new_ver} ],旧版本 [ ${stls_now_ver} ]"
  1446. read -e -p "是否更新 ? [Y/n]:" yn
  1447. [[ -z "${yn}" ]] && yn="y"
  1448. if [[ $yn == [Yy] ]]; then
  1449. check_stls_status
  1450. \cp "${STLS_Conf}" "/tmp/stls_config.json"
  1451. download_stls
  1452. mv -f "/tmp/stls_config.json" "${STLS_Conf}"
  1453. restart_stls
  1454. fi
  1455. else
  1456. echo -e "${Info} 当前 Shadow TLS 已是最新版本 [ ${stls_new_ver} ] !" && exit 1
  1457. fi
  1458. }
  1459. # Shadow TLS 专用菜单
  1460. shadowtls_menu(){
  1461. check_root
  1462. check_sys
  1463. sys_arch
  1464. # 检查 Shadow TLS 安装状态
  1465. if [[ -e ${STLS_File} ]]; then
  1466. check_stls_status
  1467. if [[ "$stls_status" == "running" ]]; then
  1468. stls_status_show="${Green_font_prefix}已安装${Font_color_suffix} 且 ${Green_font_prefix}运行中${Font_color_suffix}"
  1469. else
  1470. stls_status_show="${Green_font_prefix}已安装${Font_color_suffix} 但 ${Yellow_font_prefix}未运行${Font_color_suffix}"
  1471. fi
  1472. else
  1473. stls_status_show="${Red_font_prefix}未安装${Font_color_suffix}"
  1474. fi
  1475. clear
  1476. echo -e "Shadow TLS 管理菜单 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix}
  1477. ==================状态==================
  1478. Shadow TLS : [${stls_status_show}]
  1479. ========================================
  1480. ${Green_font_prefix}0.${Font_color_suffix} 更新脚本
  1481. ==================菜单==================
  1482. ${Green_font_prefix}1.${Font_color_suffix} 安装 Shadow TLS
  1483. ${Green_font_prefix}2.${Font_color_suffix} 更新 Shadow TLS
  1484. ${Green_font_prefix}3.${Font_color_suffix} 卸载 Shadow TLS
  1485. ————————————————————————————————————————
  1486. ${Green_font_prefix}4.${Font_color_suffix} 启动 Shadow TLS
  1487. ${Green_font_prefix}5.${Font_color_suffix} 停止 Shadow TLS
  1488. ${Green_font_prefix}6.${Font_color_suffix} 重启 Shadow TLS
  1489. ————————————————————————————————————————
  1490. ${Green_font_prefix}7.${Font_color_suffix} 修改 Shadow TLS 配置
  1491. ${Green_font_prefix}8.${Font_color_suffix} 查看 Shadow TLS 配置
  1492. ${Green_font_prefix}9.${Font_color_suffix} 查看 Shadow TLS 状态
  1493. ————————————————————————————————————————
  1494. ${Green_font_prefix}10.${Font_color_suffix} 查看完整配置信息
  1495. ${Green_font_prefix}11.${Font_color_suffix} 返回主菜单
  1496. ————————————————————————————————————————
  1497. ${Green_font_prefix}00.${Font_color_suffix} 退出脚本
  1498. ========================================" && echo
  1499. read -e -p " 请输入数字 [0-11]:" stls_num
  1500. case "$stls_num" in
  1501. 1)
  1502. install_stls
  1503. shadowtls_menu
  1504. ;;
  1505. 2)
  1506. update_stls
  1507. shadowtls_menu
  1508. ;;
  1509. 3)
  1510. uninstall_stls
  1511. shadowtls_menu
  1512. ;;
  1513. 4)
  1514. start_stls
  1515. shadowtls_menu
  1516. ;;
  1517. 5)
  1518. stop_stls
  1519. shadowtls_menu
  1520. ;;
  1521. 6)
  1522. restart_stls
  1523. shadowtls_menu
  1524. ;;
  1525. 7)
  1526. set_stls_config
  1527. shadowtls_menu
  1528. ;;
  1529. 8)
  1530. view_stls_only
  1531. ;;
  1532. 9)
  1533. view_stls_status
  1534. ;;
  1535. 10)
  1536. view_combined_config shadowtls
  1537. ;;
  1538. 11)
  1539. start_menu
  1540. ;;
  1541. 0)
  1542. update_sh
  1543. ;;
  1544. 00)
  1545. exit 1
  1546. ;;
  1547. *)
  1548. echo -e "${Error} 请输入正确数字 [0-11] (退出输入00)"
  1549. sleep 5s
  1550. shadowtls_menu
  1551. ;;
  1552. esac
  1553. }
  1554. # 查看 Shadowsocks Rust 状态函数
  1555. view_ss_status(){
  1556. check_installed_status
  1557. echo -e "${Info} 正在获取 Shadowsocks Rust 状态信息..."
  1558. echo
  1559. echo "=================================="
  1560. echo -e " Shadowsocks Rust 服务状态"
  1561. echo "=================================="
  1562. systemctl status ss-rust
  1563. echo "=================================="
  1564. echo
  1565. read -e -p "按回车键返回主菜单..."
  1566. start_menu
  1567. }
  1568. # 查看 Shadow TLS 状态函数
  1569. view_stls_status(){
  1570. check_stls_installed_status
  1571. echo -e "${Info} 正在获取 Shadow TLS 状态信息..."
  1572. echo
  1573. echo "=================================="
  1574. echo -e " Shadow TLS 服务状态"
  1575. echo "=================================="
  1576. systemctl status shadowtls
  1577. echo "=================================="
  1578. echo
  1579. read -e -p "按回车键返回 Shadow TLS 菜单..."
  1580. shadowtls_menu
  1581. }
  1582. # 查看 Shadow TLS 配置函数
  1583. view_stls_only(){
  1584. check_stls_installed_status
  1585. echo -e "${Info} 正在获取 Shadow TLS 配置信息..."
  1586. echo
  1587. echo "=================================="
  1588. echo -e " Shadow TLS 配置信息"
  1589. echo "=================================="
  1590. if [[ -f "$STLS_Conf" ]]; then
  1591. cat "$STLS_Conf"
  1592. else
  1593. echo -e "${Error} Shadow TLS 配置文件不存在!"
  1594. fi
  1595. echo "=================================="
  1596. echo
  1597. read -e -p "按回车键返回 Shadow TLS 菜单..."
  1598. shadowtls_menu
  1599. }
  1600. # 主菜单函数
  1601. start_menu(){
  1602. echo -e "${Info} 正在启动 Shadowsocks Rust 管理脚本..."
  1603. check_root
  1604. echo -e "${Info} 权限检查完成,正在检测系统..."
  1605. check_sys
  1606. echo -e "${Info} 系统检测完成,正在检测架构..."
  1607. sys_arch
  1608. echo -e "${Info} 架构检测完成,正在检查服务状态..."
  1609. # 检查安装状态
  1610. if [[ -e ${SS_File} ]]; then
  1611. check_status
  1612. if [[ "$status" == "running" ]]; then
  1613. ss_status_show="${Green_font_prefix}已安装${Font_color_suffix} 且 ${Green_font_prefix}运行中${Font_color_suffix}"
  1614. else
  1615. ss_status_show="${Green_font_prefix}已安装${Font_color_suffix} 但 ${Yellow_font_prefix}未运行${Font_color_suffix}"
  1616. fi
  1617. else
  1618. ss_status_show="${Red_font_prefix}未安装${Font_color_suffix}"
  1619. fi
  1620. # 检查 Shadow TLS 安装状态
  1621. if [[ -e ${STLS_File} ]]; then
  1622. check_stls_status
  1623. if [[ "$stls_status" == "running" ]]; then
  1624. stls_status_show="${Green_font_prefix}已安装${Font_color_suffix} 且 ${Green_font_prefix}运行中${Font_color_suffix}"
  1625. else
  1626. stls_status_show="${Green_font_prefix}已安装${Font_color_suffix} 但 ${Yellow_font_prefix}未运行${Font_color_suffix}"
  1627. fi
  1628. else
  1629. stls_status_show="${Red_font_prefix}未安装${Font_color_suffix}"
  1630. fi
  1631. clear
  1632. echo -e "Shadowsocks Rust 管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix}
  1633. ==================状态==================
  1634. Shadowsocks Rust : [${ss_status_show}]
  1635. Shadow TLS : [${stls_status_show}]
  1636. ========================================
  1637. ${Green_font_prefix}0.${Font_color_suffix} 更新脚本
  1638. ==================菜单==================
  1639. ${Green_font_prefix}1.${Font_color_suffix} 安装 Shadowsocks Rust
  1640. ${Green_font_prefix}2.${Font_color_suffix} 更新 Shadowsocks Rust
  1641. ${Green_font_prefix}3.${Font_color_suffix} 卸载 Shadowsocks Rust
  1642. ————————————————————————————————————————
  1643. ${Green_font_prefix}4.${Font_color_suffix} 启动 Shadowsocks Rust
  1644. ${Green_font_prefix}5.${Font_color_suffix} 停止 Shadowsocks Rust
  1645. ${Green_font_prefix}6.${Font_color_suffix} 重启 Shadowsocks Rust
  1646. ————————————————————————————————————————
  1647. ${Green_font_prefix}7.${Font_color_suffix} 配置 Shadowsocks Rust 相关
  1648. ${Green_font_prefix}8.${Font_color_suffix} 查看 Shadowsocks Rust 配置
  1649. ${Green_font_prefix}9.${Font_color_suffix} 查看 Shadowsocks Rust 状态
  1650. ========================================
  1651. ${Green_font_prefix}10.${Font_color_suffix} 配置 Shadow TLS 相关
  1652. ${Green_font_prefix}11.${Font_color_suffix} 查看完整配置信息
  1653. ————————————————————————————————————————
  1654. ${Green_font_prefix}00.${Font_color_suffix} 退出脚本
  1655. ========================================" && echo
  1656. read -e -p " 请输入数字 [0-11]:" num
  1657. case "$num" in
  1658. 1)
  1659. install
  1660. ;;
  1661. 2)
  1662. update
  1663. start_menu
  1664. ;;
  1665. 3)
  1666. uninstall
  1667. start_menu
  1668. ;;
  1669. 4)
  1670. start
  1671. start_menu
  1672. ;;
  1673. 5)
  1674. stop
  1675. start_menu
  1676. ;;
  1677. 6)
  1678. restart
  1679. start_menu
  1680. ;;
  1681. 7)
  1682. set_config
  1683. ;;
  1684. 8)
  1685. view
  1686. ;;
  1687. 9)
  1688. view_ss_status
  1689. ;;
  1690. 10)
  1691. shadowtls_menu
  1692. ;;
  1693. 11)
  1694. view_combined_config
  1695. ;;
  1696. 0)
  1697. update_sh
  1698. ;;
  1699. 00)
  1700. exit 1
  1701. ;;
  1702. *)
  1703. echo -e "${Error} 请输入正确数字 [0-11] (退出输入00)"
  1704. sleep 5s
  1705. start_menu
  1706. ;;
  1707. esac
  1708. }
  1709. # 脚本执行入口
  1710. start_menu