Files
kejilion/kejilion.sh
T
eddy e2bbe1a478 refactor: 精简 VPS 管理功能
- 移除 Docker 管理、监控通知、后台工作区、防火墙及旧版 SSH 工具
- 删除废弃脚本、配置、本地化文件及 PandoraNext 文件
- 增加可配置的 GitHub Raw 地址,并根据服务器地区自动选择镜像
- 更新功能文档,使其与精简后的工具集保持一致
2026-08-01 17:10:28 +08:00

2356 lines
76 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
sh_v="2.6.7"
huang='\033[33m'
bai='\033[0m'
lv='\033[0;32m'
lan='\033[0;34m'
hong='\033[31m'
kjlan='\033[96m'
hui='\e[37m'
if [ -z "${GITHUB_RAW_URL:-}" ]; then
country=$(curl -fsS --max-time 3 https://ipinfo.io/country 2>/dev/null)
case "$country" in
CN)
GITHUB_RAW_URL="https://raw.gitmirror.com"
;;
"")
GITHUB_RAW_URL="https://raw.githubusercontent.com"
echo "无法检测服务器地区,使用默认 GitHub Raw 地址。" >&2
;;
*)
GITHUB_RAW_URL="https://raw.githubusercontent.com"
;;
esac
fi
GITHUB_RAW_URL="${GITHUB_RAW_URL%/}"
cp ./kejilion.sh /usr/local/bin/k > /dev/null 2>&1
ip_address() {
ipv4_address=$(curl -s ipv4.ip.sb)
ipv6_address=$(curl -s --max-time 1 ipv6.ip.sb)
}
install() {
if [ $# -eq 0 ]; then
echo "未提供软件包参数!"
return 1
fi
for package in "$@"; do
if ! command -v "$package" &>/dev/null; then
echo "正在安装 $package..."
if command -v dnf &>/dev/null; then
dnf -y update && dnf install -y "$package"
elif command -v yum &>/dev/null; then
yum -y update && yum -y install "$package"
elif command -v apt &>/dev/null; then
apt update -y && apt install -y "$package"
elif command -v apk &>/dev/null; then
apk update && apk add "$package"
else
echo "未知的包管理器!"
return 1
fi
else
echo "$package 已经安装。"
fi
done
return 0
}
install_dependency() {
clear
install wget socat unzip tar
}
remove() {
if [ $# -eq 0 ]; then
echo "未提供软件包参数!"
return 1
fi
for package in "$@"; do
echo "正在卸载 $package..."
if command -v dnf &>/dev/null; then
dnf remove -y "${package}*"
elif command -v yum &>/dev/null; then
yum remove -y "${package}*"
elif command -v apt &>/dev/null; then
apt purge -y "${package}*"
elif command -v apk &>/dev/null; then
apk del "${package}*"
else
echo "未知的包管理器!"
return 1
fi
done
return 0
}
break_end() {
echo -e "${lv}操作完成${bai}"
echo "按任意键继续..."
read -n 1 -s -r -p ""
echo ""
clear
}
kejilion() {
k
exit
}
install_add_docker() {
if [ -f "/etc/alpine-release" ]; then
apk update
apk add docker docker-compose
rc-update add docker default
service docker start
else
country=$(curl -s ipinfo.io/country)
if [ "$country" = "CN" ]; then
cd ~
curl -sS -O "${GITHUB_RAW_URL}/kejilion/docker/main/install" && chmod +x install
sh install --mirror Aliyun
rm -f install
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://docker.kejilion.pro"]
}
EOF
else
curl -fsSL https://get.docker.com | sh
fi
systemctl start docker
systemctl enable docker
fi
sleep 2
}
install_docker() {
if ! command -v docker &>/dev/null; then
install_add_docker
else
echo "Docker环境已经安装"
fi
}
add_swap() {
# 获取当前系统中所有的 swap 分区
swap_partitions=$(grep -E '^/dev/' /proc/swaps | awk '{print $1}')
# 遍历并删除所有的 swap 分区
for partition in $swap_partitions; do
swapoff "$partition"
wipefs -a "$partition" # 清除文件系统标识符
mkswap -f "$partition"
done
# 确保 /swapfile 不再被使用
swapoff /swapfile
# 删除旧的 /swapfile
rm -f /swapfile
# 创建新的 swap 分区
dd if=/dev/zero of=/swapfile bs=1M count=$new_swap
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
if [ -f /etc/alpine-release ]; then
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
echo "nohup swapon /swapfile" >> /etc/local.d/swap.start
chmod +x /etc/local.d/swap.start
rc-update add local
else
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
fi
echo -e "虚拟内存大小已调整为${huang}${new_swap}${bai}MB"
}
cluster_python3() {
cd ~/cluster/
curl -sS -O "${GITHUB_RAW_URL}/kejilion/python-for-vps/main/cluster/${py_task}"
python3 ~/cluster/$py_task
}
f2b_status() {
docker restart fail2ban
sleep 3
docker exec -it fail2ban fail2ban-client status
}
f2b_status_xxx() {
docker exec -it fail2ban fail2ban-client status $xxx
}
f2b_install_sshd() {
docker run -d \
--name=fail2ban \
--net=host \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e VERBOSITY=-vv \
-v /path/to/fail2ban/config:/config \
-v /var/log:/var/log:ro \
--restart unless-stopped \
lscr.io/linuxserver/fail2ban:latest
sleep 3
if grep -q 'Alpine' /etc/issue; then
cd /path/to/fail2ban/config/fail2ban/filter.d
curl -sS -O "${GITHUB_RAW_URL}/kejilion/config/main/fail2ban/alpine-sshd.conf"
curl -sS -O "${GITHUB_RAW_URL}/kejilion/config/main/fail2ban/alpine-sshd-ddos.conf"
cd /path/to/fail2ban/config/fail2ban/jail.d/
curl -sS -O "${GITHUB_RAW_URL}/kejilion/config/main/fail2ban/alpine-ssh.conf"
elif grep -qi 'CentOS' /etc/redhat-release; then
cd /path/to/fail2ban/config/fail2ban/jail.d/
curl -sS -O "${GITHUB_RAW_URL}/kejilion/config/main/fail2ban/centos-ssh.conf"
else
install rsyslog
systemctl start rsyslog
systemctl enable rsyslog
cd /path/to/fail2ban/config/fail2ban/jail.d/
curl -sS -O "${GITHUB_RAW_URL}/kejilion/config/main/fail2ban/linux-ssh.conf"
fi
}
f2b_sshd() {
if grep -q 'Alpine' /etc/issue; then
xxx=alpine-sshd
f2b_status_xxx
elif grep -qi 'CentOS' /etc/redhat-release; then
xxx=centos-sshd
f2b_status_xxx
else
xxx=linux-sshd
f2b_status_xxx
fi
}
server_reboot() {
read -p "$(echo -e "${huang}现在重启服务器吗?(Y/N): ${bai}")" rboot
case "$rboot" in
[Yy])
echo "已重启"
reboot
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
}
output_status() {
output=$(awk 'BEGIN { rx_total = 0; tx_total = 0 }
NR > 2 { rx_total += $2; tx_total += $10 }
END {
rx_units = "Bytes";
tx_units = "Bytes";
if (rx_total > 1024) { rx_total /= 1024; rx_units = "KB"; }
if (rx_total > 1024) { rx_total /= 1024; rx_units = "MB"; }
if (rx_total > 1024) { rx_total /= 1024; rx_units = "GB"; }
if (tx_total > 1024) { tx_total /= 1024; tx_units = "KB"; }
if (tx_total > 1024) { tx_total /= 1024; tx_units = "MB"; }
if (tx_total > 1024) { tx_total /= 1024; tx_units = "GB"; }
printf("总接收: %.2f %s\n总发送: %.2f %s\n", rx_total, rx_units, tx_total, tx_units);
}' /proc/net/dev)
}
current_timezone() {
if grep -q 'Alpine' /etc/issue; then
date +"%Z %z"
else
timedatectl | grep "Time zone" | awk '{print $3}'
fi
}
set_timedate() {
shiqu="$1"
if grep -q 'Alpine' /etc/issue; then
install tzdata
cp /usr/share/zoneinfo/${shiqu} /etc/localtime
hwclock --systohc
else
timedatectl set-timezone ${shiqu}
fi
}
linux_update() {
if command -v dnf &>/dev/null; then
dnf -y update
elif command -v yum &>/dev/null; then
yum -y update
elif command -v apt &>/dev/null; then
DEBIAN_FRONTEND=noninteractive apt update -y
DEBIAN_FRONTEND=noninteractive apt full-upgrade -y
elif command -v apk &>/dev/null; then
apk update && apk upgrade
else
echo "未知的包管理器!"
return 1
fi
}
linux_clean() {
if command -v dnf &>/dev/null; then
dnf autoremove -y
dnf clean all
journalctl --rotate
journalctl --vacuum-time=1s
journalctl --vacuum-size=50M
dnf remove $(dnf repoquery --installonly --latest-limit=-1 -q) -y
elif command -v yum &>/dev/null; then
yum autoremove -y
yum clean all
journalctl --rotate
journalctl --vacuum-time=1s
journalctl --vacuum-size=50M
yum remove $(rpm -q kernel | grep -v $(uname -r)) -y
elif command -v apt &>/dev/null; then
apt autoremove --purge -y
apt clean -y
apt autoclean -y
apt remove --purge $(dpkg -l | awk '/^rc/ {print $2}') -y
journalctl --rotate
journalctl --vacuum-time=1s
journalctl --vacuum-size=50M
apt remove --purge $(dpkg -l | awk '/^ii linux-(image|headers)-[^ ]+/{print $2}' | grep -v $(uname -r | sed 's/-.*//') | xargs) -y
elif command -v apk &>/dev/null; then
apk del --purge $(apk info --installed | awk '{print $1}' | grep -v $(apk info --available | awk '{print $1}'))
apk autoremove
apk cache clean
rm -rf /var/log/*
rm -rf /var/cache/apk/*
else
echo "未知的包管理器!"
return 1
fi
}
bbr_on() {
cat > /etc/sysctl.conf << EOF
net.core.default_qdisc=fq_pie
net.ipv4.tcp_congestion_control=bbr
EOF
sysctl -p
}
set_dns() {
# 检查机器是否有IPv6地址
ipv6_available=0
if [[ $(ip -6 addr | grep -c "inet6") -gt 0 ]]; then
ipv6_available=1
fi
echo "nameserver $dns1_ipv4" > /etc/resolv.conf
echo "nameserver $dns2_ipv4" >> /etc/resolv.conf
if [[ $ipv6_available -eq 1 ]]; then
echo "nameserver $dns1_ipv6" >> /etc/resolv.conf
echo "nameserver $dns2_ipv6" >> /etc/resolv.conf
fi
echo "DNS地址已更新"
echo "------------------------"
cat /etc/resolv.conf
echo "------------------------"
}
root_use() {
clear
[ "$EUID" -ne 0 ] && echo -e "${huang}请注意,该功能需要root用户才能运行!${bai}" && break_end && kejilion
}
dd_xitong() {
dd_xitong_1() {
echo -e "重装后初始用户名: ${huang}root${bai} 初始密码: ${huang}LeitboGi0ro${bai} 初始端口: ${huang}22${bai}"
echo -e "按任意键继续..."
read -n 1 -s -r -p ""
install wget
wget --no-check-certificate -qO InstallNET.sh "${GITHUB_RAW_URL}/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh" && chmod a+x InstallNET.sh
}
dd_xitong_2() {
echo -e "重装后初始用户名: ${huang}Administrator${bai} 初始密码: ${huang}Teddysun.com${bai} 初始端口: ${huang}3389${bai}"
echo -e "按任意键继续..."
read -n 1 -s -r -p ""
install wget
wget --no-check-certificate -qO InstallNET.sh "${GITHUB_RAW_URL}/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh" && chmod a+x InstallNET.sh
}
dd_xitong_3() {
echo -e "重装后初始用户名: ${huang}root${bai} 初始密码: ${huang}123@@@${bai} 初始端口: ${huang}22${bai}"
echo -e "按任意键继续..."
read -n 1 -s -r -p ""
curl -O "${GITHUB_RAW_URL}/bin456789/reinstall/main/reinstall.sh"
}
dd_xitong_4() {
echo -e "重装后初始用户名: ${huang}Administrator${bai} 初始密码: ${huang}123@@@${bai} 初始端口: ${huang}3389${bai}"
echo -e "按任意键继续..."
read -n 1 -s -r -p ""
curl -O "${GITHUB_RAW_URL}/bin456789/reinstall/main/reinstall.sh"
}
while true; do
root_use
echo "请备份数据,将为你重装系统,预计花费15分钟。"
echo -e "${hui}感谢MollyLau大佬和bin456789大佬的脚本支持!${bai} "
echo "------------------------"
echo "1. Debian 12"
echo "2. Debian 11"
echo "3. Debian 10"
echo "4. Debian 9"
echo "------------------------"
echo "11. Ubuntu 24.04"
echo "12. Ubuntu 22.04"
echo "13. Ubuntu 20.04"
echo "14. Ubuntu 18.04"
echo "------------------------"
echo "21. CentOS 9"
echo "22. CentOS 8"
echo "23. CentOS 7"
echo "------------------------"
echo "31. Alpine Linux"
echo "32. Rocky Linux"
echo "33. Alma Linux"
echo "34. Fedora Linux"
echo "------------------------"
echo "41. Windows 11"
echo "42. Windows 10"
echo "43. Windows 7"
echo "44. Windows Server 2022"
echo "45. Windows Server 2019"
echo "46. Windows Server 2016"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请选择要重装的系统: " sys_choice
case "$sys_choice" in
1)
dd_xitong_1
bash InstallNET.sh -debian 12
reboot
exit
;;
2)
dd_xitong_1
bash InstallNET.sh -debian 11
reboot
exit
;;
3)
dd_xitong_1
bash InstallNET.sh -debian 10
reboot
exit
;;
4)
dd_xitong_1
bash InstallNET.sh -debian 9
reboot
exit
;;
11)
dd_xitong_1
bash InstallNET.sh -ubuntu 24.04
reboot
exit
;;
12)
dd_xitong_1
bash InstallNET.sh -ubuntu 22.04
reboot
exit
;;
13)
dd_xitong_1
bash InstallNET.sh -ubuntu 20.04
reboot
exit
;;
14)
dd_xitong_1
bash InstallNET.sh -ubuntu 18.04
reboot
exit
;;
21)
dd_xitong_1
bash InstallNET.sh -centos 9
reboot
exit
;;
22)
dd_xitong_1
bash InstallNET.sh -centos 8
reboot
exit
;;
23)
dd_xitong_1
bash InstallNET.sh -centos 7
reboot
exit
;;
31)
dd_xitong_1
bash InstallNET.sh -alpine
reboot
exit
;;
32)
dd_xitong_1
bash InstallNET.sh -rockylinux
reboot
exit
;;
33)
dd_xitong_3
bash reinstall.sh alma
reboot
exit
;;
34)
dd_xitong_3
bash reinstall.sh fedora
reboot
exit
;;
41)
dd_xitong_2
bash InstallNET.sh -windows 11 -lang "cn"
reboot
exit
;;
42)
dd_xitong_2
bash InstallNET.sh -windows 10 -lang "cn"
reboot
exit
;;
43)
dd_xitong_4
URL="https://massgrave.dev/windows_7_links"
web_content=$(wget -q -O - "$URL")
iso_link=$(echo "$web_content" | grep -oP '(?<=href=")[^"]*cn[^"]*windows_7[^"]*professional[^"]*x64[^"]*\.iso')
# bash reinstall.sh windows --image-name 'Windows 7 Professional' --lang zh-cn
# bash reinstall.sh windows --iso='$iso_link' --image-name='Windows 7 PROFESSIONAL'
bash reinstall.sh windows --iso="$iso_link" --image-name='Windows 7 PROFESSIONAL'
reboot
exit
;;
44)
dd_xitong_4
URL="https://massgrave.dev/windows_server_links"
web_content=$(wget -q -O - "$URL")
iso_link=$(echo "$web_content" | grep -oP '(?<=href=")[^"]*cn[^"]*windows_server[^"]*2022[^"]*x64[^"]*\.iso')
bash reinstall.sh windows --iso="$iso_link" --image-name='Windows Server 2022 SERVERDATACENTER'
reboot
exit
;;
45)
dd_xitong_2
bash InstallNET.sh -windows 2019 -lang "cn"
reboot
exit
;;
46)
dd_xitong_2
bash InstallNET.sh -windows 2016 -lang "cn"
reboot
exit
;;
0)
break
;;
*)
echo "无效的选择,请重新输入。"
break
;;
esac
done
}
bbrv3() {
root_use
if dpkg -l | grep -q 'linux-xanmod'; then
while true; do
kernel_version=$(uname -r)
echo "您已安装xanmod的BBRv3内核"
echo "当前内核版本: $kernel_version"
echo ""
echo "内核管理"
echo "------------------------"
echo "1. 更新BBRv3内核 2. 卸载BBRv3内核"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
apt purge -y 'linux-*xanmod1*'
update-grub
# wget -qO - https://dl.xanmod.org/archive.key | gpg --dearmor -o /usr/share/keyrings/xanmod-archive-keyring.gpg --yes
wget -qO - "${GITHUB_RAW_URL}/kejilion/sh/main/archive.key" | gpg --dearmor -o /usr/share/keyrings/xanmod-archive-keyring.gpg --yes
# 步骤3:添加存储库
echo 'deb [signed-by=/usr/share/keyrings/xanmod-archive-keyring.gpg] http://deb.xanmod.org releases main' | tee /etc/apt/sources.list.d/xanmod-release.list
# version=$(wget -q https://dl.xanmod.org/check_x86-64_psabi.sh && chmod +x check_x86-64_psabi.sh && ./check_x86-64_psabi.sh | grep -oP 'x86-64-v\K\d+|x86-64-v\d+')
version=$(wget -q "${GITHUB_RAW_URL}/kejilion/sh/main/check_x86-64_psabi.sh" && chmod +x check_x86-64_psabi.sh && ./check_x86-64_psabi.sh | grep -oP 'x86-64-v\K\d+|x86-64-v\d+')
apt update -y
apt install -y linux-xanmod-x64v$version
echo "XanMod内核已更新。重启后生效"
rm -f /etc/apt/sources.list.d/xanmod-release.list
rm -f check_x86-64_psabi.sh*
server_reboot
;;
2)
apt purge -y 'linux-*xanmod1*'
update-grub
echo "XanMod内核已卸载。重启后生效"
server_reboot
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
else
clear
echo "请备份数据,将为你升级Linux内核开启BBR3"
echo "官网介绍: https://xanmod.org/"
echo "------------------------------------------------"
echo "仅支持Debian/Ubuntu 仅支持x86_64架构"
echo "VPS是512M内存的,请提前添加1G虚拟内存,防止因内存不足失联!"
echo "------------------------------------------------"
read -p "确定继续吗?(Y/N): " choice
case "$choice" in
[Yy])
if [ -r /etc/os-release ]; then
. /etc/os-release
if [ "$ID" != "debian" ] && [ "$ID" != "ubuntu" ]; then
echo "当前环境不支持,仅支持Debian和Ubuntu系统"
break
fi
else
echo "无法确定操作系统类型"
break
fi
# 检查系统架构
arch=$(dpkg --print-architecture)
if [ "$arch" != "amd64" ]; then
echo "当前环境不支持,仅支持x86_64架构"
break
fi
new_swap=1024
add_swap
install wget gnupg
# wget -qO - https://dl.xanmod.org/archive.key | gpg --dearmor -o /usr/share/keyrings/xanmod-archive-keyring.gpg --yes
wget -qO - "${GITHUB_RAW_URL}/kejilion/sh/main/archive.key" | gpg --dearmor -o /usr/share/keyrings/xanmod-archive-keyring.gpg --yes
# 步骤3:添加存储库
echo 'deb [signed-by=/usr/share/keyrings/xanmod-archive-keyring.gpg] http://deb.xanmod.org releases main' | tee /etc/apt/sources.list.d/xanmod-release.list
# version=$(wget -q https://dl.xanmod.org/check_x86-64_psabi.sh && chmod +x check_x86-64_psabi.sh && ./check_x86-64_psabi.sh | grep -oP 'x86-64-v\K\d+|x86-64-v\d+')
version=$(wget -q "${GITHUB_RAW_URL}/kejilion/sh/main/check_x86-64_psabi.sh" && chmod +x check_x86-64_psabi.sh && ./check_x86-64_psabi.sh | grep -oP 'x86-64-v\K\d+|x86-64-v\d+')
apt update -y
apt install -y linux-xanmod-x64v$version
# 步骤5:启用BBR3
cat > /etc/sysctl.conf << EOF
net.core.default_qdisc=fq_pie
net.ipv4.tcp_congestion_control=bbr
EOF
sysctl -p
echo "XanMod内核安装并BBR3启用成功。重启后生效"
rm -f /etc/apt/sources.list.d/xanmod-release.list
rm -f check_x86-64_psabi.sh*
server_reboot
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
fi
}
kejilion_sh() {
while true; do
clear
echo -e "${kjlan}_ _ ____ _ _ _ _ ____ _ _ "
echo "|_/ |___ | | | | | | |\ | "
echo "| \_ |___ _| | |___ | |__| | \| "
echo " "
echo -e "${kjlan}科技lion一键脚本工具 v$sh_v (支持Ubuntu/Debian/CentOS/Alpine系统)${bai}"
echo -e "${kjlan}-输入${huang}k${kjlan}可快速启动此脚本-${bai}"
echo "------------------------"
echo "1. 系统信息查询"
echo "2. 系统更新"
echo "3. 系统清理"
echo "5. BBR管理 ▶"
echo "7. WARP管理 ▶ "
echo "8. 测试脚本合集 ▶ "
echo "13. 系统工具 ▶ "
echo "14. VPS集群控制 ▶ "
echo "------------------------"
echo "00. 脚本更新"
echo "------------------------"
echo "0. 退出脚本"
echo "------------------------"
read -p "请输入你的选择: " choice
case $choice in
1)
clear
# 函数: 获取IPv4和IPv6地址
ip_address
if [ "$(uname -m)" == "x86_64" ]; then
cpu_info=$(cat /proc/cpuinfo | grep 'model name' | uniq | sed -e 's/model name[[:space:]]*: //')
else
cpu_info=$(lscpu | grep 'BIOS Model name' | awk -F': ' '{print $2}' | sed 's/^[ \t]*//')
fi
cpu_usage_percent=$(awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else printf "%.0f\n", (($2+$4-u1) * 100 / (t-t1))}' \
<(grep 'cpu ' /proc/stat) <(sleep 1; grep 'cpu ' /proc/stat))
cpu_cores=$(nproc)
mem_info=$(free -b | awk 'NR==2{printf "%.2f/%.2f MB (%.2f%%)", $3/1024/1024, $2/1024/1024, $3*100/$2}')
disk_info=$(df -h | awk '$NF=="/"{printf "%s/%s (%s)", $3, $2, $5}')
country=$(curl -s ipinfo.io/country)
city=$(curl -s ipinfo.io/city)
isp_info=$(curl -s ipinfo.io/org)
cpu_arch=$(uname -m)
hostname=$(hostname)
kernel_version=$(uname -r)
congestion_algorithm=$(sysctl -n net.ipv4.tcp_congestion_control)
queue_algorithm=$(sysctl -n net.core.default_qdisc)
# 尝试使用 lsb_release 获取系统信息
os_info=$(lsb_release -ds 2>/dev/null)
# 如果 lsb_release 命令失败,则尝试其他方法
if [ -z "$os_info" ]; then
# 检查常见的发行文件
if [ -f "/etc/os-release" ]; then
os_info=$(source /etc/os-release && echo "$PRETTY_NAME")
elif [ -f "/etc/debian_version" ]; then
os_info="Debian $(cat /etc/debian_version)"
elif [ -f "/etc/redhat-release" ]; then
os_info=$(cat /etc/redhat-release)
else
os_info="Unknown"
fi
fi
output_status
current_time=$(date "+%Y-%m-%d %I:%M %p")
swap_used=$(free -m | awk 'NR==3{print $3}')
swap_total=$(free -m | awk 'NR==3{print $2}')
if [ "$swap_total" -eq 0 ]; then
swap_percentage=0
else
swap_percentage=$((swap_used * 100 / swap_total))
fi
swap_info="${swap_used}MB/${swap_total}MB (${swap_percentage}%)"
runtime=$(cat /proc/uptime | awk -F. '{run_days=int($1 / 86400);run_hours=int(($1 % 86400) / 3600);run_minutes=int(($1 % 3600) / 60); if (run_days > 0) printf("%d天 ", run_days); if (run_hours > 0) printf("%d时 ", run_hours); printf("%d分\n", run_minutes)}')
timezone=$(current_timezone)
echo ""
echo "系统信息查询"
echo "------------------------"
echo "主机名: $hostname"
echo "运营商: $isp_info"
echo "------------------------"
echo "系统版本: $os_info"
echo "Linux版本: $kernel_version"
echo "------------------------"
echo "CPU架构: $cpu_arch"
echo "CPU型号: $cpu_info"
echo "CPU核心数: $cpu_cores"
echo "------------------------"
echo "CPU占用: $cpu_usage_percent%"
echo "物理内存: $mem_info"
echo "虚拟内存: $swap_info"
echo "硬盘占用: $disk_info"
echo "------------------------"
echo "$output"
echo "------------------------"
echo "网络拥堵算法: $congestion_algorithm $queue_algorithm"
echo "------------------------"
echo "公网IPv4地址: $ipv4_address"
echo "公网IPv6地址: $ipv6_address"
echo "------------------------"
echo "地理位置: $country $city"
echo "系统时区: $timezone"
echo "系统时间: $current_time"
echo "------------------------"
echo "系统运行时长: $runtime"
echo
;;
2)
clear
linux_update
;;
3)
clear
linux_clean
;;
5)
clear
if [ -f "/etc/alpine-release" ]; then
while true; do
clear
congestion_algorithm=$(sysctl -n net.ipv4.tcp_congestion_control)
queue_algorithm=$(sysctl -n net.core.default_qdisc)
echo "当前TCP阻塞算法: $congestion_algorithm $queue_algorithm"
echo ""
echo "BBR管理"
echo "------------------------"
echo "1. 开启BBRv3 2. 关闭BBRv3(会重启)"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
bbr_on
;;
2)
sed -i '/net.core.default_qdisc=fq_pie/d' /etc/sysctl.conf
sed -i '/net.ipv4.tcp_congestion_control=bbr/d' /etc/sysctl.conf
sysctl -p
reboot
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
else
install wget
wget --no-check-certificate -O tcpx.sh "${GITHUB_RAW_URL}/ylx2016/Linux-NetSpeed/master/tcpx.sh"
chmod +x tcpx.sh
./tcpx.sh
fi
;;
7)
clear
install wget
wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh && bash menu.sh [option] [lisence/url/token]
;;
8)
while true; do
clear
echo "▶ 测试脚本合集"
echo ""
echo "----IP及解锁状态检测-----------"
echo "1. ChatGPT解锁状态检测"
echo "2. Region流媒体解锁测试"
echo "3. yeahwu流媒体解锁检测"
echo "4. xykt_IP质量体检脚本"
echo ""
echo "----网络线路测速-----------"
echo "11. besttrace三网回程延迟路由测试"
echo "12. mtr_trace三网回程线路测试"
echo "13. Superspeed三网测速"
echo "14. nxtrace快速回程测试脚本"
echo "15. nxtrace指定IP回程测试脚本"
echo "16. ludashi2020三网线路测试"
echo "17. i-abc多功能测速脚本"
echo ""
echo "----硬件性能测试----------"
echo "21. yabs性能测试"
echo "22. icu/gb5 CPU性能测试脚本"
echo ""
echo "----综合性测试-----------"
echo "31. bench性能测试"
echo "32. spiritysdx融合怪测评"
echo ""
echo "------------------------"
echo "0. 返回主菜单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
bash <(curl -Ls https://cdn.jsdelivr.net/gh/missuo/OpenAI-Checker/openai.sh)
;;
2)
clear
bash <(curl -L -s check.unlock.media)
;;
3)
clear
install wget
wget -qO- https://github.com/yeahwu/check/raw/main/check.sh | bash
;;
4)
clear
bash <(curl -Ls IP.Check.Place)
;;
11)
clear
install wget
wget -qO- git.io/besttrace | bash
;;
12)
clear
curl "${GITHUB_RAW_URL}/zhucaidan/mtr_trace/main/mtr_trace.sh" | bash
;;
13)
clear
bash <(curl -Lso- https://git.io/superspeed_uxh)
;;
14)
clear
curl nxtrace.org/nt |bash
nexttrace --fast-trace --tcp
;;
15)
clear
echo "可参考的IP列表"
echo "------------------------"
echo "北京电信: 219.141.136.12"
echo "北京联通: 202.106.50.1"
echo "北京移动: 221.179.155.161"
echo "上海电信: 202.96.209.133"
echo "上海联通: 210.22.97.1"
echo "上海移动: 211.136.112.200"
echo "广州电信: 58.60.188.222"
echo "广州联通: 210.21.196.6"
echo "广州移动: 120.196.165.24"
echo "成都电信: 61.139.2.69"
echo "成都联通: 119.6.6.6"
echo "成都移动: 211.137.96.205"
echo "湖南电信: 36.111.200.100"
echo "湖南联通: 42.48.16.100"
echo "湖南移动: 39.134.254.6"
echo "------------------------"
read -p "输入一个指定IP: " testip
curl nxtrace.org/nt |bash
nexttrace $testip
;;
16)
clear
curl "${GITHUB_RAW_URL}/ludashi2020/backtrace/main/install.sh" -sSf | sh
;;
17)
clear
bash <(curl -sL bash.icu/speedtest)
;;
21)
clear
new_swap=1024
add_swap
curl -sL yabs.sh | bash -s -- -i -5
;;
22)
clear
new_swap=1024
add_swap
bash <(curl -sL bash.icu/gb5)
;;
31)
clear
curl -Lso- bench.sh | bash
;;
32)
clear
curl -L https://gitlab.com/spiritysdx/za/-/raw/main/ecs.sh -o ecs.sh && chmod +x ecs.sh && bash ecs.sh
;;
0)
kejilion
;;
*)
echo "无效的输入!"
;;
esac
break_end
done
;;
13)
while true; do
clear
echo "▶ 系统工具"
echo "------------------------"
echo "1. 设置脚本启动快捷键 2. 修改登录密码"
echo "4. 安装Python指定版本"
echo "7. 优化DNS地址 8. 一键重装系统"
echo "10. 切换优先ipv4/ipv6"
echo "------------------------"
echo "11. 查看端口占用状态 12. 修改虚拟内存大小"
echo "13. 用户管理 14. 用户/密码生成器"
echo "15. 系统时区调整 16. 设置BBR3加速"
echo "18. 修改主机名"
echo "19. 切换系统更新源 20. 定时任务管理"
echo "------------------------"
echo "21. 本机host解析 22. fail2banSSH防御程序"
echo "23. 限流自动关机"
echo "------------------------"
echo "31. 留言板"
echo "------------------------"
echo "99. 重启服务器"
echo "------------------------"
echo "0. 返回主菜单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
read -p "请输入你的快捷按键: " kuaijiejian
echo "alias $kuaijiejian='~/kejilion.sh'" >> ~/.bashrc
source ~/.bashrc
echo "快捷键已设置"
;;
2)
clear
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 ! grep -q 'export PYENV_ROOT="\$HOME/.pyenv"' ~/.bashrc; then
if command -v yum &>/dev/null; then
yum update -y && yum install git -y
yum groupinstall "Development Tools" -y
yum install openssl-devel bzip2-devel libffi-devel ncurses-devel zlib-devel readline-devel sqlite-devel xz-devel findutils -y
curl -O https://www.openssl.org/source/openssl-1.1.1u.tar.gz
tar -xzf openssl-1.1.1u.tar.gz
cd openssl-1.1.1u
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
make
make install
echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl-1.1.1u.conf
ldconfig -v
cd ..
export LDFLAGS="-L/usr/local/openssl/lib"
export CPPFLAGS="-I/usr/local/openssl/include"
export PKG_CONFIG_PATH="/usr/local/openssl/lib/pkgconfig"
elif command -v apt &>/dev/null; then
apt update -y && apt install git -y
apt install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev libgdbm-dev libnss3-dev libedit-dev -y
elif command -v apk &>/dev/null; then
apk update && apk add git
apk add --no-cache bash gcc musl-dev libffi-dev openssl-dev bzip2-dev zlib-dev readline-dev sqlite-dev libc6-compat linux-headers make xz-dev build-base ncurses-dev
else
echo "未知的包管理器!"
return 1
fi
curl https://pyenv.run | bash
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 -)"
eval "\$(pyenv virtualenv-init -)"
EOF
fi
sleep 1
source ~/.bashrc
sleep 1
pyenv install $py_new_v
pyenv global $py_new_v
rm -rf /tmp/python-build.*
rm -rf $(pyenv root)/cache/*
VERSION=$(python -V 2>&1 | awk '{print $2}')
echo -e "当前python版本号: ${huang}$VERSION${bai}"
;;
7)
root_use
echo "当前DNS地址"
echo "------------------------"
cat /etc/resolv.conf
echo "------------------------"
echo ""
# 询问用户是否要优化DNS设置
read -p "是否要设置DNS地址?(y/n): " choice
if [ "$choice" == "y" ]; then
read -p "1. 国外DNS优化 2. 国内DNS优化 0. 退出 : " Limiting
case "$Limiting" in
1)
dns1_ipv4="1.1.1.1"
dns2_ipv4="8.8.8.8"
dns1_ipv6="2606:4700:4700::1111"
dns2_ipv6="2001:4860:4860::8888"
set_dns
;;
2)
dns1_ipv4="223.5.5.5"
dns2_ipv4="183.60.83.19"
dns1_ipv6="2400:3200::1"
dns2_ipv6="2400:da00::6666"
set_dns
;;
0)
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
else
echo "DNS设置未更改"
fi
;;
8)
dd_xitong
;;
10)
root_use
ipv6_disabled=$(sysctl -n net.ipv6.conf.all.disable_ipv6)
echo ""
if [ "$ipv6_disabled" -eq 1 ]; then
echo "当前网络优先级设置: IPv4 优先"
else
echo "当前网络优先级设置: IPv6 优先"
fi
echo "------------------------"
echo ""
echo "切换的网络优先级"
echo "------------------------"
echo "1. IPv4 优先 2. IPv6 优先"
echo "------------------------"
read -p "选择优先的网络: " choice
case $choice in
1)
sysctl -w net.ipv6.conf.all.disable_ipv6=1 > /dev/null 2>&1
echo "已切换为 IPv4 优先"
;;
2)
sysctl -w net.ipv6.conf.all.disable_ipv6=0 > /dev/null 2>&1
echo "已切换为 IPv6 优先"
;;
*)
echo "无效的选择"
;;
esac
;;
11)
clear
ss -tulnape
;;
12)
root_use
# 获取当前交换空间信息
swap_used=$(free -m | awk 'NR==3{print $3}')
swap_total=$(free -m | awk 'NR==3{print $2}')
if [ "$swap_total" -eq 0 ]; then
swap_percentage=0
else
swap_percentage=$((swap_used * 100 / swap_total))
fi
swap_info="${swap_used}MB/${swap_total}MB (${swap_percentage}%)"
echo "当前虚拟内存: $swap_info"
read -p "是否调整大小?(Y/N): " choice
case "$choice" in
[Yy])
# 输入新的虚拟内存大小
read -p "请输入虚拟内存大小MB: " new_swap
add_swap
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
13)
while true; do
root_use
# 显示所有用户、用户权限、用户组和是否在sudoers中
echo "用户列表"
echo "----------------------------------------------------------------------------"
printf "%-24s %-34s %-20s %-10s\n" "用户名" "用户权限" "用户组" "sudo权限"
while IFS=: read -r username _ userid groupid _ _ homedir shell; do
groups=$(groups "$username" | cut -d : -f 2)
sudo_status=$(sudo -n -lU "$username" 2>/dev/null | grep -q '(ALL : ALL)' && echo "Yes" || echo "No")
printf "%-20s %-30s %-20s %-10s\n" "$username" "$homedir" "$groups" "$sudo_status"
done < /etc/passwd
echo ""
echo "账户操作"
echo "------------------------"
echo "1. 创建普通账户 2. 创建高级账户"
echo "------------------------"
echo "3. 赋予最高权限 4. 取消最高权限"
echo "------------------------"
echo "5. 删除账号"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
# 提示用户输入新用户名
read -p "请输入新用户名: " new_username
# 创建新用户并设置密码
useradd -m -s /bin/bash "$new_username"
passwd "$new_username"
echo "操作已完成。"
;;
2)
# 提示用户输入新用户名
read -p "请输入新用户名: " new_username
# 创建新用户并设置密码
useradd -m -s /bin/bash "$new_username"
passwd "$new_username"
# 赋予新用户sudo权限
echo "$new_username ALL=(ALL:ALL) ALL" | sudo tee -a /etc/sudoers
echo "操作已完成。"
;;
3)
read -p "请输入用户名: " username
# 赋予新用户sudo权限
echo "$username ALL=(ALL:ALL) ALL" | sudo tee -a /etc/sudoers
;;
4)
read -p "请输入用户名: " username
# 从sudoers文件中移除用户的sudo权限
sed -i "/^$username\sALL=(ALL:ALL)\sALL/d" /etc/sudoers
;;
5)
read -p "请输入要删除的用户名: " username
# 删除用户及其主目录
userdel -r "$username"
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
14)
clear
echo "随机用户名"
echo "------------------------"
for i in {1..5}; do
username="user$(< /dev/urandom tr -dc _a-z0-9 | head -c6)"
echo "随机用户名 $i: $username"
done
echo ""
echo "随机姓名"
echo "------------------------"
first_names=("John" "Jane" "Michael" "Emily" "David" "Sophia" "William" "Olivia" "James" "Emma" "Ava" "Liam" "Mia" "Noah" "Isabella")
last_names=("Smith" "Johnson" "Brown" "Davis" "Wilson" "Miller" "Jones" "Garcia" "Martinez" "Williams" "Lee" "Gonzalez" "Rodriguez" "Hernandez")
# 生成5个随机用户姓名
for i in {1..5}; do
first_name_index=$((RANDOM % ${#first_names[@]}))
last_name_index=$((RANDOM % ${#last_names[@]}))
user_name="${first_names[$first_name_index]} ${last_names[$last_name_index]}"
echo "随机用户姓名 $i: $user_name"
done
echo ""
echo "随机UUID"
echo "------------------------"
for i in {1..5}; do
uuid=$(cat /proc/sys/kernel/random/uuid)
echo "随机UUID $i: $uuid"
done
echo ""
echo "16位随机密码"
echo "------------------------"
for i in {1..5}; do
password=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c16)
echo "随机密码 $i: $password"
done
echo ""
echo "32位随机密码"
echo "------------------------"
for i in {1..5}; do
password=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c32)
echo "随机密码 $i: $password"
done
echo ""
;;
15)
root_use
while true; do
echo "系统时间信息"
# 获取当前系统时区
timezone=$(current_timezone)
# 获取当前系统时间
current_time=$(date +"%Y-%m-%d %H:%M:%S")
# 显示时区和时间
echo "当前系统时区:$timezone"
echo "当前系统时间:$current_time"
echo ""
echo "时区切换"
echo "亚洲------------------------"
echo "1. 中国上海时间 2. 中国香港时间"
echo "3. 日本东京时间 4. 韩国首尔时间"
echo "5. 新加坡时间 6. 印度加尔各答时间"
echo "7. 阿联酋迪拜时间 8. 澳大利亚悉尼时间"
echo "欧洲------------------------"
echo "11. 英国伦敦时间 12. 法国巴黎时间"
echo "13. 德国柏林时间 14. 俄罗斯莫斯科时间"
echo "15. 荷兰尤特赖赫特时间 16. 西班牙马德里时间"
echo "美洲------------------------"
echo "21. 美国西部时间 22. 美国东部时间"
echo "23. 加拿大时间 24. 墨西哥时间"
echo "25. 巴西时间 26. 阿根廷时间"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1) set_timedate Asia/Shanghai ;;
2) set_timedate Asia/Hong_Kong ;;
3) set_timedate Asia/Tokyo ;;
4) set_timedate Asia/Seoul ;;
5) set_timedate Asia/Singapore ;;
6) set_timedate Asia/Kolkata ;;
7) set_timedate Asia/Dubai ;;
8) set_timedate Australia/Sydney ;;
11) set_timedate Europe/London ;;
12) set_timedate Europe/Paris ;;
13) set_timedate Europe/Berlin ;;
14) set_timedate Europe/Moscow ;;
15) set_timedate Europe/Amsterdam ;;
16) set_timedate Europe/Madrid ;;
21) set_timedate America/Los_Angeles ;;
22) set_timedate America/New_York ;;
23) set_timedate America/Vancouver ;;
24) set_timedate America/Mexico_City ;;
25) set_timedate America/Sao_Paulo ;;
26) set_timedate America/Argentina/Buenos_Aires ;;
0) break ;; # 跳出循环,退出菜单
*) break ;; # 跳出循环,退出菜单
esac
done
;;
16)
bbrv3
;;
18)
root_use
current_hostname=$(hostname)
echo "当前主机名: $current_hostname"
read -p "是否要更改主机名?(y/n): " answer
if [[ "${answer,,}" == "y" ]]; then
# 获取新的主机名
read -p "请输入新的主机名: " new_hostname
if [ -n "$new_hostname" ]; then
if [ -f /etc/alpine-release ]; then
# Alpine
echo "$new_hostname" > /etc/hostname
hostname "$new_hostname"
else
# 其他系统,如 Debian, Ubuntu, CentOS 等
hostnamectl set-hostname "$new_hostname"
sed -i "s/$current_hostname/$new_hostname/g" /etc/hostname
systemctl restart systemd-hostnamed
fi
echo "主机名已更改为: $new_hostname"
else
echo "无效的主机名。未更改主机名。"
exit 1
fi
else
echo "未更改主机名。"
fi
;;
19)
root_use
# 获取系统信息
source /etc/os-release
# 定义 Ubuntu 更新源
aliyun_ubuntu_source="http://mirrors.aliyun.com/ubuntu/"
official_ubuntu_source="http://archive.ubuntu.com/ubuntu/"
initial_ubuntu_source=""
# 定义 Debian 更新源
aliyun_debian_source="http://mirrors.aliyun.com/debian/"
official_debian_source="http://deb.debian.org/debian/"
initial_debian_source=""
# 定义 CentOS 更新源
aliyun_centos_source="http://mirrors.aliyun.com/centos/"
official_centos_source="http://mirror.centos.org/centos/"
initial_centos_source=""
# 获取当前更新源并设置初始源
case "$ID" in
ubuntu)
initial_ubuntu_source=$(grep -E '^deb ' /etc/apt/sources.list | head -n 1 | awk '{print $2}')
;;
debian)
initial_debian_source=$(grep -E '^deb ' /etc/apt/sources.list | head -n 1 | awk '{print $2}')
;;
centos)
initial_centos_source=$(awk -F= '/^baseurl=/ {print $2}' /etc/yum.repos.d/CentOS-Base.repo | head -n 1 | tr -d ' ')
;;
*)
echo "未知系统,无法执行切换源脚本"
exit 1
;;
esac
# 备份当前源
backup_sources() {
case "$ID" in
ubuntu)
cp /etc/apt/sources.list /etc/apt/sources.list.bak
;;
debian)
cp /etc/apt/sources.list /etc/apt/sources.list.bak
;;
centos)
if [ ! -f /etc/yum.repos.d/CentOS-Base.repo.bak ]; then
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
else
echo "备份已存在,无需重复备份"
fi
;;
*)
echo "未知系统,无法执行备份操作"
exit 1
;;
esac
echo "已备份当前更新源为 /etc/apt/sources.list.bak 或 /etc/yum.repos.d/CentOS-Base.repo.bak"
}
# 还原初始更新源
restore_initial_source() {
case "$ID" in
ubuntu)
cp /etc/apt/sources.list.bak /etc/apt/sources.list
;;
debian)
cp /etc/apt/sources.list.bak /etc/apt/sources.list
;;
centos)
cp /etc/yum.repos.d/CentOS-Base.repo.bak /etc/yum.repos.d/CentOS-Base.repo
;;
*)
echo "未知系统,无法执行还原操作"
exit 1
;;
esac
echo "已还原初始更新源"
}
# 函数:切换更新源
switch_source() {
case "$ID" in
ubuntu)
sed -i 's|'"$initial_ubuntu_source"'|'"$1"'|g' /etc/apt/sources.list
;;
debian)
sed -i 's|'"$initial_debian_source"'|'"$1"'|g' /etc/apt/sources.list
;;
centos)
sed -i "s|^baseurl=.*$|baseurl=$1|g" /etc/yum.repos.d/CentOS-Base.repo
;;
*)
echo "未知系统,无法执行切换操作"
exit 1
;;
esac
}
# 主菜单
while true; do
case "$ID" in
ubuntu)
echo "Ubuntu 更新源切换脚本"
echo "------------------------"
;;
debian)
echo "Debian 更新源切换脚本"
echo "------------------------"
;;
centos)
echo "CentOS 更新源切换脚本"
echo "------------------------"
;;
*)
echo "未知系统,无法执行脚本"
exit 1
;;
esac
echo "1. 切换到阿里云源"
echo "2. 切换到官方源"
echo "------------------------"
echo "3. 备份当前更新源"
echo "4. 还原初始更新源"
echo "------------------------"
echo "0. 返回上一级"
echo "------------------------"
read -p "请选择操作: " choice
case $choice in
1)
backup_sources
case "$ID" in
ubuntu)
switch_source $aliyun_ubuntu_source
;;
debian)
switch_source $aliyun_debian_source
;;
centos)
switch_source $aliyun_centos_source
;;
*)
echo "未知系统,无法执行切换操作"
exit 1
;;
esac
echo "已切换到阿里云源"
;;
2)
backup_sources
case "$ID" in
ubuntu)
switch_source $official_ubuntu_source
;;
debian)
switch_source $official_debian_source
;;
centos)
switch_source $official_centos_source
;;
*)
echo "未知系统,无法执行切换操作"
exit 1
;;
esac
echo "已切换到官方源"
;;
3)
backup_sources
case "$ID" in
ubuntu)
switch_source $initial_ubuntu_source
;;
debian)
switch_source $initial_debian_source
;;
centos)
switch_source $initial_centos_source
;;
*)
echo "未知系统,无法执行切换操作"
exit 1
;;
esac
echo "已切换到初始更新源"
;;
4)
restore_initial_source
;;
0)
break
;;
*)
echo "无效的选择,请重新输入"
;;
esac
break_end
done
;;
20)
while true; do
clear
echo "定时任务列表"
crontab -l
echo ""
echo "操作"
echo "------------------------"
echo "1. 添加定时任务 2. 删除定时任务 3. 编辑定时任务"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
read -p "请输入新任务的执行命令: " newquest
echo "------------------------"
echo "1. 每月任务 2. 每周任务"
echo "3. 每天任务 4. 每小时任务"
echo "------------------------"
read -p "请输入你的选择: " dingshi
case $dingshi in
1)
read -p "选择每月的几号执行任务? (1-30): " day
(crontab -l ; echo "0 0 $day * * $newquest") | crontab - > /dev/null 2>&1
;;
2)
read -p "选择周几执行任务? (0-60代表星期日): " weekday
(crontab -l ; echo "0 0 * * $weekday $newquest") | crontab - > /dev/null 2>&1
;;
3)
read -p "选择每天几点执行任务?(小时,0-23): " hour
(crontab -l ; echo "0 $hour * * * $newquest") | crontab - > /dev/null 2>&1
;;
4)
read -p "输入每小时的第几分钟执行任务?(分钟,0-60): " minute
(crontab -l ; echo "$minute * * * * $newquest") | crontab - > /dev/null 2>&1
;;
*)
break # 跳出
;;
esac
;;
2)
read -p "请输入需要删除任务的关键字: " kquest
crontab -l | grep -v "$kquest" | crontab -
;;
3)
crontab -e
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
21)
root_use
while true; do
echo "本机host解析列表"
echo "如果你在这里添加解析匹配,将不再使用动态解析了"
cat /etc/hosts
echo ""
echo "操作"
echo "------------------------"
echo "1. 添加新的解析 2. 删除解析地址"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " host_dns
case $host_dns in
1)
read -p "请输入新的解析记录 格式: 110.25.5.33 kejilion.pro : " addhost
echo "$addhost" >> /etc/hosts
;;
2)
read -p "请输入需要删除的解析内容关键字: " delhost
sed -i "/$delhost/d" /etc/hosts
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
22)
root_use
if docker inspect fail2ban &>/dev/null ; then
while true; do
clear
echo "SSH防御程序已启动"
echo "------------------------"
echo "1. 查看SSH拦截记录"
echo "2. 日志实时监控"
echo "------------------------"
echo "9. 卸载防御程序"
echo "------------------------"
echo "0. 退出"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
echo "------------------------"
f2b_sshd
echo "------------------------"
;;
2)
tail -f /path/to/fail2ban/config/log/fail2ban/fail2ban.log
break
;;
9)
docker rm -f fail2ban
rm -rf /path/to/fail2ban
echo "Fail2Ban防御程序已卸载"
break
;;
0)
break
;;
*)
echo "无效的选择,请重新输入。"
;;
esac
break_end
done
elif [ -x "$(command -v fail2ban-client)" ] ; then
clear
echo "卸载旧版fail2ban"
read -p "确定继续吗?(Y/N): " choice
case "$choice" in
[Yy])
remove fail2ban
rm -rf /etc/fail2ban
echo "Fail2Ban防御程序已卸载"
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
else
clear
echo "fail2ban是一个SSH防止暴力破解工具"
echo "官网介绍: https://github.com/fail2ban/fail2ban"
echo "------------------------------------------------"
echo "工作原理:研判非法IP恶意高频访问SSH端口,自动进行IP封锁"
echo "------------------------------------------------"
read -p "确定继续吗?(Y/N): " choice
case "$choice" in
[Yy])
clear
install_docker
f2b_install_sshd
cd ~
f2b_status
echo "Fail2Ban防御程序已开启"
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
fi
;;
23)
root_use
echo "当前流量使用情况,重启服务器流量计算会清零!"
output_status
echo "$output"
# 检查是否存在 Limiting_Shut_down.sh 文件
if [ -f ~/Limiting_Shut_down.sh ]; then
# 获取 threshold_gb 的值
threshold_gb=$(grep -oP 'threshold_gb=\K\d+' ~/Limiting_Shut_down.sh)
echo -e "当前设置的限流阈值为 ${hang}${threshold_gb}${bai}GB"
else
echo -e "${hui}前未启用限流关机功能${bai}"
fi
echo
echo "------------------------------------------------"
echo "系统每分钟会检测实际流量是否到达阈值,到达后会自动关闭服务器!每月1日重置流量重启服务器。"
read -p "1. 开启限流关机功能 2. 停用限流关机功能 0. 退出 : " Limiting
case "$Limiting" in
1)
# 输入新的虚拟内存大小
echo "如果实际服务器就100G流量,可设置阈值为95G,提前关机,以免出现流量误差或溢出."
read -p "请输入流量阈值(单位为GB: " threshold_gb
cd ~
curl -Ss -O "${GITHUB_RAW_URL}/kejilion/sh/main/Limiting_Shut_down.sh"
chmod +x ~/Limiting_Shut_down.sh
sed -i "s/110/$threshold_gb/g" ~/Limiting_Shut_down.sh
crontab -l | grep -v '~/Limiting_Shut_down.sh' | crontab -
(crontab -l ; echo "* * * * * ~/Limiting_Shut_down.sh") | crontab - > /dev/null 2>&1
crontab -l | grep -v 'reboot' | crontab -
(crontab -l ; echo "0 1 1 * * reboot") | crontab - > /dev/null 2>&1
echo "限流关机已设置"
;;
0)
echo "已取消"
;;
2)
crontab -l | grep -v '~/Limiting_Shut_down.sh' | crontab -
crontab -l | grep -v 'reboot' | crontab -
rm ~/Limiting_Shut_down.sh
echo "已关闭限流关机功能"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
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
;;
*)
echo "无效的输入!"
;;
esac
break_end
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
mkdir cluster && cd cluster
touch servers.py
cat > ./servers.py << EOF
servers = [
]
EOF
;;
2)
while true; do
clear
echo "集群服务器列表"
cat ~/cluster/servers.py
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 -p "服务器用户密码: " server_password
sed -i "/servers = \[/a\ {\"name\": \"$server_name\", \"hostname\": \"$server_ip\", \"port\": $server_port, \"username\": \"$server_username\", \"password\": \"$server_password\", \"remote_path\": \"/home/\"}," ~/cluster/servers.py
;;
2)
read -p "请输入需要删除的关键字: " rmserver
sed -i "/$rmserver/d" ~/cluster/servers.py
;;
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
py_task=custom_tasks.py
cd ~/cluster/
curl -sS -O "${GITHUB_RAW_URL}/kejilion/python-for-vps/main/cluster/${py_task}"
sed -i "s#Customtasks#$mingling#g" ~/cluster/$py_task
python3 ~/cluster/$py_task
;;
0)
break # 跳出循环,退出菜单
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
7)
clear
echo "将下载服务器列表数据,按任意键下载!"
read -n 1 -s -r -p ""
sz -y ~/cluster/servers.py
;;
8)
clear
echo "请上传您的servers.py,按任意键开始上传!"
read -n 1 -s -r -p ""
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)
cd ~
clear
echo "更新日志"
echo "------------------------"
echo "全部日志: ${GITHUB_RAW_URL}/kejilion/sh/main/kejilion_sh_log.txt"
echo "------------------------"
curl -s "${GITHUB_RAW_URL}/kejilion/sh/main/kejilion_sh_log.txt" | tail -n 35
sh_v_new=$(curl -s "${GITHUB_RAW_URL}/kejilion/sh/main/kejilion.sh" | grep -o 'sh_v="[0-9.]*"' | cut -d '"' -f 2)
if [ "$sh_v" = "$sh_v_new" ]; then
echo -e "${lv}你已经是最新版本!${huang}v$sh_v${bai}"
else
echo "发现新版本!"
echo -e "当前版本 v$sh_v 最新版本 ${huang}v$sh_v_new${bai}"
echo "------------------------"
read -p "确定更新脚本吗?(Y/N): " choice
case "$choice" in
[Yy])
clear
curl -sS -O "${GITHUB_RAW_URL}/kejilion/sh/main/kejilion.sh" && chmod +x kejilion.sh
cp ./kejilion.sh /usr/local/bin/k > /dev/null 2>&1
echo -e "${lv}脚本已更新到最新版本!${huang}v$sh_v_new${bai}"
break_end
kejilion
;;
[Nn])
echo "已取消"
;;
*)
;;
esac
fi
;;
0)
clear
exit
;;
*)
echo "无效的输入!"
;;
esac
break_end
done
}
if [ "$#" -eq 0 ]; then
# 如果没有参数,运行交互式逻辑
kejilion_sh
else
# 如果有参数,执行相应函数
case $1 in
install|add|安装)
shift
install "$@"
;;
remove|del|卸载)
shift
remove "$@"
;;
update|更新)
linux_update
;;
clean|清理)
linux_clean
;;
dd|重装)
dd_xitong
;;
bbr3|bbrv3)
bbrv3
;;
*)
echo "无效参数"
;;
esac
fi