chore: 移除过时的 VPS 管理功能

- 移除 WARP、Python 安装、留言板、重启和集群管理菜单
- 删除相关辅助函数和远程执行逻辑
- 将脚本版本提升至 3.0.0,以体现破坏性变更
- 重写功能文档并清理过时说明
This commit is contained in:
eddy
2026-08-01 23:10:27 +08:00
parent 6a17347613
commit e31ab788ed
3 changed files with 334 additions and 608 deletions
+1 -528
View File
@@ -1,6 +1,6 @@
#!/bin/bash
sh_v="2.7.0"
sh_v="3.0.0"
huang='\033[33m'
bai='\033[0m'
@@ -439,16 +439,6 @@ ensure_swap() {
add_swap
}
cluster_python3() {
if [ ! -d ~/cluster ]; then
err_msg "集群环境尚未安装,请先执行“1. 安装集群环境”。"
return 1
fi
download_file "${GITHUB_RAW_URL}/kejilion/python-for-vps/main/cluster/${py_task}" ~/cluster/"$py_task" || return 1
python3 ~/cluster/"$py_task"
}
f2b_status() {
docker restart fail2ban
sleep 3
@@ -879,10 +869,8 @@ echo "1. 系统信息查询"
echo "2. 系统更新"
echo "3. 系统清理"
echo "5. BBR管理 ▶"
echo "7. WARP管理 ▶ "
echo "8. 测试脚本合集 ▶ "
echo "13. 系统工具 ▶ "
echo "14. VPS集群控制 ▶ "
echo "------------------------"
echo "00. 脚本更新"
echo "------------------------"
@@ -1026,20 +1014,6 @@ case $choice in
rm -rf "$tcpx_dir"
;;
7)
clear
warp_dir=$(mktemp -d) || {
err_msg "无法创建临时目录。"
echo "按任意键继续..."
read -n 1 -s -r -p ""
continue
}
if download_file "https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh" "${warp_dir}/menu.sh"; then
bash "${warp_dir}/menu.sh"
fi
rm -rf "$warp_dir"
;;
8)
while true; do
clear
@@ -1190,7 +1164,6 @@ case $choice in
echo "▶ 系统工具"
echo "------------------------"
echo "1. 设置脚本启动快捷键 2. 修改登录密码"
echo "4. 安装Python指定版本"
echo "7. 优化DNS地址 10. 切换优先ipv4/ipv6"
echo "------------------------"
echo "11. 查看端口占用状态 12. 修改虚拟内存大小"
@@ -1202,10 +1175,6 @@ case $choice in
echo "21. 本机host解析 22. fail2banSSH防御程序"
echo "23. 限流自动关机"
echo "------------------------"
echo "31. 留言板"
echo "------------------------"
echo "99. 重启服务器"
echo "------------------------"
echo "0. 返回主菜单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
@@ -1228,93 +1197,6 @@ case $choice in
echo "设置你的登录密码"
passwd
;;
4)
root_use
VERSION=$(python3 -V 2>&1 | awk '{print $2}')
echo -e "当前python版本号: ${huang}$VERSION${bai}"
echo "------------"
echo "推荐版本: 3.12 3.11 3.10 3.9 3.8 2.7"
echo "查询更多版本: https://www.python.org/downloads/"
echo "------------"
read -p "输入你要安装的python版本号: " py_new_v
if ! [[ "$py_new_v" =~ ^[0-9]+\.[0-9]+(\.[0-9]+)?$ ]]; then
err_msg "版本号格式不正确,示例: 3.12 或 3.12.4"
break
fi
pyenv_installer=""
if [ ! -x "$HOME/.pyenv/bin/pyenv" ]; then
if ! install git build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
libsqlite3-dev wget curl llvm libncurses-dev xz-utils tk-dev \
libffi-dev liblzma-dev libgdbm-dev libnss3-dev libedit-dev; then
err_msg "Python 编译依赖安装失败。"
break
fi
pyenv_installer=$(mktemp) || {
err_msg "无法创建 pyenv 安装临时文件。"
break
}
if ! download_file https://pyenv.run "$pyenv_installer" || ! bash "$pyenv_installer"; then
rm -f "$pyenv_installer"
err_msg "pyenv 安装失败。"
break
fi
rm -f "$pyenv_installer"
fi
touch "$HOME/.bashrc" || {
err_msg "无法更新 $HOME/.bashrc。"
break
}
if ! grep -Fqx 'export PYENV_ROOT="$HOME/.pyenv"' "$HOME/.bashrc"; then
cat << EOF >> ~/.bashrc
export PYENV_ROOT="\$HOME/.pyenv"
if [[ -d "\$PYENV_ROOT/bin" ]]; then
export PATH="\$PYENV_ROOT/bin:\$PATH"
fi
eval "\$(pyenv init --path)"
eval "\$(pyenv init -)"
if pyenv commands 2>/dev/null | grep -qx virtualenv-init; then
eval "\$(pyenv virtualenv-init -)"
fi
EOF
fi
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if ! command -v pyenv &>/dev/null; then
err_msg "pyenv 未安装成功。"
break
fi
eval "$(pyenv init -)"
version_pattern=${py_new_v//./\\.}
if [[ "$py_new_v" =~ ^[0-9]+\.[0-9]+$ ]]; then
version_pattern="^${version_pattern}\\.[0-9]+$"
else
version_pattern="^${version_pattern}$"
fi
py_target=$(pyenv install --list 2>/dev/null | sed 's/^[[:space:]]*//' |
grep -E "$version_pattern" | sort -V | tail -n 1)
if [ -z "$py_target" ]; then
err_msg "未找到可安装的稳定版本: $py_new_v"
break
fi
if pyenv install -s "$py_target" && pyenv global "$py_target"; then
hash -r
VERSION=$("$PYENV_ROOT/shims/python" -V 2>&1 | awk '{print $2}')
echo -e "当前python版本号: ${huang}$VERSION${bai}"
else
err_msg "Python $py_target 安装或启用失败。"
fi
;;
7)
root_use
echo "当前DNS地址"
@@ -2399,48 +2281,6 @@ EOF
;;
31)
clear
install sshpass
remote_ip="66.42.61.110"
remote_user="liaotian123"
remote_file="/home/liaotian123/liaotian.txt"
password="kejilionYYDS" # 替换为您的密码
clear
echo "科技lion留言板"
echo "------------------------"
# 显示已有的留言内容
sshpass -p "${password}" ssh -o StrictHostKeyChecking=no "${remote_user}@${remote_ip}" "cat '${remote_file}'"
echo ""
echo "------------------------"
# 判断是否要留言
read -p "是否要留言?(y/n): " leave_message
if [ "$leave_message" == "y" ] || [ "$leave_message" == "Y" ]; then
# 输入新的留言内容
read -p "输入你的昵称: " nicheng
read -p "输入你的聊天内容: " neirong
# 添加新留言到远程文件
sshpass -p "${password}" ssh -o StrictHostKeyChecking=no "${remote_user}@${remote_ip}" "echo -e '${nicheng}: ${neirong}' >> '${remote_file}'"
echo "已添加留言: "
echo "${nicheng}: ${neirong}"
echo ""
else
echo "您选择了不留言。"
fi
echo "留言板操作完成。"
;;
99)
clear
server_reboot
;;
0)
kejilion
@@ -2454,373 +2294,6 @@ EOF
done
;;
14)
clear
while true; do
clear
echo "▶ VPS集群控制"
echo "你可以远程操控多台VPS一起执行任务(仅支持Ubuntu/Debian"
echo "------------------------"
echo "1. 安装集群环境"
echo "------------------------"
echo "2. 集群控制中心"
echo "------------------------"
echo "7. 备份集群环境"
echo "8. 还原集群环境"
echo "9. 卸载集群环境"
echo "------------------------"
echo "0. 返回主菜单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
install python3 python3-paramiko speedtest-cli lrzsz || break
mkdir -p ~/cluster || break
if [ -f ~/cluster/servers.py ]; then
echo "集群环境已存在,未覆盖现有服务器列表 ~/cluster/servers.py"
else
cat > ~/cluster/servers.py << EOF
servers = [
]
EOF
if chmod 600 ~/cluster/servers.py; then
echo "集群环境已初始化: ~/cluster/servers.py"
else
err_msg "集群环境已创建,但无法收紧服务器列表文件权限。"
fi
fi
;;
2)
while true; do
clear
if [ ! -f ~/cluster/servers.py ]; then
err_msg "集群环境尚未安装,请先执行“1. 安装集群环境”。"
break
fi
if ! chmod 600 ~/cluster/servers.py; then
err_msg "无法收紧服务器列表文件权限。"
break
fi
echo "集群服务器列表"
if ! python3 - "$HOME/cluster/servers.py" <<'PY'
import ast
import sys
from pathlib import Path
path = Path(sys.argv[1])
tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path))
assignment = next(
(
node
for node in tree.body
if isinstance(node, ast.Assign)
and any(isinstance(target, ast.Name) and target.id == "servers" for target in node.targets)
),
None,
)
if assignment is None:
raise SystemExit("servers.py 格式异常,未找到 servers 列表")
servers = ast.literal_eval(assignment.value)
if not isinstance(servers, list) or not all(isinstance(item, dict) for item in servers):
raise SystemExit("servers.py 中的 servers 必须是字典列表")
if not servers:
print("(空)")
for index, item in enumerate(servers, 1):
print(
f"{index}. {item.get('name', '')} "
f"{item.get('hostname', '')}:{item.get('port', '')} "
f"用户: {item.get('username', '')}"
)
PY
then
err_msg "服务器列表格式异常,请先修复或还原 servers.py。"
break
fi
echo ""
echo "操作"
echo "------------------------"
echo "1. 添加服务器 2. 删除服务器 3. 编辑服务器"
echo "------------------------"
echo "11. 安装科技lion脚本 12. 更新系统 13. 清理系统"
echo "15. 安装BBR3 16. 设置1G虚拟内存"
echo "17. 设置时区到上海 18. 开放所有端口"
echo "------------------------"
echo "51. 自定义指令"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
read -p "服务器名称: " server_name
read -p "服务器IP: " server_ip
read -p "服务器端口(22: " server_port
server_port=${server_port:-22}
read -p "服务器用户名(root: " server_username
server_username=${server_username:-root}
read -s -p "服务器用户密码: " server_password
echo ""
if [ -z "$server_name" ] || [ -z "$server_ip" ]; then
err_msg "服务器名称和 IP 不能为空。"
elif ! [[ "$server_port" =~ ^[0-9]+$ ]] || [ "$server_port" -lt 1 ] || [ "$server_port" -gt 65535 ]; then
err_msg "服务器端口必须是 1 到 65535 之间的整数。"
elif ! python3 - "$HOME/cluster/servers.py" "$server_name" "$server_ip" "$server_port" "$server_username" 3<<< "$server_password" <<'PY'
import ast
import os
import pprint
import sys
import tempfile
from pathlib import Path
path = Path(sys.argv[1])
entry = {
"name": sys.argv[2],
"hostname": sys.argv[3],
"port": int(sys.argv[4]),
"username": sys.argv[5],
"password": os.fdopen(3).read().rstrip("\n"),
"remote_path": "/home/",
}
content = path.read_text(encoding="utf-8")
tree = ast.parse(content, filename=str(path))
assignment = next(
(
node
for node in tree.body
if isinstance(node, ast.Assign)
and any(isinstance(target, ast.Name) and target.id == "servers" for target in node.targets)
),
None,
)
if assignment is None:
raise SystemExit("servers.py 格式异常,未找到 servers 列表")
servers = ast.literal_eval(assignment.value)
if not isinstance(servers, list) or not all(isinstance(item, dict) for item in servers):
raise SystemExit("servers.py 中的 servers 必须是字典列表")
servers.append(entry)
updated = "servers = " + pprint.pformat(servers, width=120) + "\n"
fd, temp_name = tempfile.mkstemp(prefix=f".{path.name}.", dir=path.parent)
try:
with os.fdopen(fd, "w", encoding="utf-8") as handle:
handle.write(updated)
handle.flush()
os.fsync(handle.fileno())
os.chmod(temp_name, 0o600)
os.replace(temp_name, path)
finally:
if os.path.exists(temp_name):
os.unlink(temp_name)
PY
then
err_msg "写入服务器配置失败。"
fi
;;
2)
read -p "请输入需要删除的关键字: " rmserver
# 通过解析 Python 字面量删除条目,避免按行删除破坏列表结构
if [ -z "$rmserver" ]; then
err_msg "关键字不能为空,已取消删除。"
elif ! python3 - "$HOME/cluster/servers.py" "$rmserver" <<'PY'
import ast
import os
import pprint
import sys
import tempfile
from pathlib import Path
path = Path(sys.argv[1])
keyword = sys.argv[2]
content = path.read_text(encoding="utf-8")
tree = ast.parse(content, filename=str(path))
assignment = next(
(
node
for node in tree.body
if isinstance(node, ast.Assign)
and any(isinstance(target, ast.Name) and target.id == "servers" for target in node.targets)
),
None,
)
if assignment is None:
raise SystemExit("servers.py 格式异常,未找到 servers 列表")
servers = ast.literal_eval(assignment.value)
if not isinstance(servers, list) or not all(isinstance(item, dict) for item in servers):
raise SystemExit("servers.py 中的 servers 必须是字典列表")
remaining = [item for item in servers if keyword not in " ".join(str(value) for value in item.values())]
removed = len(servers) - len(remaining)
if removed == 0:
print("未找到匹配的服务器条目。")
raise SystemExit(0)
updated = "servers = " + pprint.pformat(remaining, width=120) + "\n"
fd, temp_name = tempfile.mkstemp(prefix=f".{path.name}.", dir=path.parent)
try:
with os.fdopen(fd, "w", encoding="utf-8") as handle:
handle.write(updated)
handle.flush()
os.fsync(handle.fileno())
os.chmod(temp_name, 0o600)
os.replace(temp_name, path)
finally:
if os.path.exists(temp_name):
os.unlink(temp_name)
print(f"已删除 {removed} 条服务器记录。")
PY
then
err_msg "删除服务器配置失败,原文件保持不变。"
fi
;;
3)
install nano
nano ~/cluster/servers.py
;;
11)
py_task=install_kejilion.py
cluster_python3
;;
12)
py_task=update.py
cluster_python3
;;
13)
py_task=clean.py
cluster_python3
;;
15)
py_task=install_bbr3.py
cluster_python3
;;
16)
py_task=swap1024.py
cluster_python3
;;
17)
py_task=time_shanghai.py
cluster_python3
;;
18)
py_task=firewall_close.py
cluster_python3
;;
51)
read -p "请输入批量执行的命令: " mingling
if [ -z "$mingling" ]; then
err_msg "命令不能为空。"
break
fi
py_task=custom_tasks.py
mkdir -p ~/cluster || break
custom_task_tmp=$(mktemp "$HOME/cluster/.custom_tasks.py.XXXXXX") || {
err_msg "无法创建自定义任务临时文件。"
break
}
if download_file "${GITHUB_RAW_URL}/kejilion/python-for-vps/main/cluster/${py_task}" "$custom_task_tmp"; then
if CUSTOM_TASK="$mingling" python3 - "$custom_task_tmp" <<'PY'
import os
import re
import sys
from pathlib import Path
path = Path(sys.argv[1])
content = path.read_text(encoding="utf-8")
# 上游可能用单引号也可能用双引号包裹占位符,两种都要认
pattern = re.compile(r"""(['"])Customtasks\1""")
if not pattern.search(content):
raise SystemExit("自定义任务脚本格式异常:未找到 Customtasks 占位符")
# 用 lambda 返回替换串,避免命令里的反斜杠被 re.sub 当作转义序列二次解释
path.write_text(
pattern.sub(lambda _: repr(os.environ["CUSTOM_TASK"]), content, count=1),
encoding="utf-8",
)
PY
then
if mv -f "$custom_task_tmp" ~/cluster/"$py_task"; then
python3 ~/cluster/"$py_task"
else
rm -f "$custom_task_tmp"
err_msg "自定义任务脚本安装失败。"
fi
else
rm -f "$custom_task_tmp"
err_msg "自定义任务脚本生成失败。"
fi
else
rm -f "$custom_task_tmp"
fi
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
7)
clear
if [ ! -f ~/cluster/servers.py ]; then
err_msg "集群环境尚未安装,请先执行“1. 安装集群环境”。"
else
echo "将下载服务器列表数据,按任意键下载!"
read -n 1 -s -r -p ""
sz -y ~/cluster/servers.py
fi
;;
8)
clear
echo "请上传您的servers.py,按任意键开始上传!"
read -n 1 -s -r -p ""
mkdir -p ~/cluster && (cd ~/cluster/ && rz -y)
;;
9)
clear
read -p "请先备份环境,确定要卸载集群控制环境吗?(Y/N): " choice
case "$choice" in
[Yy])
remove python3-paramiko speedtest-cli lrzsz
rm -rf ~/cluster/
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
0)
kejilion
;;
*)
echo "无效的输入!"
;;
esac
break_end
done
;;
00)
clear
echo "更新日志"