-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·379 lines (331 loc) · 14.5 KB
/
Copy pathinstall.sh
File metadata and controls
executable file
·379 lines (331 loc) · 14.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
#!/bin/bash
# ==============================================================================
# Script Name: install.sh
# Description: 服务器优化脚本合集
# Usage: bash <(curl -sL ss.hide.ss)
# ==============================================================================
set -euo pipefail
# --- 配置项 ---
readonly VERSION="1.0.0"
readonly REPO_URL="https://github.com/f3liiix/server-scripts"
readonly RAW_BASE="https://ss.hide.ss"
readonly INSTALL_DIR="/opt/server-scripts"
# 颜色定义
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly CYAN='\033[0;36m'
readonly WHITE='\033[1;37m'
readonly MAGENTA='\033[0;35m'
readonly GRAY='\033[0;37m'
readonly DARK_GRAY='\033[1;30m'
readonly NC='\033[0m'
# 日志函数
log() {
echo -e "${CYAN}[信息]${NC} $1"
}
success() {
echo -e "${GREEN}[成功]${NC} $1"
}
warn() {
echo -e "${YELLOW}[注意]${NC} $1"
}
error() {
echo -e "${RED}[错误]${NC} $1" >&2
}
info() {
echo -e "${CYAN}[信息]${NC} $1"
}
# 检查root权限
check_root() {
if [[ $EUID -ne 0 ]]; then
error "需要 root 权限运行此脚本"
echo "请使用: sudo bash <(curl -sL ss.hide.ss)"
exit 1
fi
}
# 检测发行版和版本
detect_system() {
local distro=""
local version=""
if [[ -f /etc/os-release ]]; then
# 使用grep和cut解析,避免source导致的变量冲突
distro=$(grep '^ID=' /etc/os-release | cut -d'=' -f2 | tr -d '"' || echo "unknown")
version=$(grep '^VERSION_ID=' /etc/os-release | cut -d'=' -f2 | tr -d '"' || echo "unknown")
# 如果VERSION_ID不存在,尝试使用VERSION
if [[ "$version" == "unknown" ]]; then
version=$(grep '^VERSION=' /etc/os-release | cut -d'=' -f2 | tr -d '"' || echo "unknown")
fi
elif [[ -f /etc/debian_version ]]; then
distro="debian"
version=$(cat /etc/debian_version)
else
distro="unknown"
version="unknown"
fi
echo "$distro:$version"
}
# 显示欢迎界面
show_welcome() {
clear
echo -e "${GREEN}"
echo "███████╗███████╗ ██╗ ██╗██╗██████╗ ███████╗ ███████╗███████╗"
echo "██╔════╝██╔════╝ ██║ ██║██║██╔══██╗██╔════╝ ██╔════╝██╔════╝"
echo "███████╗███████╗ ███████║██║██║ ██║█████╗ ███████╗███████╗"
echo "╚════██║╚════██║ ██╔══██║██║██║ ██║██╔══╝ ╚════██║╚════██║"
echo "███████║███████║██╗██║ ██║██║██████╔╝███████╗██╗███████║███████║"
echo "╚══════╝╚══════╝╚═╝╚═╝ ╚═╝╚═╝╚═════╝ ╚══════╝╚═╝╚══════╝╚══════╝"
echo "═════════════════════════════════════════════════════════════════"
echo " 服务器优化脚本合集 - bash <(curl -sL ss.hide.ss) "
echo -e "${NC}"
echo
}
# 显示系统信息
show_system_info() {
local system_info
system_info=$(detect_system)
local distro="${system_info%:*}"
local version="${system_info#*:}"
local kernel_version=$(uname -r)
local arch=$(uname -m)
echo -e "${CYAN}🖥️ 系统信息${NC}"
echo -e "${DARK_GRAY}─────────────────────────────────────────────────────────────────${NC}"
echo -e "操作系统 : ${WHITE}$distro $version${NC}"
echo -e "内核版本 : ${WHITE}$kernel_version${NC}"
}
# 检查系统兼容性
check_system() {
# 检查基本命令
local missing_commands=()
for cmd in curl wget; do
if ! command -v "$cmd" >/dev/null 2>&1; then
missing_commands+=("$cmd")
fi
done
if [[ ${#missing_commands[@]} -gt 0 ]]; then
warn "缺少命令: ${missing_commands[*]} - 建议安装以获得更好体验 ⚠️"
fi
echo
}
# 下载并安装
install_tools() {
# 创建安装目录
mkdir -p "$INSTALL_DIR"
cd "$INSTALL_DIR"
# 下载主要脚本文件
local files=(
"scripts/common_functions.sh"
"scripts/run_optimization.sh"
"scripts/system_update.sh"
"scripts/disable_ipv6.sh"
"scripts/tcp_tuning.sh"
"scripts/enable_bbr.sh"
"scripts/configure_ssh.sh"
"scripts/configure_dns.sh"
"scripts/reinstall_system.sh"
"scripts/install_bt.sh"
"scripts/server_config.conf"
)
local total_files=${#files[@]}
local current=0
for file in "${files[@]}"; do
((current++))
local dir=$(dirname "$file")
mkdir -p "$dir"
# 显示进度
echo -ne "\r${CYAN}[信息]${NC} 正在下载文件 [$current/$total_files] ${WHITE}$file${NC} ... "
# 静默下载,只在失败时输出错误
if curl -fsSL "$RAW_BASE/$file" -o "$file" 2>/dev/null; then
continue
else
echo -e "\r${RED}[错误]${NC} 下载失败: $file ${RED}✗${NC} "
return 1
fi
done
# 清除动态显示行
echo -ne "\r\033[K" # 使用 ANSI 转义序列清除整行
# 设置权限
find . -name "*.sh" -exec chmod +x {} \;
chown -R root:root "$INSTALL_DIR" 2>/dev/null || true
return 0
}
# 验证安装
verify_installation() {
# 验证主控制脚本是否存在且可执行
local main_script="$INSTALL_DIR/scripts/run_optimization.sh"
if [[ -f "$main_script" ]] && [[ -x "$main_script" ]]; then
return 0
else
return 1
fi
}
# 系统初始化(下载和验证)
initialize_system() {
echo -ne "${CYAN}[信息]${NC} 正在初始化脚本..."
# 执行下载
if ! install_tools; then
echo -e "\r${RED}[错误]${NC} 脚本初始化失败 ${RED}✗${NC}"
exit 1
fi
# 验证安装
if verify_installation; then
echo -e "\r${GREEN}[成功]${NC} 脚本初始化完成 ${GREEN}✓${NC}"
else
echo -e "\r${RED}[错误]${NC} 脚本初始化失败 ${RED}✗${NC}"
exit 1
fi
echo
}
# 运行优化脚本
run_optimization() {
local option="$1"
local main_script="$INSTALL_DIR/scripts/run_optimization.sh"
if [[ -x "$main_script" ]]; then
if ! bash "$main_script" "$option"; then
log_error "优化脚本执行失败,请重试或提交 Github Issue"
return 1
fi
else
error "优化脚本未找到或无执行权限"
return 1
fi
}
# 交互式菜单
interactive_menu() {
local show_header="${1:-true}" # 默认显示标题框
while true; do
# 根据参数决定是否显示标题框
if [[ "$show_header" == "true" ]]; then
clear
echo -e "${GREEN}"
echo "███████╗███████╗ ██╗ ██╗██╗██████╗ ███████╗ ███████╗███████╗"
echo "██╔════╝██╔════╝ ██║ ██║██║██╔══██╗██╔════╝ ██╔════╝██╔════╝"
echo "███████╗███████╗ ███████║██║██║ ██║█████╗ ███████╗███████╗"
echo "╚════██║╚════██║ ██╔══██║██║██║ ██║██╔══╝ ╚════██║╚════██║"
echo "███████║███████║██╗██║ ██║██║██████╔╝███████╗██╗███████║███████║"
echo "╚══════╝╚══════╝╚═╝╚═╝ ╚═╝╚═╝╚═════╝ ╚══════╝╚═╝╚══════╝╚══════╝"
echo "═════════════════════════════════════════════════════════════════"
echo " 服务器优化脚本合集 - bash <(curl -sL ss.hide.ss) "
echo -e "${NC}"
echo
show_system_info
echo
fi
echo -e "${CYAN}🛠️ 功能菜单${NC}"
echo -e "${DARK_GRAY}─────────────────────────────────────────────────────────────────${NC}"
echo -e " ${CYAN}1${NC} ▶ 🔄 更新系统/软件包 ${GRAY}# 推荐${NC}"
echo -e " ${CYAN}2${NC} ▶ 🚀 开启BBR ${GRAY}# 推荐${NC}"
echo -e " ${CYAN}3${NC} ▶ 🌐 TCP网络调优 ${GRAY}# 推荐${NC}"
echo -e " ${CYAN}4${NC} ▶ 🛜 一键网络优化 ${GRAY}# 一键运行1、2、3项${NC}"
echo -e " ${DARK_GRAY}───────────────────────────────────────────────────────────────${NC}"
echo -e " ${CYAN}5${NC} ▶ 🌍 DNS服务器配置 ${GRAY}# 修改服务器DNS${NC}"
echo -e " ${CYAN}6${NC} ▶ 🚫 禁用IPv6 ${GRAY}# 避免双栈网络问题${NC}"
echo -e " ${CYAN}7${NC} ▶ 🔐 SSH安全配置 ${GRAY}# SSH端口和密码修改${NC}"
echo -e " ${DARK_GRAY}───────────────────────────────────────────────────────────────${NC}"
echo -e " ${CYAN}8${NC} ▶ 💿 一键dd纯净系统(萌咖) ${GRAY}# 重装服务器系统${NC}"
echo -e " ${CYAN}9${NC} ▶ 📦 宝塔面板开心版 ${GRAY}# 安装/升级宝塔开心版(bt.sb)${NC}"
echo -e " ${DARK_GRAY}───────────────────────────────────────────────────────────────${NC}"
echo -e " ${CYAN}0${NC} ▶ 🚪 退出脚本"
echo
read -p "$(echo -e "${YELLOW}请输入选择 (0-9): ${NC}")" choice
case $choice in
1)
echo
echo -e "${CYAN}▶▶▶ 正在执行 [更新系统及软件包]${NC}"
run_optimization "update"
show_header="true"
;;
2)
echo
echo -e "${CYAN}▶▶▶ 正在执行 [一键开启BBR]${NC}"
run_optimization "bbr"
show_header="true"
;;
3)
echo
echo -e "${CYAN}▶▶▶ 正在执行 [TCP网络调优]${NC}"
run_optimization "tcp"
show_header="true"
;;
4)
echo
echo -e "${CYAN}▶▶▶ 正在执行 [基础优化套餐]${NC}"
run_optimization "basic"
show_header="true"
;;
5)
echo
echo -e "${CYAN}▶▶▶ 正在执行 [DNS服务器配置]${NC}"
run_optimization "dns"
;;
6)
echo
echo -e "${CYAN}▶▶▶ 正在执行 [禁用IPv6]${NC}"
run_optimization "ipv6"
show_header="true"
;;
7)
echo
echo -e "${CYAN}▶▶▶ 正在执行 [SSH安全配置]${NC}"
run_optimization "ssh"
show_header="true"
;;
8)
echo
echo -e "${CYAN}▶▶▶ 正在执行 [一键dd纯净系统(萌咖)]${NC}"
run_optimization "reinstall"
# 重装系统脚本执行后会重启系统,不需要返回主菜单
echo
echo -e "${GREEN}👋 系统重装脚本已执行,即将重启系统...${NC}"
echo
exit 0
;;
9)
echo
echo -e "${CYAN}▶▶▶ 正在执行 [宝塔面板开心版]${NC}"
run_optimization "bt"
show_header="true"
;;
0)
echo
echo -e "${GREEN}👋 感谢使用本脚本合集,再见!${NC}"
echo
exit 0
;;
*)
echo
warn "无效选择,请输入 0-9 之间的数字"
echo
sleep 2
continue
;;
esac
# 对于大多数脚本,显示"按任意键返回主菜单"
# 但排除特殊脚本(DNS配置、重装系统、宝塔面板、退出)
if [[ "$choice" != "5" ]] && [[ "$choice" != "8" ]] && [[ "$choice" != "9" ]] && [[ "$choice" != "0" ]]; then
echo
echo -e "${CYAN}按任意键返回主菜单...${NC}"
read -n 1 -s
echo
fi
# 确保后续循环都显示标题框
show_header="true"
done
}
# 主程序
main() {
# 显示欢迎界面
show_welcome
# 显示系统信息
show_system_info
check_root
check_system
initialize_system
# 如果不是通过参数 --install-only 调用,则显示交互菜单
if [[ "${1:-}" != "--install-only" ]]; then
interactive_menu "false" # 首次不显示标题框,因为上面已经显示了
fi
}
# 执行主程序
main "$@"