Files
kejilion/kejilion.sh
2025-11-07 10:56:56 +08:00

6535 lines
223 KiB
Bash
Raw Permalink 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'
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
}
check_port() {
# 定义要检测的端口
PORT=443
# 检查端口占用情况
result=$(ss -tulpn | grep ":$PORT")
# 判断结果并输出相应信息
if [ -n "$result" ]; then
is_nginx_container=$(docker ps --format '{{.Names}}' | grep 'nginx')
# 判断是否是Nginx容器占用端口
if [ -n "$is_nginx_container" ]; then
echo ""
else
clear
echo -e "${hong}端口 ${huang}$PORT${hong} 已被占用,无法安装环境,卸载以下程序后重试!${bai}"
echo "$result"
break_end
kejilion
fi
else
echo ""
fi
}
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 https://raw.gitmirror.com/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
}
docker_restart() {
if [ -f "/etc/alpine-release" ]; then
service docker restart
else
systemctl restart docker
fi
}
docker_ipv6_on() {
mkdir -p /etc/docker &>/dev/null
cat > /etc/docker/daemon.json << EOF
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
EOF
docker_restart
echo "Docker已开启v6访问"
}
docker_ipv6_off() {
rm -rf etc/docker/daemon.json &>/dev/null
docker_restart
echo "Docker已关闭v6访问"
}
iptables_open() {
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -F
}
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"
}
ldnmp_v() {
# 获取nginx版本
nginx_version=$(docker exec nginx nginx -v 2>&1)
nginx_version=$(echo "$nginx_version" | grep -oP "nginx/\K[0-9]+\.[0-9]+\.[0-9]+")
echo -n -e "nginx : ${huang}v$nginx_version${bai}"
# 获取mysql版本
dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
mysql_version=$(docker exec mysql mysql -u root -p"$dbrootpasswd" -e "SELECT VERSION();" 2>/dev/null | tail -n 1)
echo -n -e " mysql : ${huang}v$mysql_version${bai}"
# 获取php版本
php_version=$(docker exec php php -v 2>/dev/null | grep -oP "PHP \K[0-9]+\.[0-9]+\.[0-9]+")
echo -n -e " php : ${huang}v$php_version${bai}"
# 获取redis版本
redis_version=$(docker exec redis redis-server -v 2>&1 | grep -oP "v=+\K[0-9]+\.[0-9]+")
echo -e " redis : ${huang}v$redis_version${bai}"
echo "------------------------"
echo ""
}
install_ldnmp() {
new_swap=1024
add_swap
cd /home/web && docker compose up -d
clear
echo "正在配置LDNMP环境请耐心稍等……"
# 定义要执行的命令
commands=(
"docker exec nginx chmod -R 777 /var/www/html"
"docker restart nginx > /dev/null 2>&1"
# "docker exec php sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories > /dev/null 2>&1"
# "docker exec php74 sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories > /dev/null 2>&1"
"docker exec php apk update > /dev/null 2>&1"
"docker exec php74 apk update > /dev/null 2>&1"
# php安装包管理
"curl -sL https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions -o /usr/local/bin/install-php-extensions > /dev/null 2>&1"
"docker exec php mkdir -p /usr/local/bin/ > /dev/null 2>&1"
"docker exec php74 mkdir -p /usr/local/bin/ > /dev/null 2>&1"
"docker cp /usr/local/bin/install-php-extensions php:/usr/local/bin/ > /dev/null 2>&1"
"docker cp /usr/local/bin/install-php-extensions php74:/usr/local/bin/ > /dev/null 2>&1"
"docker exec php chmod +x /usr/local/bin/install-php-extensions > /dev/null 2>&1"
"docker exec php74 chmod +x /usr/local/bin/install-php-extensions > /dev/null 2>&1"
# php安装扩展
"docker exec php install-php-extensions imagick > /dev/null 2>&1"
"docker exec php install-php-extensions mysqli > /dev/null 2>&1"
"docker exec php install-php-extensions pdo_mysql > /dev/null 2>&1"
"docker exec php install-php-extensions gd > /dev/null 2>&1"
"docker exec php install-php-extensions intl > /dev/null 2>&1"
"docker exec php install-php-extensions zip > /dev/null 2>&1"
"docker exec php install-php-extensions exif > /dev/null 2>&1"
"docker exec php install-php-extensions bcmath > /dev/null 2>&1"
"docker exec php install-php-extensions opcache > /dev/null 2>&1"
"docker exec php install-php-extensions redis > /dev/null 2>&1"
# php配置参数
"docker exec php sh -c 'echo \"upload_max_filesize=50M \" > /usr/local/etc/php/conf.d/uploads.ini' > /dev/null 2>&1"
"docker exec php sh -c 'echo \"post_max_size=50M \" > /usr/local/etc/php/conf.d/post.ini' > /dev/null 2>&1"
"docker exec php sh -c 'echo \"memory_limit=256M\" > /usr/local/etc/php/conf.d/memory.ini' > /dev/null 2>&1"
"docker exec php sh -c 'echo \"max_execution_time=1200\" > /usr/local/etc/php/conf.d/max_execution_time.ini' > /dev/null 2>&1"
"docker exec php sh -c 'echo \"max_input_time=600\" > /usr/local/etc/php/conf.d/max_input_time.ini' > /dev/null 2>&1"
# php重启
"docker exec php chmod -R 777 /var/www/html"
"docker restart php > /dev/null 2>&1"
# php7.4安装扩展
"docker exec php74 install-php-extensions imagick > /dev/null 2>&1"
"docker exec php74 install-php-extensions mysqli > /dev/null 2>&1"
"docker exec php74 install-php-extensions pdo_mysql > /dev/null 2>&1"
"docker exec php74 install-php-extensions gd > /dev/null 2>&1"
"docker exec php74 install-php-extensions intl > /dev/null 2>&1"
"docker exec php74 install-php-extensions zip > /dev/null 2>&1"
"docker exec php74 install-php-extensions exif > /dev/null 2>&1"
"docker exec php74 install-php-extensions bcmath > /dev/null 2>&1"
"docker exec php74 install-php-extensions opcache > /dev/null 2>&1"
"docker exec php74 install-php-extensions redis > /dev/null 2>&1"
# php7.4配置参数
"docker exec php74 sh -c 'echo \"upload_max_filesize=50M \" > /usr/local/etc/php/conf.d/uploads.ini' > /dev/null 2>&1"
"docker exec php74 sh -c 'echo \"post_max_size=50M \" > /usr/local/etc/php/conf.d/post.ini' > /dev/null 2>&1"
"docker exec php74 sh -c 'echo \"memory_limit=256M\" > /usr/local/etc/php/conf.d/memory.ini' > /dev/null 2>&1"
"docker exec php74 sh -c 'echo \"max_execution_time=1200\" > /usr/local/etc/php/conf.d/max_execution_time.ini' > /dev/null 2>&1"
"docker exec php74 sh -c 'echo \"max_input_time=600\" > /usr/local/etc/php/conf.d/max_input_time.ini' > /dev/null 2>&1"
# php7.4重启
"docker exec php74 chmod -R 777 /var/www/html"
"docker restart php74 > /dev/null 2>&1"
# redis调优
"docker exec -it redis redis-cli CONFIG SET maxmemory 512mb > /dev/null 2>&1"
"docker exec -it redis redis-cli CONFIG SET maxmemory-policy allkeys-lru > /dev/null 2>&1"
)
total_commands=${#commands[@]} # 计算总命令数
for ((i = 0; i < total_commands; i++)); do
command="${commands[i]}"
eval $command # 执行命令
# 打印百分比和进度条
percentage=$(( (i + 1) * 100 / total_commands ))
completed=$(( percentage / 2 ))
remaining=$(( 50 - completed ))
progressBar="["
for ((j = 0; j < completed; j++)); do
progressBar+="#"
done
for ((j = 0; j < remaining; j++)); do
progressBar+="."
done
progressBar+="]"
echo -ne "\r[${lv}$percentage%${bai}] $progressBar"
done
echo # 打印换行,以便输出不被覆盖
clear
echo "LDNMP环境安装完毕"
echo "------------------------"
ldnmp_v
}
install_certbot() {
if command -v yum &>/dev/null; then
install epel-release certbot
else
install certbot
fi
# 切换到一个一致的目录(例如,家目录)
cd ~ || exit
# 下载并使脚本可执行
curl -O https://raw.githubusercontent.com/kejilion/sh/main/auto_cert_renewal.sh
chmod +x auto_cert_renewal.sh
# 设置定时任务字符串
cron_job="0 0 * * * ~/auto_cert_renewal.sh"
# 检查是否存在相同的定时任务
existing_cron=$(crontab -l 2>/dev/null | grep -F "$cron_job")
# 如果不存在,则添加定时任务
if [ -z "$existing_cron" ]; then
(crontab -l 2>/dev/null; echo "$cron_job") | crontab -
echo "续签任务已添加"
else
echo "续签任务已存在,无需添加"
fi
}
install_ssltls() {
docker stop nginx > /dev/null 2>&1
iptables_open
cd ~
certbot_version=$(certbot --version 2>&1 | grep -oP "\d+\.\d+\.\d+")
version_ge() {
[ "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" != "$1" ]
}
if version_ge "$certbot_version" "1.10.0"; then
certbot certonly --standalone -d $yuming --email your@email.com --agree-tos --no-eff-email --force-renewal --key-type ecdsa
else
certbot certonly --standalone -d $yuming --email your@email.com --agree-tos --no-eff-email --force-renewal
fi
cp /etc/letsencrypt/live/$yuming/fullchain.pem /home/web/certs/${yuming}_cert.pem
cp /etc/letsencrypt/live/$yuming/privkey.pem /home/web/certs/${yuming}_key.pem
docker start nginx > /dev/null 2>&1
}
default_server_ssl() {
install openssl
# openssl req -x509 -nodes -newkey rsa:2048 -keyout /home/web/certs/default_server.key -out /home/web/certs/default_server.crt -days 5475 -subj "/C=US/ST=State/L=City/O=Organization/OU=Organizational Unit/CN=Common Name"
if command -v dnf &>/dev/null || command -v yum &>/dev/null; then
openssl req -x509 -nodes -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -keyout /home/web/certs/default_server.key -out /home/web/certs/default_server.crt -days 5475 -subj "/C=US/ST=State/L=City/O=Organization/OU=Organizational Unit/CN=Common Name"
else
openssl genpkey -algorithm Ed25519 -out /home/web/certs/default_server.key
openssl req -x509 -key /home/web/certs/default_server.key -out /home/web/certs/default_server.crt -days 5475 -subj "/C=US/ST=State/L=City/O=Organization/OU=Organizational Unit/CN=Common Name"
fi
}
nginx_status() {
sleep 1
nginx_container_name="nginx"
# 获取容器的状态
container_status=$(docker inspect -f '{{.State.Status}}' "$nginx_container_name" 2>/dev/null)
# 获取容器的重启状态
container_restart_count=$(docker inspect -f '{{.RestartCount}}' "$nginx_container_name" 2>/dev/null)
# 检查容器是否在运行,并且没有处于"Restarting"状态
if [ "$container_status" == "running" ]; then
echo ""
else
rm -r /home/web/html/$yuming >/dev/null 2>&1
rm /home/web/conf.d/$yuming.conf >/dev/null 2>&1
rm /home/web/certs/${yuming}_key.pem >/dev/null 2>&1
rm /home/web/certs/${yuming}_cert.pem >/dev/null 2>&1
docker restart nginx >/dev/null 2>&1
dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
docker exec mysql mysql -u root -p"$dbrootpasswd" -e "DROP DATABASE $dbname;" 2> /dev/null
echo -e "${hong}检测到域名证书申请失败,请检测域名是否正确解析或更换域名重新尝试!${bai}"
fi
}
repeat_add_yuming() {
domain_regex="^([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$"
if [[ $yuming =~ $domain_regex ]]; then
echo "域名格式正确"
else
echo "域名格式不正确,请重新输入"
break_end
kejilion
fi
if [ -e /home/web/conf.d/$yuming.conf ]; then
echo -e "${huang}当前 ${yuming} 域名已被使用请前往31站点管理删除站点再部署 ${webname} ${bai}"
break_end
kejilion
else
echo "当前 ${yuming} 域名可用"
fi
}
add_yuming() {
ip_address
echo -e "先将域名解析到本机IP: ${huang}$ipv4_address $ipv6_address${bai}"
read -p "请输入你解析的域名: " yuming
repeat_add_yuming
}
add_db() {
dbname=$(echo "$yuming" | sed -e 's/[^A-Za-z0-9]/_/g')
dbname="${dbname}"
dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
dbuse=$(grep -oP 'MYSQL_USER:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
dbusepasswd=$(grep -oP 'MYSQL_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
docker exec mysql mysql -u root -p"$dbrootpasswd" -e "CREATE DATABASE $dbname; GRANT ALL PRIVILEGES ON $dbname.* TO \"$dbuse\"@\"%\";"
}
reverse_proxy() {
ip_address
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/reverse-proxy.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
sed -i "s/0.0.0.0/$ipv4_address/g" /home/web/conf.d/$yuming.conf
sed -i "s/0000/$duankou/g" /home/web/conf.d/$yuming.conf
docker restart nginx
}
restart_ldnmp() {
docker exec nginx chmod -R 777 /var/www/html
docker exec php chmod -R 777 /var/www/html
docker exec php74 chmod -R 777 /var/www/html
docker restart nginx
docker restart php
docker restart php74
}
has_ipv4_has_ipv6() {
ip_address
if [ -z "$ipv4_address" ]; then
has_ipv4=false
else
has_ipv4=true
fi
if [ -z "$ipv6_address" ]; then
has_ipv6=false
else
has_ipv6=true
fi
}
docker_app() {
has_ipv4_has_ipv6
if docker inspect "$docker_name" &>/dev/null; then
clear
echo "$docker_name 已安装,访问地址: "
if $has_ipv4; then
echo "http:$ipv4_address:$docker_port"
fi
if $has_ipv6; then
echo "http:[$ipv6_address]:$docker_port"
fi
echo ""
echo "应用操作"
echo "------------------------"
echo "1. 更新应用 2. 卸载应用"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
docker rm -f "$docker_name"
docker rmi -f "$docker_img"
$docker_rum
clear
echo "$docker_name 已经安装完成"
echo "------------------------"
echo "您可以使用以下地址访问:"
if $has_ipv4; then
echo "http:$ipv4_address:$docker_port"
fi
if $has_ipv6; then
echo "http:[$ipv6_address]:$docker_port"
fi
echo ""
$docker_use
$docker_passwd
;;
2)
clear
docker rm -f "$docker_name"
docker rmi -f "$docker_img"
rm -rf "/home/docker/$docker_name"
echo "应用已卸载"
;;
0)
# 跳出循环,退出菜单
;;
*)
# 跳出循环,退出菜单
;;
esac
else
clear
echo "安装提示"
echo "$docker_describe"
echo "$docker_url"
echo ""
# 提示用户确认安装
read -p "确定安装吗?(Y/N): " choice
case "$choice" in
[Yy])
clear
# 安装 Docker请确保有 install_docker 函数)
install_docker
$docker_rum
clear
echo "$docker_name 已经安装完成"
echo "------------------------"
echo "您可以使用以下地址访问:"
if $has_ipv4; then
echo "http:$ipv4_address:$docker_port"
fi
if $has_ipv6; then
echo "http:[$ipv6_address]:$docker_port"
fi
echo ""
$docker_use
$docker_passwd
;;
[Nn])
# 用户选择不安装
;;
*)
# 无效输入
;;
esac
fi
}
cluster_python3() {
cd ~/cluster/
curl -sS -O https://raw.githubusercontent.com/kejilion/python-for-vps/main/cluster/$py_task
python3 ~/cluster/$py_task
}
tmux_run() {
# Check if the session already exists
tmux has-session -t $SESSION_NAME 2>/dev/null
# $? is a special variable that holds the exit status of the last executed command
if [ $? != 0 ]; then
# Session doesn't exist, create a new one
tmux new -s $SESSION_NAME
else
# Session exists, attach to it
tmux attach-session -t $SESSION_NAME
fi
}
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 \
-v /home/web/log/nginx/:/remotelogs/nginx: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 https://raw.githubusercontent.com/kejilion/config/main/fail2ban/alpine-sshd.conf
curl -sS -O https://raw.githubusercontent.com/kejilion/config/main/fail2ban/alpine-sshd-ddos.conf
cd /path/to/fail2ban/config/fail2ban/jail.d/
curl -sS -O https://raw.githubusercontent.com/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 https://raw.githubusercontent.com/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 https://raw.githubusercontent.com/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)
}
ldnmp_install_status_one() {
if docker inspect "php" &>/dev/null; then
echo -e "${huang}LDNMP环境已安装。无法再次安装。可以使用37. 更新LDNMP环境${bai}"
break_end
kejilion
else
echo
fi
}
ldnmp_install_status() {
if docker inspect "php" &>/dev/null; then
echo "LDNMP环境已安装开始部署 $webname"
else
echo -e "${huang}LDNMP环境未安装请先安装LDNMP环境再部署网站${bai}"
break_end
kejilion
fi
}
nginx_install_status() {
if docker inspect "nginx" &>/dev/null; then
echo "nginx环境已安装开始部署 $webname"
else
echo -e "${huang}nginx未安装请先安装nginx环境再部署网站${bai}"
break_end
kejilion
fi
}
ldnmp_web_on() {
clear
echo "您的 $webname 搭建好了!"
echo "https://$yuming"
echo "------------------------"
echo "$webname 安装信息如下: "
}
nginx_web_on() {
clear
echo "您的 $webname 搭建好了!"
echo "https://$yuming"
}
install_panel() {
if $lujing ; then
clear
echo "$panelname 已安装,应用操作"
echo ""
echo "------------------------"
echo "1. 管理$panelname 2. 卸载$panelname"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
$gongneng1
$gongneng1_1
;;
2)
clear
$gongneng2
$gongneng2_1
$gongneng2_2
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
else
clear
echo "安装提示"
echo "如果您已经安装了其他面板工具或者LDNMP建站环境建议先卸载再安装 $panelname"
echo "会根据系统自动安装支持DebianUbuntuCentos"
echo "官网介绍: $panelurl "
echo ""
read -p "确定安装 $panelname 吗?(Y/N): " choice
case "$choice" in
[Yy])
iptables_open
install wget
if grep -q 'Alpine' /etc/issue; then
$ubuntu_mingling
$ubuntu_mingling2
elif grep -qi 'CentOS' /etc/redhat-release; then
$centos_mingling
$centos_mingling2
elif grep -qi 'Ubuntu' /etc/os-release; then
$ubuntu_mingling
$ubuntu_mingling2
elif grep -qi 'Debian' /etc/os-release; then
$ubuntu_mingling
$ubuntu_mingling2
else
echo "Unsupported OS"
fi
;;
[Nn])
;;
*)
;;
esac
fi
}
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 "------------------------"
}
restart_ssh() {
if command -v dnf &>/dev/null; then
systemctl restart sshd
elif command -v yum &>/dev/null; then
systemctl restart sshd
elif command -v apt &>/dev/null; then
service ssh restart
elif command -v apk &>/dev/null; then
service sshd restart
else
echo "未知的包管理器!"
return 1
fi
}
new_ssh_port() {
# 备份 SSH 配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i 's/^\s*#\?\s*Port/Port/' /etc/ssh/sshd_config
# 替换 SSH 配置文件中的端口号
sed -i "s/Port [0-9]\+/Port $new_port/g" /etc/ssh/sshd_config
rm -rf /etc/ssh/sshd_config.d/* /etc/ssh/ssh_config.d/*
# 重启 SSH 服务
restart_ssh
echo "SSH 端口已修改为: $new_port"
iptables_open
remove iptables-persistent ufw firewalld iptables-services > /dev/null 2>&1
}
add_sshkey() {
# ssh-keygen -t rsa -b 4096 -C "xxxx@gmail.com" -f /root/.ssh/sshkey -N ""
ssh-keygen -t ed25519 -C "xxxx@gmail.com" -f /root/.ssh/sshkey -N ""
cat ~/.ssh/sshkey.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
ip_address
echo -e "私钥信息已生成,务必复制保存,可保存成 ${huang}${ipv4_address}_ssh.key${bai} 文件用于以后的SSH登录"
echo "--------------------------------"
cat ~/.ssh/sshkey
echo "--------------------------------"
sed -i -e 's/^\s*#\?\s*PermitRootLogin .*/PermitRootLogin prohibit-password/' \
-e 's/^\s*#\?\s*PasswordAuthentication .*/PasswordAuthentication no/' \
-e 's/^\s*#\?\s*PubkeyAuthentication .*/PubkeyAuthentication yes/' \
-e 's/^\s*#\?\s*ChallengeResponseAuthentication .*/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config
rm -rf /etc/ssh/sshd_config.d/* /etc/ssh/ssh_config.d/*
echo -e "${lv}ROOT私钥登录已开启已关闭ROOT密码登录重连将会生效${bai}"
}
add_sshpasswd() {
echo "设置你的ROOT密码"
passwd
sed -i 's/^\s*#\?\s*PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config;
sed -i 's/^\s*#\?\s*PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config;
rm -rf /etc/ssh/sshd_config.d/* /etc/ssh/ssh_config.d/*
restart_ssh
echo -e "${lv}ROOT登录设置完毕${bai}"
}
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 'https://raw.githubusercontent.com/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 'https://raw.githubusercontent.com/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 https://raw.githubusercontent.com/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 https://raw.githubusercontent.com/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 - https://raw.githubusercontent.com/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 https://raw.githubusercontent.com/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 - https://raw.githubusercontent.com/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 https://raw.githubusercontent.com/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 "4. 常用工具 ▶"
echo "5. BBR管理 ▶"
echo "6. Docker管理 ▶ "
echo "7. WARP管理 ▶ "
echo "8. 测试脚本合集 ▶ "
echo "9. 甲骨文云脚本合集 ▶ "
echo -e "${huang}10. LDNMP建站 ▶ ${bai}"
echo "11. 面板工具 ▶ "
echo "12. 我的工作区 ▶ "
echo "13. 系统工具 ▶ "
echo "14. VPS集群控制 ▶ "
echo "------------------------"
echo "p. 幻兽帕鲁开服脚本 ▶"
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
;;
4)
while true; do
clear
echo "▶ 安装常用工具"
echo "------------------------"
echo "1. curl 下载工具"
echo "2. wget 下载工具"
echo "3. sudo 超级管理权限工具"
echo "4. socat 通信连接工具 (申请域名证书必备)"
echo "5. htop 系统监控工具"
echo "6. iftop 网络流量监控工具"
echo "7. unzip ZIP压缩解压工具"
echo "8. tar GZ压缩解压工具"
echo "9. tmux 多路后台运行工具"
echo "10. ffmpeg 视频编码直播推流工具"
echo "11. btop 现代化监控工具"
echo "12. ranger 文件管理工具"
echo "13. gdu 磁盘占用查看工具"
echo "14. fzf 全局搜索工具"
echo "------------------------"
echo "21. cmatrix 黑客帝国屏保"
echo "22. sl 跑火车屏保"
echo "------------------------"
echo "26. 俄罗斯方块小游戏"
echo "27. 贪吃蛇小游戏"
echo "28. 太空入侵者小游戏"
echo "------------------------"
echo "31. 全部安装"
echo "32. 全部卸载"
echo "------------------------"
echo "41. 安装指定工具"
echo "42. 卸载指定工具"
echo "------------------------"
echo "0. 返回主菜单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
install curl
clear
echo "工具已安装,使用方法如下:"
curl --help
;;
2)
clear
install wget
clear
echo "工具已安装,使用方法如下:"
wget --help
;;
3)
clear
install sudo
clear
echo "工具已安装,使用方法如下:"
sudo --help
;;
4)
clear
install socat
clear
echo "工具已安装,使用方法如下:"
socat -h
;;
5)
clear
install htop
clear
htop
;;
6)
clear
install iftop
clear
iftop
;;
7)
clear
install unzip
clear
echo "工具已安装,使用方法如下:"
unzip
;;
8)
clear
install tar
clear
echo "工具已安装,使用方法如下:"
tar --help
;;
9)
clear
install tmux
clear
echo "工具已安装,使用方法如下:"
tmux --help
;;
10)
clear
install ffmpeg
clear
echo "工具已安装,使用方法如下:"
ffmpeg --help
;;
11)
clear
install btop
clear
btop
;;
12)
clear
install ranger
cd /
clear
ranger
cd ~
;;
13)
clear
install gdu
cd /
clear
gdu
cd ~
;;
14)
clear
install fzf
cd /
clear
fzf
cd ~
;;
21)
clear
install cmatrix
clear
cmatrix
;;
22)
clear
install sl
clear
/usr/games/sl
;;
26)
clear
install bastet
clear
/usr/games/bastet
;;
27)
clear
install nsnake
clear
/usr/games/nsnake
;;
28)
clear
install ninvaders
clear
/usr/games/ninvaders
;;
31)
clear
install curl wget sudo socat htop iftop unzip tar tmux ffmpeg btop ranger gdu fzf cmatrix sl bastet nsnake ninvaders
;;
32)
clear
remove htop iftop unzip tmux ffmpeg btop ranger gdu fzf cmatrix sl bastet nsnake ninvaders
;;
41)
clear
read -p "请输入安装的工具名wget curl sudo htop: " installname
install $installname
;;
42)
clear
read -p "请输入卸载的工具名htop ufw tmux cmatrix: " removename
remove $removename
;;
0)
kejilion
;;
*)
echo "无效的输入!"
;;
esac
break_end
done
;;
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 https://raw.githubusercontent.com/ylx2016/Linux-NetSpeed/master/tcpx.sh
chmod +x tcpx.sh
./tcpx.sh
fi
;;
6)
while true; do
clear
echo "▶ Docker管理器"
echo "------------------------"
echo "1. 安装更新Docker环境"
echo "------------------------"
echo "2. 查看Docker全局状态"
echo "------------------------"
echo "3. Docker容器管理 ▶"
echo "4. Docker镜像管理 ▶"
echo "5. Docker网络管理 ▶"
echo "6. Docker卷管理 ▶"
echo "------------------------"
echo "7. 清理无用的docker容器和镜像网络数据卷"
echo "------------------------"
echo "8. 更换Docker源"
echo "9. 编辑daemon.json文件"
echo "------------------------"
echo "11. 开启Docker-ipv6访问"
echo "12. 关闭Docker-ipv6访问"
echo "------------------------"
echo "20. 卸载Docker环境"
echo "------------------------"
echo "0. 返回主菜单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
install_add_docker
;;
2)
clear
echo "Docker版本"
docker -v
docker compose version
echo ""
echo "Docker镜像列表"
docker image ls
echo ""
echo "Docker容器列表"
docker ps -a
echo ""
echo "Docker卷列表"
docker volume ls
echo ""
echo "Docker网络列表"
docker network ls
echo ""
;;
3)
while true; do
clear
echo "Docker容器列表"
docker ps -a
echo ""
echo "容器操作"
echo "------------------------"
echo "1. 创建新的容器"
echo "------------------------"
echo "2. 启动指定容器 6. 启动所有容器"
echo "3. 停止指定容器 7. 暂停所有容器"
echo "4. 删除指定容器 8. 删除所有容器"
echo "5. 重启指定容器 9. 重启所有容器"
echo "------------------------"
echo "11. 进入指定容器 12. 查看容器日志 13. 查看容器网络"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
read -p "请输入创建命令: " dockername
$dockername
;;
2)
read -p "请输入容器名: " dockername
docker start $dockername
;;
3)
read -p "请输入容器名: " dockername
docker stop $dockername
;;
4)
read -p "请输入容器名: " dockername
docker rm -f $dockername
;;
5)
read -p "请输入容器名: " dockername
docker restart $dockername
;;
6)
docker start $(docker ps -a -q)
;;
7)
docker stop $(docker ps -q)
;;
8)
read -p "$(echo -e "${hong}确定删除所有容器吗?(Y/N): ${bai}")" choice
case "$choice" in
[Yy])
docker rm -f $(docker ps -a -q)
;;
[Nn])
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
9)
docker restart $(docker ps -q)
;;
11)
read -p "请输入容器名: " dockername
docker exec -it $dockername /bin/sh
break_end
;;
12)
read -p "请输入容器名: " dockername
docker logs $dockername
break_end
;;
13)
echo ""
container_ids=$(docker ps -q)
echo "------------------------------------------------------------"
printf "%-25s %-25s %-25s\n" "容器名称" "网络名称" "IP地址"
for container_id in $container_ids; do
container_info=$(docker inspect --format '{{ .Name }}{{ range $network, $config := .NetworkSettings.Networks }} {{ $network }} {{ $config.IPAddress }}{{ end }}' "$container_id")
container_name=$(echo "$container_info" | awk '{print $1}')
network_info=$(echo "$container_info" | cut -d' ' -f2-)
while IFS= read -r line; do
network_name=$(echo "$line" | awk '{print $1}')
ip_address=$(echo "$line" | awk '{print $2}')
printf "%-20s %-20s %-15s\n" "$container_name" "$network_name" "$ip_address"
done <<< "$network_info"
done
break_end
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
4)
while true; do
clear
echo "Docker镜像列表"
docker image ls
echo ""
echo "镜像操作"
echo "------------------------"
echo "1. 获取指定镜像 3. 删除指定镜像"
echo "2. 更新指定镜像 4. 删除所有镜像"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
read -p "请输入镜像名: " dockername
docker pull $dockername
;;
2)
read -p "请输入镜像名: " dockername
docker pull $dockername
;;
3)
read -p "请输入镜像名: " dockername
docker rmi -f $dockername
;;
4)
read -p "$(echo -e "${hong}确定删除所有镜像吗?(Y/N): ${bai}")" choice
case "$choice" in
[Yy])
docker rmi -f $(docker images -q)
;;
[Nn])
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
5)
while true; do
clear
echo "Docker网络列表"
echo "------------------------------------------------------------"
docker network ls
echo ""
echo "------------------------------------------------------------"
container_ids=$(docker ps -q)
printf "%-25s %-25s %-25s\n" "容器名称" "网络名称" "IP地址"
for container_id in $container_ids; do
container_info=$(docker inspect --format '{{ .Name }}{{ range $network, $config := .NetworkSettings.Networks }} {{ $network }} {{ $config.IPAddress }}{{ end }}' "$container_id")
container_name=$(echo "$container_info" | awk '{print $1}')
network_info=$(echo "$container_info" | cut -d' ' -f2-)
while IFS= read -r line; do
network_name=$(echo "$line" | awk '{print $1}')
ip_address=$(echo "$line" | awk '{print $2}')
printf "%-20s %-20s %-15s\n" "$container_name" "$network_name" "$ip_address"
done <<< "$network_info"
done
echo ""
echo "网络操作"
echo "------------------------"
echo "1. 创建网络"
echo "2. 加入网络"
echo "3. 退出网络"
echo "4. 删除网络"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
read -p "设置新网络名: " dockernetwork
docker network create $dockernetwork
;;
2)
read -p "加入网络名: " dockernetwork
read -p "那些容器加入该网络: " dockername
docker network connect $dockernetwork $dockername
echo ""
;;
3)
read -p "退出网络名: " dockernetwork
read -p "那些容器退出该网络: " dockername
docker network disconnect $dockernetwork $dockername
echo ""
;;
4)
read -p "请输入要删除的网络名: " dockernetwork
docker network rm $dockernetwork
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
6)
while true; do
clear
echo "Docker卷列表"
docker volume ls
echo ""
echo "卷操作"
echo "------------------------"
echo "1. 创建新卷"
echo "2. 删除卷"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
read -p "设置新卷名: " dockerjuan
docker volume create $dockerjuan
;;
2)
read -p "输入删除卷名: " dockerjuan
docker volume rm $dockerjuan
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
7)
clear
read -p "$(echo -e "${huang}确定清理无用的镜像容器网络吗?(Y/N): ${bai}")" choice
case "$choice" in
[Yy])
docker system prune -af --volumes
;;
[Nn])
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
8)
clear
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
;;
9)
clear
install nano
mkdir -p /etc/docker && nano /etc/docker/daemon.json
if command -v dnf &>/dev/null || command -v yum &>/dev/null; then
systemctl restart docker
else
service docker restart
fi
;;
11)
clear
docker_ipv6_on
;;
12)
clear
docker_ipv6_off
;;
20)
clear
read -p "$(echo -e "${hong}确定卸载docker环境吗(Y/N): ${bai}")" choice
case "$choice" in
[Yy])
docker rm $(docker ps -a -q) && docker rmi $(docker images -q) && docker network prune
remove docker > /dev/null 2>&1
;;
[Nn])
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
0)
kejilion
;;
*)
echo "无效的输入!"
;;
esac
break_end
done
;;
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 https://raw.githubusercontent.com/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 https://raw.githubusercontent.com/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
;;
9)
while true; do
clear
echo "▶ 甲骨文云脚本合集"
echo "------------------------"
echo "1. 安装闲置机器活跃脚本"
echo "2. 卸载闲置机器活跃脚本"
echo "------------------------"
echo "3. DD重装系统脚本"
echo "4. R探长开机脚本"
echo "------------------------"
echo "5. 开启ROOT密码登录模式"
echo "------------------------"
echo "0. 返回主菜单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
echo "活跃脚本: CPU占用10-20% 内存占用20% "
read -p "确定安装吗?(Y/N): " choice
case "$choice" in
[Yy])
install_docker
docker run -itd --name=lookbusy --restart=always \
-e TZ=Asia/Shanghai \
-e CPU_UTIL=10-20 \
-e CPU_CORE=1 \
-e MEM_UTIL=20 \
-e SPEEDTEST_INTERVAL=120 \
fogforest/lookbusy
;;
[Nn])
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
2)
clear
docker rm -f lookbusy
docker rmi fogforest/lookbusy
;;
3)
clear
echo "请备份数据将为你重装系统预计花费15分钟。"
read -p "确定继续吗?(Y/N): " choice
case "$choice" in
[Yy])
while true; do
read -p "请选择要重装的系统: 1. Debian12 | 2. Ubuntu20.04 : " sys_choice
case "$sys_choice" in
1)
xitong="-d 12"
break # 结束循环
;;
2)
xitong="-u 20.04"
break # 结束循环
;;
*)
echo "无效的选择,请重新输入。"
;;
esac
done
read -p "请输入你重装后的密码: " vpspasswd
install wget
bash <(wget --no-check-certificate -qO- 'https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh') $xitong -v 64 -p $vpspasswd -port 22
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
4)
clear
echo "该功能处于开发阶段,敬请期待!"
;;
5)
clear
add_sshpasswd
;;
0)
kejilion
;;
*)
echo "无效的输入!"
;;
esac
break_end
done
;;
10)
while true; do
clear
echo -e "${huang}▶ LDNMP建站${bai}"
echo "------------------------"
echo "1. 安装LDNMP环境"
echo "------------------------"
echo "2. 安装WordPress"
echo "3. 安装Discuz论坛"
echo "4. 安装可道云桌面"
echo "5. 安装苹果CMS网站"
echo "6. 安装独角数发卡网"
echo "7. 安装flarum论坛网站"
echo "8. 安装typecho轻量博客网站"
echo "20. 自定义动态站点"
echo "------------------------"
echo "21. 仅安装nginx"
echo "22. 站点重定向"
echo "23. 站点反向代理-IP+端口"
echo "24. 站点反向代理-域名"
echo "25. 自定义静态站点"
echo "26. 安装Bitwarden密码管理平台"
echo "27. 安装Halo博客网站"
echo "------------------------"
echo "31. 站点数据管理"
echo "32. 备份全站数据"
echo "33. 定时远程备份"
echo "34. 还原全站数据"
echo "------------------------"
echo "35. 站点防御程序"
echo "------------------------"
echo "36. 优化LDNMP环境"
echo "37. 更新LDNMP环境"
echo "38. 卸载LDNMP环境"
echo "------------------------"
echo "0. 返回主菜单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
root_use
ldnmp_install_status_one
check_port
install_dependency
install_docker
install_certbot
# 创建必要的目录和文件
cd /home && mkdir -p web/html web/mysql web/certs web/conf.d web/redis web/log/nginx && touch web/docker-compose.yml
wget -O /home/web/nginx.conf https://raw.githubusercontent.com/kejilion/nginx/main/nginx10.conf
wget -O /home/web/conf.d/default.conf https://raw.githubusercontent.com/kejilion/nginx/main/default10.conf
default_server_ssl
# 下载 docker-compose.yml 文件并进行替换
wget -O /home/web/docker-compose.yml https://raw.githubusercontent.com/kejilion/docker/main/LNMP-docker-compose-10.yml
dbrootpasswd=$(openssl rand -base64 16) && dbuse=$(openssl rand -hex 4) && dbusepasswd=$(openssl rand -base64 8)
# 在 docker-compose.yml 文件中进行替换
sed -i "s#webroot#$dbrootpasswd#g" /home/web/docker-compose.yml
sed -i "s#kejilionYYDS#$dbusepasswd#g" /home/web/docker-compose.yml
sed -i "s#kejilion#$dbuse#g" /home/web/docker-compose.yml
install_ldnmp
;;
2)
clear
# wordpress
webname="WordPress"
ldnmp_install_status
add_yuming
install_ssltls
add_db
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/wordpress.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
cd /home/web/html
mkdir $yuming
cd $yuming
wget -O latest.zip https://cn.wordpress.org/latest-zh_CN.zip
unzip latest.zip
rm latest.zip
echo "define('FS_METHOD', 'direct'); define('WP_REDIS_HOST', 'redis'); define('WP_REDIS_PORT', '6379');" >> /home/web/html/$yuming/wordpress/wp-config-sample.php
restart_ldnmp
ldnmp_web_on
echo "数据库名: $dbname"
echo "用户名: $dbuse"
echo "密码: $dbusepasswd"
echo "数据库地址: mysql"
echo "表前缀: wp_"
nginx_status
;;
3)
clear
# Discuz论坛
webname="Discuz论坛"
ldnmp_install_status
add_yuming
install_ssltls
add_db
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/discuz.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
cd /home/web/html
mkdir $yuming
cd $yuming
wget -O latest.zip https://github.com/kejilion/Website_source_code/raw/main/Discuz_X3.5_SC_UTF8_20240520.zip
unzip latest.zip
rm latest.zip
restart_ldnmp
ldnmp_web_on
echo "数据库地址: mysql"
echo "数据库名: $dbname"
echo "用户名: $dbuse"
echo "密码: $dbusepasswd"
echo "表前缀: discuz_"
nginx_status
;;
4)
clear
# 可道云桌面
webname="可道云桌面"
ldnmp_install_status
add_yuming
install_ssltls
add_db
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/kdy.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
cd /home/web/html
mkdir $yuming
cd $yuming
wget -O latest.zip https://github.com/kalcaddle/kodbox/archive/refs/tags/1.50.02.zip
unzip -o latest.zip
rm latest.zip
restart_ldnmp
ldnmp_web_on
echo "数据库地址: mysql"
echo "用户名: $dbuse"
echo "密码: $dbusepasswd"
echo "数据库名: $dbname"
echo "redis主机: redis"
nginx_status
;;
5)
clear
# 苹果CMS
webname="苹果CMS"
ldnmp_install_status
add_yuming
install_ssltls
add_db
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/maccms.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
cd /home/web/html
mkdir $yuming
cd $yuming
# wget https://github.com/magicblack/maccms_down/raw/master/maccms10.zip && unzip maccms10.zip && rm maccms10.zip
wget https://github.com/magicblack/maccms_down/raw/master/maccms10.zip && unzip maccms10.zip && mv maccms10-*/* . && rm -r maccms10-* && rm maccms10.zip
cd /home/web/html/$yuming/template/ && wget https://github.com/kejilion/Website_source_code/raw/main/DYXS2.zip && unzip DYXS2.zip && rm /home/web/html/$yuming/template/DYXS2.zip
cp /home/web/html/$yuming/template/DYXS2/asset/admin/Dyxs2.php /home/web/html/$yuming/application/admin/controller
cp /home/web/html/$yuming/template/DYXS2/asset/admin/dycms.html /home/web/html/$yuming/application/admin/view/system
mv /home/web/html/$yuming/admin.php /home/web/html/$yuming/vip.php && wget -O /home/web/html/$yuming/application/extra/maccms.php https://raw.githubusercontent.com/kejilion/Website_source_code/main/maccms.php
restart_ldnmp
ldnmp_web_on
echo "数据库地址: mysql"
echo "数据库端口: 3306"
echo "数据库名: $dbname"
echo "用户名: $dbuse"
echo "密码: $dbusepasswd"
echo "数据库前缀: mac_"
echo "------------------------"
echo "安装成功后登录后台地址"
echo "https://$yuming/vip.php"
nginx_status
;;
6)
clear
# 独脚数卡
webname="独脚数卡"
ldnmp_install_status
add_yuming
install_ssltls
add_db
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/dujiaoka.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
cd /home/web/html
mkdir $yuming
cd $yuming
wget https://github.com/assimon/dujiaoka/releases/download/2.0.6/2.0.6-antibody.tar.gz && tar -zxvf 2.0.6-antibody.tar.gz && rm 2.0.6-antibody.tar.gz
restart_ldnmp
ldnmp_web_on
echo "数据库地址: mysql"
echo "数据库端口: 3306"
echo "数据库名: $dbname"
echo "用户名: $dbuse"
echo "密码: $dbusepasswd"
echo ""
echo "redis地址: redis"
echo "redis密码: 默认不填写"
echo "redis端口: 6379"
echo ""
echo "网站url: https://$yuming"
echo "后台登录路径: /admin"
echo "------------------------"
echo "用户名: admin"
echo "密码: admin"
echo "------------------------"
echo "登录时右上角如果出现红色error0请使用如下命令: "
echo "我也很气愤独角数卡为啥这么麻烦,会有这样的问题!"
echo "sed -i 's/ADMIN_HTTPS=false/ADMIN_HTTPS=true/g' /home/web/html/$yuming/dujiaoka/.env"
nginx_status
;;
7)
clear
# flarum论坛
webname="flarum论坛"
ldnmp_install_status
add_yuming
install_ssltls
add_db
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/flarum.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
cd /home/web/html
mkdir $yuming
cd $yuming
docker exec php sh -c "php -r \"copy('https://getcomposer.org/installer', 'composer-setup.php');\""
docker exec php sh -c "php composer-setup.php"
docker exec php sh -c "php -r \"unlink('composer-setup.php');\""
docker exec php sh -c "mv composer.phar /usr/local/bin/composer"
docker exec php composer create-project flarum/flarum /var/www/html/$yuming
docker exec php sh -c "cd /var/www/html/$yuming && composer require flarum-lang/chinese-simplified"
docker exec php sh -c "cd /var/www/html/$yuming && composer require fof/polls"
restart_ldnmp
ldnmp_web_on
echo "数据库地址: mysql"
echo "数据库名: $dbname"
echo "用户名: $dbuse"
echo "密码: $dbusepasswd"
echo "表前缀: flarum_"
echo "管理员信息自行设置"
nginx_status
;;
8)
clear
# typecho
webname="typecho"
ldnmp_install_status
add_yuming
install_ssltls
add_db
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/typecho.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
cd /home/web/html
mkdir $yuming
cd $yuming
wget -O latest.zip https://github.com/typecho/typecho/releases/latest/download/typecho.zip
unzip latest.zip
rm latest.zip
restart_ldnmp
clear
ldnmp_web_on
echo "数据库前缀: typecho_"
echo "数据库地址: mysql"
echo "用户名: $dbuse"
echo "密码: $dbusepasswd"
echo "数据库名: $dbname"
nginx_status
;;
20)
clear
webname="PHP动态站点"
ldnmp_install_status
add_yuming
install_ssltls
add_db
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/index_php.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
cd /home/web/html
mkdir $yuming
cd $yuming
clear
echo -e "[${huang}1/6${bai}] 上传PHP源码"
echo "-------------"
echo "目前只允许上传zip格式的源码包请将源码包放到/home/web/html/${yuming}目录下"
read -p "也可以输入下载链接,远程下载源码包,直接回车将跳过远程下载: " url_download
if [ -n "$url_download" ]; then
wget "$url_download"
fi
unzip $(ls -t *.zip | head -n 1)
rm -f $(ls -t *.zip | head -n 1)
clear
echo -e "[${huang}2/6${bai}] index.php所在路径"
echo "-------------"
find "$(realpath .)" -name "index.php" -print
read -p "请输入index.php的路径类似/home/web/html/$yuming/wordpress/ " index_lujing
sed -i "s#root /var/www/html/$yuming/#root $index_lujing#g" /home/web/conf.d/$yuming.conf
sed -i "s#/home/web/#/var/www/#g" /home/web/conf.d/$yuming.conf
clear
echo -e "[${huang}3/6${bai}] 请选择PHP版本"
echo "-------------"
read -p "1. php最新版 | 2. php7.4 : " pho_v
case "$pho_v" in
1)
sed -i "s#php:9000#php:9000#g" /home/web/conf.d/$yuming.conf
PHP_Version="php"
;;
2)
sed -i "s#php:9000#php74:9000#g" /home/web/conf.d/$yuming.conf
PHP_Version="php74"
;;
*)
echo "无效的选择,请重新输入。"
;;
esac
clear
echo -e "[${huang}4/6${bai}] 安装指定扩展"
echo "-------------"
echo "已经安装的扩展"
docker exec php php -m
read -p "$(echo -e "输入需要安装的扩展名称,如 ${huang}SourceGuardian imap ftp${bai} 等等。直接回车将跳过安装 ")" php_extensions
if [ -n "$php_extensions" ]; then
docker exec $PHP_Version install-php-extensions $php_extensions
fi
clear
echo -e "[${huang}5/6${bai}] 编辑站点配置"
echo "-------------"
echo "按任意键继续,可以详细设置站点配置,如伪静态等内容"
read -n 1 -s -r -p ""
install nano
nano /home/web/conf.d/$yuming.conf
clear
echo -e "[${huang}6/6${bai}] 数据库管理"
echo "-------------"
read -p "1. 我搭建新站 2. 我搭建老站有数据库备份: " use_db
case $use_db in
1)
echo
;;
2)
echo "数据库备份必须是.gz结尾的压缩包。请放到/home/目录下,支持宝塔/1panel备份数据导入。"
read -p "也可以输入下载链接,远程下载备份数据,直接回车将跳过远程下载: " url_download_db
cd /home/
if [ -n "$url_download_db" ]; then
wget "$url_download_db"
fi
gunzip $(ls -t *.gz | head -n 1)
latest_sql=$(ls -t *.sql | head -n 1)
dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
docker exec -i mysql mysql -u root -p"$dbrootpasswd" $dbname < "/home/$latest_sql"
echo "数据库导入的表数据"
docker exec -i mysql mysql -u root -p"$dbrootpasswd" -e "USE $dbname; SHOW TABLES;"
rm -f *.sql
echo "数据库导入完成"
;;
*)
echo
;;
esac
restart_ldnmp
ldnmp_web_on
prefix="web$(shuf -i 10-99 -n 1)_"
echo "数据库地址: mysql"
echo "数据库名: $dbname"
echo "用户名: $dbuse"
echo "密码: $dbusepasswd"
echo "表前缀: $prefix"
echo "管理员登录信息自行设置"
nginx_status
;;
21)
root_use
check_port
install_dependency
install_docker
install_certbot
cd /home && mkdir -p web/html web/mysql web/certs web/conf.d web/redis web/log/nginx && touch web/docker-compose.yml
wget -O /home/web/nginx.conf https://raw.githubusercontent.com/kejilion/nginx/main/nginx10.conf
wget -O /home/web/conf.d/default.conf https://raw.githubusercontent.com/kejilion/nginx/main/default10.conf
default_server_ssl
docker rm -f nginx >/dev/null 2>&1
docker rmi nginx nginx:alpine >/dev/null 2>&1
docker run -d --name nginx --restart always -p 80:80 -p 443:443 -p 443:443/udp -v /home/web/nginx.conf:/etc/nginx/nginx.conf -v /home/web/conf.d:/etc/nginx/conf.d -v /home/web/certs:/etc/nginx/certs -v /home/web/html:/var/www/html -v /home/web/log/nginx:/var/log/nginx nginx:alpine
clear
nginx_version=$(docker exec nginx nginx -v 2>&1)
nginx_version=$(echo "$nginx_version" | grep -oP "nginx/\K[0-9]+\.[0-9]+\.[0-9]+")
echo "nginx已安装完成"
echo -e "当前版本: ${huang}v$nginx_version${bai}"
echo ""
;;
22)
clear
webname="站点重定向"
nginx_install_status
ip_address
add_yuming
read -p "请输入跳转域名: " reverseproxy
install_ssltls
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/rewrite.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
sed -i "s/baidu.com/$reverseproxy/g" /home/web/conf.d/$yuming.conf
docker restart nginx
nginx_web_on
nginx_status
;;
23)
clear
webname="反向代理-IP+端口"
nginx_install_status
ip_address
add_yuming
read -p "请输入你的反代IP: " reverseproxy
read -p "请输入你的反代端口: " port
install_ssltls
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/reverse-proxy.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
sed -i "s/0.0.0.0/$reverseproxy/g" /home/web/conf.d/$yuming.conf
sed -i "s/0000/$port/g" /home/web/conf.d/$yuming.conf
docker restart nginx
nginx_web_on
nginx_status
;;
24)
clear
webname="反向代理-域名"
nginx_install_status
ip_address
add_yuming
echo -e "域名格式: ${huang}http://www.google.com${bai}"
read -p "请输入你的反代域名: " fandai_yuming
install_ssltls
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/reverse-proxy-domain.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
sed -i "s|fandaicom|$fandai_yuming|g" /home/web/conf.d/$yuming.conf
docker restart nginx
nginx_web_on
nginx_status
;;
25)
clear
webname="静态站点"
nginx_install_status
add_yuming
install_ssltls
wget -O /home/web/conf.d/$yuming.conf https://raw.githubusercontent.com/kejilion/nginx/main/html.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
cd /home/web/html
mkdir $yuming
cd $yuming
clear
echo -e "[${huang}1/2${bai}] 上传静态源码"
echo "-------------"
echo "目前只允许上传zip格式的源码包请将源码包放到/home/web/html/${yuming}目录下"
read -p "也可以输入下载链接,远程下载源码包,直接回车将跳过远程下载: " url_download
if [ -n "$url_download" ]; then
wget "$url_download"
fi
unzip $(ls -t *.zip | head -n 1)
rm -f $(ls -t *.zip | head -n 1)
clear
echo -e "[${huang}2/2${bai}] index.html所在路径"
echo "-------------"
find "$(realpath .)" -name "index.html" -print
read -p "请输入index.html的路径类似/home/web/html/$yuming/index/ " index_lujing
sed -i "s#root /var/www/html/$yuming/#root $index_lujing#g" /home/web/conf.d/$yuming.conf
sed -i "s#/home/web/#/var/www/#g" /home/web/conf.d/$yuming.conf
docker exec nginx chmod -R 777 /var/www/html
docker restart nginx
nginx_web_on
nginx_status
;;
26)
clear
webname="Bitwarden"
nginx_install_status
add_yuming
install_ssltls
docker run -d \
--name bitwarden \
--restart always \
-p 3280:80 \
-v /home/web/html/$yuming/bitwarden/data:/data \
vaultwarden/server
duankou=3280
reverse_proxy
nginx_web_on
nginx_status
;;
27)
clear
webname="halo"
nginx_install_status
add_yuming
install_ssltls
docker run -d --name halo --restart always -p 8010:8090 -v /home/web/html/$yuming/.halo2:/root/.halo2 halohub/halo:2
duankou=8010
reverse_proxy
nginx_web_on
nginx_status
;;
31)
root_use
while true; do
clear
echo "LDNMP环境"
echo "------------------------"
ldnmp_v
# ls -t /home/web/conf.d | sed 's/\.[^.]*$//'
echo "站点信息 证书到期时间"
echo "------------------------"
for cert_file in /home/web/certs/*_cert.pem; do
domain=$(basename "$cert_file" | sed 's/_cert.pem//')
if [ -n "$domain" ]; then
expire_date=$(openssl x509 -noout -enddate -in "$cert_file" | awk -F'=' '{print $2}')
formatted_date=$(date -d "$expire_date" '+%Y-%m-%d')
printf "%-30s%s\n" "$domain" "$formatted_date"
fi
done
echo "------------------------"
echo ""
echo "数据库信息"
echo "------------------------"
dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
docker exec mysql mysql -u root -p"$dbrootpasswd" -e "SHOW DATABASES;" 2> /dev/null | grep -Ev "Database|information_schema|mysql|performance_schema|sys"
echo "------------------------"
echo ""
echo "站点目录"
echo "------------------------"
echo -e "数据 ${hui}/home/web/html${bai} 证书 ${hui}/home/web/certs${bai} 配置 ${hui}/home/web/conf.d${bai}"
echo "------------------------"
echo ""
echo "操作"
echo "------------------------"
echo "1. 申请/更新域名证书"
echo "3. 清理站点缓存 4. 查看站点分析报告"
echo "5. 编辑全局配置 6. 编辑站点配置"
echo "------------------------"
echo "7. 删除指定站点 8. 删除指定数据库"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
read -p "请输入你的域名: " yuming
install_ssltls
;;
2)
read -p "请输入旧域名: " oddyuming
read -p "请输入新域名: " yuming
install_ssltls
mv /home/web/conf.d/$oddyuming.conf /home/web/conf.d/$yuming.conf
sed -i "s/$oddyuming/$yuming/g" /home/web/conf.d/$yuming.conf
mv /home/web/html/$oddyuming /home/web/html/$yuming
rm /home/web/certs/${oddyuming}_key.pem
rm /home/web/certs/${oddyuming}_cert.pem
docker restart nginx
;;
3)
# docker exec -it nginx rm -rf /var/cache/nginx
docker restart nginx
docker exec php php -r 'opcache_reset();'
docker restart php
docker exec php74 php -r 'opcache_reset();'
docker restart php74
docker restart redis
docker exec redis redis-cli FLUSHALL
docker exec -it redis redis-cli CONFIG SET maxmemory 512mb
docker exec -it redis redis-cli CONFIG SET maxmemory-policy allkeys-lru
;;
4)
install goaccess
goaccess --log-format=COMBINED /home/web/log/nginx/access.log
;;
5)
install nano
nano /home/web/nginx.conf
docker restart nginx
;;
6)
read -p "编辑站点配置,请输入你要编辑的域名: " yuming
install nano
nano /home/web/conf.d/$yuming.conf
docker restart nginx
;;
7)
read -p "删除站点数据目录,请输入你的域名: " yuming
rm -r /home/web/html/$yuming
rm /home/web/conf.d/$yuming.conf
rm /home/web/certs/${yuming}_key.pem
rm /home/web/certs/${yuming}_cert.pem
docker restart nginx
;;
8)
read -p "删除站点数据库,请输入数据库名: " shujuku
dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
docker exec mysql mysql -u root -p"$dbrootpasswd" -e "DROP DATABASE $shujuku;" 2> /dev/null
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
32)
clear
cd /home/ && tar czvf web_$(date +"%Y%m%d%H%M%S").tar.gz web
while true; do
clear
read -p "要传送文件到远程服务器吗?(Y/N): " choice
case "$choice" in
[Yy])
read -p "请输入远端服务器IP: " remote_ip
if [ -z "$remote_ip" ]; then
echo "错误: 请输入远端服务器IP。"
continue
fi
latest_tar=$(ls -t /home/*.tar.gz | head -1)
if [ -n "$latest_tar" ]; then
ssh-keygen -f "/root/.ssh/known_hosts" -R "$remote_ip"
sleep 2 # 添加等待时间
scp -o StrictHostKeyChecking=no "$latest_tar" "root@$remote_ip:/home/"
echo "文件已传送至远程服务器home目录。"
else
echo "未找到要传送的文件。"
fi
break
;;
[Nn])
break
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
done
;;
33)
clear
read -p "输入远程服务器IP: " useip
read -p "输入远程服务器密码: " usepasswd
cd ~
wget -O ${useip}_beifen.sh https://raw.githubusercontent.com/kejilion/sh/main/beifen.sh > /dev/null 2>&1
chmod +x ${useip}_beifen.sh
sed -i "s/0.0.0.0/$useip/g" ${useip}_beifen.sh
sed -i "s/123456/$usepasswd/g" ${useip}_beifen.sh
echo "------------------------"
echo "1. 每周备份 2. 每天备份"
read -p "请输入你的选择: " dingshi
case $dingshi in
1)
read -p "选择每周备份的星期几 (0-60代表星期日): " weekday
(crontab -l ; echo "0 0 * * $weekday ./${useip}_beifen.sh") | crontab - > /dev/null 2>&1
;;
2)
read -p "选择每天备份的时间小时0-23: " hour
(crontab -l ; echo "0 $hour * * * ./${useip}_beifen.sh") | crontab - > /dev/null 2>&1
;;
*)
break # 跳出
;;
esac
install sshpass
;;
34)
root_use
echo "请确认home目录中已经放置网站备份的gz压缩包按任意键继续……"
read -n 1 -s -r -p ""
echo "开始解压……"
cd /home/ && ls -t /home/*.tar.gz | head -1 | xargs -I {} tar -xzf {}
check_port
install_dependency
install_docker
install_certbot
install_ldnmp
;;
35)
if docker inspect fail2ban &>/dev/null ; then
while true; do
clear
echo "服务器防御程序已启动"
echo "------------------------"
echo "1. 开启SSH防暴力破解 2. 关闭SSH防暴力破解"
echo "3. 开启网站保护 4. 关闭网站保护"
echo "------------------------"
echo "5. 查看SSH拦截记录 6. 查看网站拦截记录"
echo "7. 查看防御规则列表 8. 查看日志实时监控"
echo "------------------------"
echo "11. 配置拦截参数"
echo "------------------------"
echo "21. cloudflare模式 22. 高负载开启5秒盾"
echo "------------------------"
echo "9. 卸载防御程序"
echo "------------------------"
echo "0. 退出"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
sed -i 's/false/true/g' /path/to/fail2ban/config/fail2ban/jail.d/alpine-ssh.conf
sed -i 's/false/true/g' /path/to/fail2ban/config/fail2ban/jail.d/linux-ssh.conf
sed -i 's/false/true/g' /path/to/fail2ban/config/fail2ban/jail.d/centos-ssh.conf
f2b_status
;;
2)
sed -i 's/true/false/g' /path/to/fail2ban/config/fail2ban/jail.d/alpine-ssh.conf
sed -i 's/true/false/g' /path/to/fail2ban/config/fail2ban/jail.d/linux-ssh.conf
sed -i 's/true/false/g' /path/to/fail2ban/config/fail2ban/jail.d/centos-ssh.conf
f2b_status
;;
3)
sed -i 's/false/true/g' /path/to/fail2ban/config/fail2ban/jail.d/nginx-docker-cc.conf
f2b_status
;;
4)
sed -i 's/true/false/g' /path/to/fail2ban/config/fail2ban/jail.d/nginx-docker-cc.conf
f2b_status
;;
5)
echo "------------------------"
f2b_sshd
echo "------------------------"
;;
6)
echo "------------------------"
xxx=fail2ban-nginx-cc
f2b_status_xxx
echo "------------------------"
xxx=docker-nginx-bad-request
f2b_status_xxx
echo "------------------------"
xxx=docker-nginx-botsearch
f2b_status_xxx
echo "------------------------"
xxx=docker-nginx-http-auth
f2b_status_xxx
echo "------------------------"
xxx=docker-nginx-limit-req
f2b_status_xxx
echo "------------------------"
xxx=docker-php-url-fopen
f2b_status_xxx
echo "------------------------"
;;
7)
docker exec -it fail2ban fail2ban-client status
;;
8)
tail -f /path/to/fail2ban/config/log/fail2ban/fail2ban.log
;;
9)
docker rm -f fail2ban
rm -rf /path/to/fail2ban
crontab -l | grep -v "CF-Under-Attack.sh" | crontab - 2>/dev/null
echo "Fail2Ban防御程序已卸载"
break
;;
11)
install nano
nano /path/to/fail2ban/config/fail2ban/jail.d/nginx-docker-cc.conf
f2b_status
break
;;
21)
echo "到cf后台右上角我的个人资料选择左侧API令牌获取Global API Key"
echo "https://dash.cloudflare.com/login"
read -p "输入CF的账号: " cfuser
read -p "输入CF的Global API Key: " cftoken
wget -O /home/web/conf.d/default.conf https://raw.githubusercontent.com/kejilion/nginx/main/default11.conf
docker restart nginx
cd /path/to/fail2ban/config/fail2ban/jail.d/
curl -sS -O https://raw.githubusercontent.com/kejilion/config/main/fail2ban/nginx-docker-cc.conf
cd /path/to/fail2ban/config/fail2ban/action.d
curl -sS -O https://raw.githubusercontent.com/kejilion/config/main/fail2ban/cloudflare-docker.conf
sed -i "s/kejilion@outlook.com/$cfuser/g" /path/to/fail2ban/config/fail2ban/action.d/cloudflare-docker.conf
sed -i "s/APIKEY00000/$cftoken/g" /path/to/fail2ban/config/fail2ban/action.d/cloudflare-docker.conf
f2b_status
echo "已配置cloudflare模式可在cf后台站点-安全性-事件中查看拦截记录"
;;
22)
echo -e "${huang}网站每5分钟自动检测当达检测到高负载会自动开盾低负载也会自动关闭5秒盾。${bai}"
echo "--------------"
echo "获取CF参数: "
echo -e "到cf后台右上角我的个人资料选择左侧API令牌获取${huang}Global API Key${bai}"
echo -e "到cf后台域名概要页面右下方获取${huang}区域ID${bai}"
echo "https://dash.cloudflare.com/login"
echo "--------------"
read -p "输入CF的账号: " cfuser
read -p "输入CF的Global API Key: " cftoken
read -p "输入CF中域名的区域ID: " cfzonID
cd ~
install jq bc
curl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/CF-Under-Attack.sh
chmod +x CF-Under-Attack.sh
sed -i "s/AAAA/$cfuser/g" ~/CF-Under-Attack.sh
sed -i "s/BBBB/$cftoken/g" ~/CF-Under-Attack.sh
sed -i "s/CCCC/$cfzonID/g" ~/CF-Under-Attack.sh
cron_job="*/5 * * * * ~/CF-Under-Attack.sh"
existing_cron=$(crontab -l 2>/dev/null | grep -F "$cron_job")
if [ -z "$existing_cron" ]; then
(crontab -l 2>/dev/null; echo "$cron_job") | crontab -
echo "高负载自动开盾脚本已添加"
else
echo "自动开盾脚本已存在,无需添加"
fi
;;
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
install_docker
docker rm -f nginx
wget -O /home/web/nginx.conf https://raw.githubusercontent.com/kejilion/nginx/main/nginx10.conf
wget -O /home/web/conf.d/default.conf https://raw.githubusercontent.com/kejilion/nginx/main/default10.conf
default_server_ssl
docker run -d --name nginx --restart always --network web_default -p 80:80 -p 443:443 -p 443:443/udp -v /home/web/nginx.conf:/etc/nginx/nginx.conf -v /home/web/conf.d:/etc/nginx/conf.d -v /home/web/certs:/etc/nginx/certs -v /home/web/html:/var/www/html -v /home/web/log/nginx:/var/log/nginx nginx:alpine
docker exec -it nginx chmod -R 777 /var/www/html
f2b_install_sshd
cd /path/to/fail2ban/config/fail2ban/filter.d
curl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/fail2ban-nginx-cc.conf
cd /path/to/fail2ban/config/fail2ban/jail.d/
curl -sS -O https://raw.githubusercontent.com/kejilion/config/main/fail2ban/nginx-docker-cc.conf
sed -i "/cloudflare/d" /path/to/fail2ban/config/fail2ban/jail.d/nginx-docker-cc.conf
cd ~
f2b_status
echo "防御程序已开启"
fi
;;
36)
while true; do
clear
echo "优化LDNMP环境"
echo "------------------------"
echo "1. 标准模式 2. 高性能模式 (推荐2H2G以上)"
echo "------------------------"
echo "0. 退出"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
# nginx调优
sed -i 's/worker_connections.*/worker_connections 1024;/' /home/web/nginx.conf
# php调优
wget -O /home/optimized_php.ini https://raw.githubusercontent.com/kejilion/sh/main/optimized_php.ini
docker cp /home/optimized_php.ini php:/usr/local/etc/php/conf.d/optimized_php.ini
docker cp /home/optimized_php.ini php74:/usr/local/etc/php/conf.d/optimized_php.ini
rm -rf /home/optimized_php.ini
# php调优
wget -O /home/www.conf https://raw.githubusercontent.com/kejilion/sh/main/www-1.conf
docker cp /home/www.conf php:/usr/local/etc/php-fpm.d/www.conf
docker cp /home/www.conf php74:/usr/local/etc/php-fpm.d/www.conf
rm -rf /home/www.conf
# mysql调优
wget -O /home/custom_mysql_config.cnf https://raw.githubusercontent.com/kejilion/sh/main/custom_mysql_config-1.cnf
docker cp /home/custom_mysql_config.cnf mysql:/etc/mysql/conf.d/
rm -rf /home/custom_mysql_config.cnf
docker exec -it redis redis-cli CONFIG SET maxmemory 512mb
docker exec -it redis redis-cli CONFIG SET maxmemory-policy allkeys-lru
docker restart nginx
docker restart php
docker restart php74
docker restart mysql
echo "LDNMP环境已设置成 标准模式"
;;
2)
# nginx调优
sed -i 's/worker_connections.*/worker_connections 10240;/' /home/web/nginx.conf
# php调优
wget -O /home/www.conf https://raw.githubusercontent.com/kejilion/sh/main/www.conf
docker cp /home/www.conf php:/usr/local/etc/php-fpm.d/www.conf
docker cp /home/www.conf php74:/usr/local/etc/php-fpm.d/www.conf
rm -rf /home/www.conf
# mysql调优
wget -O /home/custom_mysql_config.cnf https://raw.githubusercontent.com/kejilion/sh/main/custom_mysql_config.cnf
docker cp /home/custom_mysql_config.cnf mysql:/etc/mysql/conf.d/
rm -rf /home/custom_mysql_config.cnf
docker exec -it redis redis-cli CONFIG SET maxmemory 1024mb
docker exec -it redis redis-cli CONFIG SET maxmemory-policy allkeys-lru
docker restart nginx
docker restart php
docker restart php74
docker restart mysql
echo "LDNMP环境已设置成 高性能模式"
;;
0)
break
;;
*)
echo "无效的选择,请重新输入。"
;;
esac
break_end
done
;;
37)
root_use
docker rm -f nginx php php74 mysql redis
docker rmi nginx nginx:alpine php:fpm php:fpm-alpine php:7.4.33-fpm php:7.4-fpm-alpine mysql redis redis:alpine
check_port
install_dependency
install_docker
install_ldnmp
;;
38)
root_use
read -p "$(echo -e "${hong}强烈建议先备份全部网站数据再卸载LDNMP环境。确定删除所有网站数据吗(Y/N): ${bai}")" choice
case "$choice" in
[Yy])
docker rm -f nginx php php74 mysql redis
docker rmi nginx nginx:alpine php:fpm php:fpm-alpine php:7.4.33-fpm php:7.4-fpm-alpine mysql redis redis:alpine
rm -rf /home/web
;;
[Nn])
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
0)
kejilion
;;
*)
echo "无效的输入!"
esac
break_end
done
;;
11)
while true; do
clear
echo "▶ 面板工具"
echo "------------------------"
echo "1. 宝塔面板官方版 2. aaPanel宝塔国际版"
echo "3. 1Panel新一代管理面板 4. NginxProxyManager可视化面板"
echo "5. AList多存储文件列表程序 6. Ubuntu远程桌面网页版"
echo "7. 哪吒探针VPS监控面板 8. QB离线BT磁力下载面板"
echo "9. Poste.io邮件服务器程序 10. RocketChat多人在线聊天系统"
echo "------------------------"
echo "11. 禅道项目管理软件 12. 青龙面板定时任务管理平台"
echo "13. Cloudreve网盘 14. 简单图床图片管理程序"
echo "15. emby多媒体管理系统 16. Speedtest测速面板"
echo "17. AdGuardHome去广告软件 18. onlyoffice在线办公OFFICE"
echo "19. 雷池WAF防火墙面板 20. portainer容器管理面板"
echo "------------------------"
echo "21. VScode网页版 22. UptimeKuma监控工具"
echo "23. Memos网页备忘录 24. Webtop远程桌面网页版"
echo "25. Nextcloud网盘 26. QD-Today定时任务管理框架"
echo "27. Dockge容器堆栈管理面板 28. LibreSpeed测速工具"
echo "29. searxng聚合搜索站 30. PhotoPrism私有相册系统"
echo "------------------------"
echo "31. StirlingPDF工具大全 32. drawio免费的在线图表软件"
echo "33. Sun-Panel导航面板 34. Pingvin-Share文件分享平台"
echo "35. 极简朋友圈 36. LobeChatAI聊天聚合网站"
echo "37. MyIP工具箱 38. 小雅alist全家桶"
echo "------------------------"
echo "51. PVE开小鸡面板"
echo "------------------------"
echo "0. 返回主菜单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
lujing="[ -d "/www/server/panel" ]"
panelname="宝塔面板"
gongneng1="bt"
gongneng1_1=""
gongneng2="curl -o bt-uninstall.sh http://download.bt.cn/install/bt-uninstall.sh > /dev/null 2>&1 && chmod +x bt-uninstall.sh && ./bt-uninstall.sh"
gongneng2_1="chmod +x bt-uninstall.sh"
gongneng2_2="./bt-uninstall.sh"
panelurl="https://www.bt.cn/new/index.html"
centos_mingling="wget -O install.sh https://download.bt.cn/install/install_6.0.sh"
centos_mingling2="sh install.sh ed8484bec"
ubuntu_mingling="wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh"
ubuntu_mingling2="bash install.sh ed8484bec"
install_panel
;;
2)
lujing="[ -d "/www/server/panel" ]"
panelname="aapanel"
gongneng1="bt"
gongneng1_1=""
gongneng2="curl -o bt-uninstall.sh http://download.bt.cn/install/bt-uninstall.sh > /dev/null 2>&1 && chmod +x bt-uninstall.sh && ./bt-uninstall.sh"
gongneng2_1="chmod +x bt-uninstall.sh"
gongneng2_2="./bt-uninstall.sh"
panelurl="https://www.aapanel.com/new/index.html"
centos_mingling="wget -O install.sh http://www.aapanel.com/script/install_6.0_en.sh"
centos_mingling2="bash install.sh aapanel"
ubuntu_mingling="wget -O install.sh http://www.aapanel.com/script/install-ubuntu_6.0_en.sh"
ubuntu_mingling2="bash install.sh aapanel"
install_panel
;;
3)
lujing="command -v 1pctl &> /dev/null"
panelname="1Panel"
gongneng1="1pctl user-info"
gongneng1_1="1pctl update password"
gongneng2="1pctl uninstall"
gongneng2_1=""
gongneng2_2=""
panelurl="https://1panel.cn/"
centos_mingling="curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh"
centos_mingling2="sh quick_start.sh"
ubuntu_mingling="curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh"
ubuntu_mingling2="bash quick_start.sh"
install_panel
;;
4)
docker_name="npm"
docker_img="jc21/nginx-proxy-manager:latest"
docker_port=81
docker_rum="docker run -d \
--name=$docker_name \
-p 80:80 \
-p 81:$docker_port \
-p 443:443 \
-v /home/docker/npm/data:/data \
-v /home/docker/npm/letsencrypt:/etc/letsencrypt \
--restart=always \
$docker_img"
docker_describe="如果您已经安装了其他面板工具或者LDNMP建站环境建议先卸载再安装npm"
docker_url="官网介绍: https://nginxproxymanager.com/"
docker_use="echo \"初始用户名: admin@example.com\""
docker_passwd="echo \"初始密码: changeme\""
docker_app
;;
5)
docker_name="alist"
docker_img="xhofe/alist:latest"
docker_port=5244
docker_rum="docker run -d \
--restart=always \
-v /home/docker/alist:/opt/alist/data \
-p 5244:5244 \
-e PUID=0 \
-e PGID=0 \
-e UMASK=022 \
--name="alist" \
xhofe/alist:latest"
docker_describe="一个支持多种存储,支持网页浏览和 WebDAV 的文件列表程序,由 gin 和 Solidjs 驱动"
docker_url="官网介绍: https://alist.nn.ci/zh/"
docker_use="docker exec -it alist ./alist admin random"
docker_passwd=""
docker_app
;;
6)
docker_name="ubuntu-novnc"
docker_img="fredblgr/ubuntu-novnc:20.04"
docker_port=6080
rootpasswd=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c16)
docker_rum="docker run -d \
--name ubuntu-novnc \
-p 6080:80 \
-v /home/docker/ubuntu-novnc:/workspace:rw \
-e HTTP_PASSWORD=$rootpasswd \
-e RESOLUTION=1280x720 \
--restart=always \
fredblgr/ubuntu-novnc:20.04"
docker_describe="一个网页版Ubuntu远程桌面挺好用的"
docker_url="官网介绍: https://hub.docker.com/r/fredblgr/ubuntu-novnc"
docker_use="echo \"用户名: root\""
docker_passwd="echo \"密码: $rootpasswd\""
docker_app
;;
7)
clear
curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh -o nezha.sh && chmod +x nezha.sh
./nezha.sh
;;
8)
docker_name="qbittorrent"
docker_img="lscr.io/linuxserver/qbittorrent:latest"
docker_port=8081
docker_rum="docker run -d \
--name=qbittorrent \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e WEBUI_PORT=8081 \
-p 8081:8081 \
-p 6881:6881 \
-p 6881:6881/udp \
-v /home/docker/qbittorrent/config:/config \
-v /home/docker/qbittorrent/downloads:/downloads \
--restart unless-stopped \
lscr.io/linuxserver/qbittorrent:latest"
docker_describe="qbittorrent离线BT磁力下载服务"
docker_url="官网介绍: https://hub.docker.com/r/linuxserver/qbittorrent"
docker_use="sleep 3"
docker_passwd="docker logs qbittorrent"
docker_app
;;
9)
if docker inspect mailserver &>/dev/null; then
clear
echo "poste.io已安装访问地址: "
yuming=$(cat /home/docker/mail.txt)
echo "https://$yuming"
echo ""
echo "应用操作"
echo "------------------------"
echo "1. 更新应用 2. 卸载应用"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
docker rm -f mailserver
docker rmi -f analogic/poste.io
yuming=$(cat /home/docker/mail.txt)
docker run \
--net=host \
-e TZ=Europe/Prague \
-v /home/docker/mail:/data \
--name "mailserver" \
-h "$yuming" \
--restart=always \
-d analogic/poste.io
clear
echo "poste.io已经安装完成"
echo "------------------------"
echo "您可以使用以下地址访问poste.io:"
echo "https://$yuming"
echo ""
;;
2)
clear
docker rm -f mailserver
docker rmi -f analogic/poste.io
rm /home/docker/mail.txt
rm -rf /home/docker/mail
echo "应用已卸载"
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
else
clear
install telnet
clear
echo ""
echo "端口检测"
port=25
timeout=3
if echo "quit" | timeout $timeout telnet smtp.qq.com $port | grep 'Connected'; then
echo -e "${lv}端口 $port 当前可用${bai}"
else
echo -e "${hong}端口 $port 当前不可用${bai}"
fi
echo "------------------------"
echo ""
echo "安装提示"
echo "poste.io一个邮件服务器确保80和443端口没被占用确保25端口开放"
echo "官网介绍: https://hub.docker.com/r/analogic/poste.io"
echo ""
# 提示用户确认安装
read -p "确定安装poste.io吗(Y/N): " choice
case "$choice" in
[Yy])
clear
read -p "请设置邮箱域名 例如 mail.yuming.com : " yuming
mkdir -p /home/docker # 递归创建目录
echo "$yuming" > /home/docker/mail.txt # 写入文件
echo "------------------------"
ip_address
echo "先解析这些DNS记录"
echo "A mail $ipv4_address"
echo "CNAME imap $yuming"
echo "CNAME pop $yuming"
echo "CNAME smtp $yuming"
echo "MX @ $yuming"
echo "TXT @ v=spf1 mx ~all"
echo "TXT ? ?"
echo ""
echo "------------------------"
echo "按任意键继续..."
read -n 1 -s -r -p ""
install_docker
docker run \
--net=host \
-e TZ=Europe/Prague \
-v /home/docker/mail:/data \
--name "mailserver" \
-h "$yuming" \
--restart=always \
-d analogic/poste.io
clear
echo "poste.io已经安装完成"
echo "------------------------"
echo "您可以使用以下地址访问poste.io:"
echo "https://$yuming"
echo ""
;;
[Nn])
;;
*)
;;
esac
fi
;;
10)
has_ipv4_has_ipv6
if docker inspect rocketchat &>/dev/null; then
clear
echo "rocket.chat已安装访问地址: "
if $has_ipv4; then
echo "http:$ipv4_address:3897"
fi
if $has_ipv6; then
echo "http:[$ipv6_address]:3897"
fi
echo ""
echo "应用操作"
echo "------------------------"
echo "1. 更新应用 2. 卸载应用"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
docker rm -f rocketchat
docker rmi -f rocket.chat:6.3
docker run --name rocketchat --restart=always -p 3897:3000 --link db --env ROOT_URL=http://localhost --env MONGO_OPLOG_URL=mongodb://db:27017/rs5 -d rocket.chat
clear
ip_address
echo "rocket.chat已经安装完成"
echo "------------------------"
echo "多等一会您可以使用以下地址访问rocket.chat:"
if $has_ipv4; then
echo "http:$ipv4_address:3897"
fi
if $has_ipv6; then
echo "http:[$ipv6_address]:3897"
fi
echo ""
;;
2)
clear
docker rm -f rocketchat
docker rmi -f rocket.chat
docker rmi -f rocket.chat:6.3
docker rm -f db
docker rmi -f mongo:latest
# docker rmi -f mongo:6
rm -rf /home/docker/mongo
echo "应用已卸载"
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
else
clear
echo "安装提示"
echo "rocket.chat国外知名开源多人聊天系统"
echo "官网介绍: https://www.rocket.chat"
echo ""
# 提示用户确认安装
read -p "确定安装rocket.chat吗(Y/N): " choice
case "$choice" in
[Yy])
clear
install_docker
docker run --name db -d --restart=always \
-v /home/docker/mongo/dump:/dump \
mongo:latest --replSet rs5 --oplogSize 256
sleep 1
docker exec -it db mongosh --eval "printjson(rs.initiate())"
sleep 5
docker run --name rocketchat --restart=always -p 3897:3000 --link db --env ROOT_URL=http://localhost --env MONGO_OPLOG_URL=mongodb://db:27017/rs5 -d rocket.chat
clear
ip_address
echo "rocket.chat已经安装完成"
echo "------------------------"
echo "多等一会您可以使用以下地址访问rocket.chat:"
if $has_ipv4; then
echo "http:$ipv4_address:3897"
fi
if $has_ipv6; then
echo "http:[$ipv6_address]:3897"
fi
echo ""
;;
[Nn])
;;
*)
;;
esac
fi
;;
11)
docker_name="zentao-server"
docker_img="idoop/zentao:latest"
docker_port=82
docker_rum="docker run -d -p 82:80 -p 3308:3306 \
-e ADMINER_USER="root" -e ADMINER_PASSWD="password" \
-e BIND_ADDRESS="false" \
-v /home/docker/zentao-server/:/opt/zbox/ \
--add-host smtp.exmail.qq.com:163.177.90.125 \
--name zentao-server \
--restart=always \
idoop/zentao:latest"
docker_describe="禅道是通用的项目管理软件"
docker_url="官网介绍: https://www.zentao.net/"
docker_use="echo \"初始用户名: admin\""
docker_passwd="echo \"初始密码: 123456\""
docker_app
;;
12)
docker_name="qinglong"
docker_img="whyour/qinglong:latest"
docker_port=5700
docker_rum="docker run -d \
-v /home/docker/qinglong/data:/ql/data \
-p 5700:5700 \
--name qinglong \
--hostname qinglong \
--restart unless-stopped \
whyour/qinglong:latest"
docker_describe="青龙面板是一个定时任务管理平台"
docker_url="官网介绍: https://github.com/whyour/qinglong"
docker_use=""
docker_passwd=""
docker_app
;;
13)
has_ipv4_has_ipv6
if docker inspect cloudreve &>/dev/null; then
clear
echo "cloudreve已安装访问地址: "
if $has_ipv4; then
echo "http:$ipv4_address:5212"
fi
if $has_ipv6; then
echo "http:[$ipv6_address]:5212"
fi
echo ""
echo "应用操作"
echo "------------------------"
echo "1. 更新应用 2. 卸载应用"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
docker rm -f cloudreve
docker rmi -f cloudreve/cloudreve:latest
docker rm -f aria2
docker rmi -f p3terx/aria2-pro
cd /home/ && mkdir -p docker/cloud && cd docker/cloud && mkdir temp_data && mkdir -vp cloudreve/{uploads,avatar} && touch cloudreve/conf.ini && touch cloudreve/cloudreve.db && mkdir -p aria2/config && mkdir -p data/aria2 && chmod -R 777 data/aria2
curl -o /home/docker/cloud/docker-compose.yml https://raw.githubusercontent.com/kejilion/docker/main/cloudreve-docker-compose.yml
cd /home/docker/cloud/ && docker compose up -d
clear
echo "cloudreve已经安装完成"
echo "------------------------"
echo "您可以使用以下地址访问cloudreve:"
if $has_ipv4; then
echo "http:$ipv4_address:5212"
fi
if $has_ipv6; then
echo "http:[$ipv6_address]:5212"
fi
sleep 3
docker logs cloudreve
echo ""
;;
2)
clear
docker rm -f cloudreve
docker rmi -f cloudreve/cloudreve:latest
docker rm -f aria2
docker rmi -f p3terx/aria2-pro
rm -rf /home/docker/cloud
echo "应用已卸载"
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
else
clear
echo "安装提示"
echo "cloudreve是一个支持多家云存储的网盘系统"
echo "官网介绍: https://cloudreve.org/"
echo ""
# 提示用户确认安装
read -p "确定安装cloudreve吗(Y/N): " choice
case "$choice" in
[Yy])
clear
install_docker
cd /home/ && mkdir -p docker/cloud && cd docker/cloud && mkdir temp_data && mkdir -vp cloudreve/{uploads,avatar} && touch cloudreve/conf.ini && touch cloudreve/cloudreve.db && mkdir -p aria2/config && mkdir -p data/aria2 && chmod -R 777 data/aria2
curl -o /home/docker/cloud/docker-compose.yml https://raw.githubusercontent.com/kejilion/docker/main/cloudreve-docker-compose.yml
cd /home/docker/cloud/ && docker compose up -d
clear
echo "cloudreve已经安装完成"
echo "------------------------"
echo "您可以使用以下地址访问cloudreve:"
if $has_ipv4; then
echo "http:$ipv4_address:5212"
fi
if $has_ipv6; then
echo "http:[$ipv6_address]:5212"
fi
sleep 3
docker logs cloudreve
echo ""
;;
[Nn])
;;
*)
;;
esac
fi
;;
14)
docker_name="easyimage"
docker_img="ddsderek/easyimage:latest"
docker_port=85
docker_rum="docker run -d \
--name easyimage \
-p 85:80 \
-e TZ=Asia/Shanghai \
-e PUID=1000 \
-e PGID=1000 \
-v /home/docker/easyimage/config:/app/web/config \
-v /home/docker/easyimage/i:/app/web/i \
--restart unless-stopped \
ddsderek/easyimage:latest"
docker_describe="简单图床是一个简单的图床程序"
docker_url="官网介绍: https://github.com/icret/EasyImages2.0"
docker_use=""
docker_passwd=""
docker_app
;;
15)
docker_name="emby"
docker_img="linuxserver/emby:latest"
docker_port=8096
docker_rum="docker run -d --name=emby --restart=always \
-v /homeo/docker/emby/config:/config \
-v /homeo/docker/emby/share1:/mnt/share1 \
-v /homeo/docker/emby/share2:/mnt/share2 \
-v /mnt/notify:/mnt/notify \
-p 8096:8096 -p 8920:8920 \
-e UID=1000 -e GID=100 -e GIDLIST=100 \
linuxserver/emby:latest"
docker_describe="emby是一个主从式架构的媒体服务器软件可以用来整理服务器上的视频和音频并将音频和视频流式传输到客户端设备"
docker_url="官网介绍: https://emby.media/"
docker_use=""
docker_passwd=""
docker_app
;;
16)
docker_name="looking-glass"
docker_img="wikihostinc/looking-glass-server"
docker_port=89
docker_rum="docker run -d --name looking-glass --restart always -p 89:80 wikihostinc/looking-glass-server"
docker_describe="Speedtest测速面板是一个VPS网速测试工具多项测试功能还可以实时监控VPS进出站流量"
docker_url="官网介绍: https://github.com/wikihost-opensource/als"
docker_use=""
docker_passwd=""
docker_app
;;
17)
docker_name="adguardhome"
docker_img="adguard/adguardhome"
docker_port=3000
docker_rum="docker run -d \
--name adguardhome \
-v /home/docker/adguardhome/work:/opt/adguardhome/work \
-v /home/docker/adguardhome/conf:/opt/adguardhome/conf \
-p 53:53/tcp \
-p 53:53/udp \
-p 3000:3000/tcp \
--restart always \
adguard/adguardhome"
docker_describe="AdGuardHome是一款全网广告拦截与反跟踪软件未来将不止是一个DNS服务器。"
docker_url="官网介绍: https://hub.docker.com/r/adguard/adguardhome"
docker_use=""
docker_passwd=""
docker_app
;;
18)
docker_name="onlyoffice"
docker_img="onlyoffice/documentserver"
docker_port=8082
docker_rum="docker run -d -p 8082:80 \
--restart=always \
--name onlyoffice \
-v /home/docker/onlyoffice/DocumentServer/logs:/var/log/onlyoffice \
-v /home/docker/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data \
onlyoffice/documentserver"
docker_describe="onlyoffice是一款开源的在线office工具太强大了"
docker_url="官网介绍: https://www.onlyoffice.com/"
docker_use=""
docker_passwd=""
docker_app
;;
19)
if docker inspect safeline-tengine &>/dev/null; then
clear
echo "雷池已安装,访问地址: "
ip_address
echo "http:$ipv4_address:9443"
echo ""
echo "应用操作"
echo "------------------------"
echo "1. 更新应用 2. 卸载应用"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
echo "暂不支持"
echo ""
;;
2)
clear
echo "cd命令到安装目录下执行: docker compose down"
echo ""
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
else
clear
echo "安装提示"
echo "雷池是长亭科技开发的WAF站点防火墙程序面板可以反代站点进行自动化防御"
echo "80和443端口不能被占用无法与宝塔1panelnpmldnmp建站共存"
echo "官网介绍: https://github.com/chaitin/safeline"
echo ""
# 提示用户确认安装
read -p "确定安装吗?(Y/N): " choice
case "$choice" in
[Yy])
clear
install_docker
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
clear
echo "雷池WAF面板已经安装完成"
echo "------------------------"
echo "您可以使用以下地址访问:"
ip_address
echo "http:$ipv4_address:9443"
echo ""
;;
[Nn])
;;
*)
;;
esac
fi
;;
20)
docker_name="portainer"
docker_img="portainer/portainer"
docker_port=9050
docker_rum="docker run -d \
--name portainer \
-p 9050:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/docker/portainer:/data \
--restart always \
portainer/portainer"
docker_describe="portainer是一个轻量级的docker容器管理面板"
docker_url="官网介绍: https://www.portainer.io/"
docker_use=""
docker_passwd=""
docker_app
;;
21)
docker_name="vscode-web"
docker_img="codercom/code-server"
docker_port=8180
docker_rum="docker run -d -p 8180:8080 -v /home/docker/vscode-web:/home/coder/.local/share/code-server --name vscode-web --restart always codercom/code-server"
docker_describe="VScode是一款强大的在线代码编写工具"
docker_url="官网介绍: https://github.com/coder/code-server"
docker_use="sleep 3"
docker_passwd="docker exec vscode-web cat /home/coder/.config/code-server/config.yaml"
docker_app
;;
22)
docker_name="uptime-kuma"
docker_img="louislam/uptime-kuma:latest"
docker_port=3003
docker_rum="docker run -d \
--name=uptime-kuma \
-p 3003:3001 \
-v /home/docker/uptime-kuma/uptime-kuma-data:/app/data \
--restart=always \
louislam/uptime-kuma:latest"
docker_describe="Uptime Kuma 易于使用的自托管监控工具"
docker_url="官网介绍: https://github.com/louislam/uptime-kuma"
docker_use=""
docker_passwd=""
docker_app
;;
23)
docker_name="memos"
docker_img="ghcr.io/usememos/memos:latest"
docker_port=5230
docker_rum="docker run -d --name memos -p 5230:5230 -v /home/docker/memos:/var/opt/memos --restart always ghcr.io/usememos/memos:latest"
docker_describe="Memos是一款轻量级、自托管的备忘录中心"
docker_url="官网介绍: https://github.com/usememos/memos"
docker_use=""
docker_passwd=""
docker_app
;;
24)
docker_name="webtop"
docker_img="lscr.io/linuxserver/webtop:latest"
docker_port=3083
docker_rum="docker run -d \
--name=webtop \
--security-opt seccomp=unconfined \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e SUBFOLDER=/ \
-e TITLE=Webtop \
-e LC_ALL=zh_CN.UTF-8 \
-e DOCKER_MODS=linuxserver/mods:universal-package-install \
-e INSTALL_PACKAGES=font-noto-cjk \
-p 3083:3000 \
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
lscr.io/linuxserver/webtop:latest"
docker_describe="webtop基于 Alpine、Ubuntu、Fedora 和 Arch 的容器,包含官方支持的完整桌面环境,可通过任何现代 Web 浏览器访问"
docker_url="官网介绍: https://docs.linuxserver.io/images/docker-webtop/"
docker_use=""
docker_passwd=""
docker_app
;;
25)
docker_name="nextcloud"
docker_img="nextcloud:latest"
docker_port=8989
rootpasswd=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c16)
docker_rum="docker run -d --name nextcloud --restart=always -p 8989:80 -v /home/docker/nextcloud:/var/www/html -e NEXTCLOUD_ADMIN_USER=nextcloud -e NEXTCLOUD_ADMIN_PASSWORD=$rootpasswd nextcloud"
docker_describe="Nextcloud拥有超过 400,000 个部署,是您可以下载的最受欢迎的本地内容协作平台"
docker_url="官网介绍: https://nextcloud.com/"
docker_use="echo \"账号: nextcloud 密码: $rootpasswd\""
docker_passwd=""
docker_app
;;
26)
docker_name="qd"
docker_img="qdtoday/qd:latest"
docker_port=8923
docker_rum="docker run -d --name qd -p 8923:80 -v /home/docker/qd/config:/usr/src/app/config qdtoday/qd"
docker_describe="QD-Today是一个HTTP请求定时任务自动执行框架"
docker_url="官网介绍: https://qd-today.github.io/qd/zh_CN/"
docker_use=""
docker_passwd=""
docker_app
;;
27)
docker_name="dockge"
docker_img="louislam/dockge:latest"
docker_port=5003
docker_rum="docker run -d --name dockge --restart unless-stopped -p 5003:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge"
docker_describe="dockge是一个可视化的docker-compose容器管理面板"
docker_url="官网介绍: https://github.com/louislam/dockge"
docker_use=""
docker_passwd=""
docker_app
;;
28)
docker_name="speedtest"
docker_img="ghcr.io/librespeed/speedtest:latest"
docker_port=6681
docker_rum="docker run -d \
--name speedtest \
--restart always \
-e MODE=standalone \
-p 6681:80 \
ghcr.io/librespeed/speedtest:latest"
docker_describe="librespeed是用Javascript实现的轻量级速度测试工具即开即用"
docker_url="官网介绍: https://github.com/librespeed/speedtest"
docker_use=""
docker_passwd=""
docker_app
;;
29)
docker_name="searxng"
docker_img="alandoyle/searxng:latest"
docker_port=8700
docker_rum="docker run --name=searxng \
-d --init \
--restart=unless-stopped \
-v /home/docker/searxng/config:/etc/searxng \
-v /home/docker/searxng/templates:/usr/local/searxng/searx/templates/simple \
-v /home/docker/searxng/theme:/usr/local/searxng/searx/static/themes/simple \
-p 8700:8080/tcp \
alandoyle/searxng:latest"
docker_describe="searxng是一个私有且隐私的搜索引擎站点"
docker_url="官网介绍: https://hub.docker.com/r/alandoyle/searxng"
docker_use=""
docker_passwd=""
docker_app
;;
30)
docker_name="photoprism"
docker_img="photoprism/photoprism:latest"
docker_port=2342
rootpasswd=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c16)
docker_rum="docker run -d \
--name photoprism \
--restart always \
--security-opt seccomp=unconfined \
--security-opt apparmor=unconfined \
-p 2342:2342 \
-e PHOTOPRISM_UPLOAD_NSFW="true" \
-e PHOTOPRISM_ADMIN_PASSWORD="$rootpasswd" \
-v /home/docker/photoprism/storage:/photoprism/storage \
-v /home/docker/photoprism/Pictures:/photoprism/originals \
photoprism/photoprism"
docker_describe="photoprism非常强大的私有相册系统"
docker_url="官网介绍: https://www.photoprism.app/"
docker_use="echo \"账号: admin 密码: $rootpasswd\""
docker_passwd=""
docker_app
;;
31)
docker_name="s-pdf"
docker_img="frooodle/s-pdf:latest"
docker_port=8020
docker_rum="docker run -d \
--name s-pdf \
--restart=always \
-p 8020:8080 \
-v /home/docker/s-pdf/trainingData:/usr/share/tesseract-ocr/5/tessdata \
-v /home/docker/s-pdf/extraConfigs:/configs \
-v /home/docker/s-pdf/logs:/logs \
-e DOCKER_ENABLE_SECURITY=false \
frooodle/s-pdf:latest"
docker_describe="这是一个强大的本地托管基于 Web 的 PDF 操作工具,使用 docker允许您对 PDF 文件执行各种操作,例如拆分合并、转换、重新组织、添加图像、旋转、压缩等。"
docker_url="官网介绍: https://github.com/Stirling-Tools/Stirling-PDF"
docker_use=""
docker_passwd=""
docker_app
;;
32)
docker_name="drawio"
docker_img="jgraph/drawio"
docker_port=7080
docker_rum="docker run -d --restart=always --name drawio -p 7080:8080 -v /home/docker/drawio:/var/lib/drawio jgraph/drawio"
docker_describe="这是一个强大图表绘制软件。思维导图,拓扑图,流程图,都能画"
docker_url="官网介绍: https://www.drawio.com/"
docker_use=""
docker_passwd=""
docker_app
;;
33)
docker_name="sun-panel"
docker_img="hslr/sun-panel"
docker_port=3009
docker_rum="docker run -d --restart=always -p 3009:3002 \
-v /home/docker/sun-panel/conf:/app/conf \
-v /home/docker/sun-panel/uploads:/app/uploads \
-v /home/docker/sun-panel/database:/app/database \
--name sun-panel \
hslr/sun-panel"
docker_describe="Sun-Panel服务器、NAS导航面板、Homepage、浏览器首页"
docker_url="官网介绍: https://doc.sun-panel.top/zh_cn/"
docker_use="echo \"账号: admin@sun.cc 密码: 12345678\""
docker_passwd=""
docker_app
;;
34)
docker_name="pingvin-share"
docker_img="stonith404/pingvin-share"
docker_port=3060
docker_rum="docker run -d \
--name pingvin-share \
--restart always \
-p 3060:3000 \
-v /home/docker/pingvin-share/data:/opt/app/backend/data \
stonith404/pingvin-share"
docker_describe="Pingvin Share 是一个可自建的文件分享平台,是 WeTransfer 的一个替代品"
docker_url="官网介绍: https://github.com/stonith404/pingvin-share"
docker_use=""
docker_passwd=""
docker_app
;;
35)
docker_name="moments"
docker_img="kingwrcy/moments:latest"
docker_port=8035
docker_rum="docker run -d --restart unless-stopped \
-p 8035:3000 \
-v /home/docker/moments/data:/app/data \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
--name moments \
kingwrcy/moments:latest"
docker_describe="极简朋友圈,高仿微信朋友圈,记录你的美好生活"
docker_url="官网介绍: https://github.com/kingwrcy/moments?tab=readme-ov-file"
docker_use="echo \"账号: admin 密码: a123456\""
docker_passwd=""
docker_app
;;
36)
docker_name="lobe-chat"
docker_img="lobehub/lobe-chat:latest"
docker_port=8036
docker_rum="docker run -d -p 8036:3210 \
--name lobe-chat \
--restart=always \
lobehub/lobe-chat"
docker_describe="LobeChat聚合市面上主流的AI大模型ChatGPT/Claude/Gemini/Groq/Ollama"
docker_url="官网介绍: https://github.com/lobehub/lobe-chat"
docker_use=""
docker_passwd=""
docker_app
;;
37)
docker_name="myip"
docker_img="ghcr.io/jason5ng32/myip:latest"
docker_port=8037
docker_rum="docker run -d -p 8037:18966 --name myip --restart always ghcr.io/jason5ng32/myip:latest"
docker_describe="是一个多功能IP工具箱可以查看自己IP信息及连通性用网页面板呈现"
docker_url="官网介绍: https://github.com/jason5ng32/MyIP/blob/main/README_ZH.md"
docker_use=""
docker_passwd=""
docker_app
;;
38)
bash -c "$(curl --insecure -fsSL https://ddsrem.com/xiaoya_install.sh)"
;;
51)
clear
curl -L https://raw.githubusercontent.com/oneclickvirt/pve/main/scripts/install_pve.sh -o install_pve.sh && chmod +x install_pve.sh && bash install_pve.sh
;;
0)
kejilion
;;
*)
echo "无效的输入!"
;;
esac
break_end
done
;;
12)
while true; do
clear
echo "▶ 我的工作区"
echo "系统将为你提供可以后台常驻运行的工作区,你可以用来执行长时间的任务"
echo "即使你断开SSH工作区中的任务也不会中断后台常驻任务。"
echo -e "${huang}注意: 进入工作区后使用Ctrl+b再单独按d退出工作区${bai}"
echo "------------------------"
echo "1. 1号工作区"
echo "2. 2号工作区"
echo "3. 3号工作区"
echo "4. 4号工作区"
echo "5. 5号工作区"
echo "6. 6号工作区"
echo "7. 7号工作区"
echo "8. 8号工作区"
echo "9. 9号工作区"
echo "10. 10号工作区"
echo "11. 自定义工作区"
echo "------------------------"
echo "99. 工作区状态管理"
echo "------------------------"
echo "0. 返回主菜单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
clear
install tmux
SESSION_NAME="work1"
tmux_run
;;
2)
clear
install tmux
SESSION_NAME="work2"
tmux_run
;;
3)
clear
install tmux
SESSION_NAME="work3"
tmux_run
;;
4)
clear
install tmux
SESSION_NAME="work4"
tmux_run
;;
5)
clear
install tmux
SESSION_NAME="work5"
tmux_run
;;
6)
clear
install tmux
SESSION_NAME="work6"
tmux_run
;;
7)
clear
install tmux
SESSION_NAME="work7"
tmux_run
;;
8)
clear
install tmux
SESSION_NAME="work8"
tmux_run
;;
9)
clear
install tmux
SESSION_NAME="work9"
tmux_run
;;
10)
clear
install tmux
SESSION_NAME="work10"
tmux_run
;;
11)
clear
install tmux
clear
echo "当前已存在的工作区列表"
echo "------------------------"
tmux list-sessions
echo "------------------------"
read -p "请输入您自定义的工作区名称如1001 kj001 work10: " SESSION_NAME
tmux_run
;;
99)
while true; do
clear
echo "当前已存在的工作区列表"
echo "------------------------"
tmux list-sessions
echo "------------------------"
read -p "1. 删除指定工作区 0. 退出: " gongzuoqu_del
case "$gongzuoqu_del" in
1)
read -p "请输入要删除的工作区名称: " gongzuoqu_name
tmux kill-window -t $gongzuoqu_name
;;
0)
break
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
done
;;
0)
kejilion
;;
*)
echo "无效的输入!"
;;
esac
break_end
done
;;
13)
while true; do
clear
echo "▶ 系统工具"
echo "------------------------"
echo "1. 设置脚本启动快捷键 2. 修改登录密码"
echo "3. ROOT密码登录模式 4. 安装Python指定版本"
echo "5. 开放所有端口 6. 修改SSH连接端口"
echo "7. 优化DNS地址 8. 一键重装系统"
echo "9. 禁用ROOT账户创建新账户 10. 切换优先ipv4/ipv6"
echo "------------------------"
echo "11. 查看端口占用状态 12. 修改虚拟内存大小"
echo "13. 用户管理 14. 用户/密码生成器"
echo "15. 系统时区调整 16. 设置BBR3加速"
echo "17. 防火墙高级管理器 18. 修改主机名"
echo "19. 切换系统更新源 20. 定时任务管理"
echo "------------------------"
echo "21. 本机host解析 22. fail2banSSH防御程序"
echo "23. 限流自动关机 24. ROOT私钥登录模式"
echo "25. TG-bot系统监控预警 26. 修复OoenSSH高危漏洞岫源"
echo "------------------------"
echo "31. 留言板 66. 一条龙系统调优"
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
;;
3)
root_use
add_sshpasswd
;;
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}"
;;
5)
root_use
iptables_open
remove iptables-persistent ufw firewalld iptables-services > /dev/null 2>&1
echo "端口已全部开放"
;;
6)
root_use
# 去掉 #Port 的注释
sed -i 's/#Port/Port/' /etc/ssh/sshd_config
# 读取当前的 SSH 端口号
current_port=$(grep -E '^ *Port [0-9]+' /etc/ssh/sshd_config | awk '{print $2}')
# 打印当前的 SSH 端口号
echo "当前的 SSH 端口号是: $current_port"
echo "------------------------"
# 提示用户输入新的 SSH 端口号
read -p "请输入新的 SSH 端口号: " new_port
new_ssh_port
;;
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
;;
9)
root_use
# 提示用户输入新用户名
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
# 禁用ROOT用户登录
passwd -l root
echo "操作已完成。"
;;
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
;;
17)
root_use
if dpkg -l | grep -q iptables-persistent; then
while true; do
echo "防火墙已安装"
echo "------------------------"
iptables -L INPUT
echo ""
echo "防火墙管理"
echo "------------------------"
echo "1. 开放指定端口 2. 关闭指定端口"
echo "3. 开放所有端口 4. 关闭所有端口"
echo "------------------------"
echo "5. IP白名单 6. IP黑名单"
echo "7. 清除指定IP"
echo "------------------------"
echo "9. 卸载防火墙"
echo "------------------------"
echo "0. 返回上一级选单"
echo "------------------------"
read -p "请输入你的选择: " sub_choice
case $sub_choice in
1)
read -p "请输入开放的端口号: " o_port
sed -i "/COMMIT/i -A INPUT -p tcp --dport $o_port -j ACCEPT" /etc/iptables/rules.v4
sed -i "/COMMIT/i -A INPUT -p udp --dport $o_port -j ACCEPT" /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
;;
2)
read -p "请输入关闭的端口号: " c_port
sed -i "/--dport $c_port/d" /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
;;
3)
current_port=$(grep -E '^ *Port [0-9]+' /etc/ssh/sshd_config | awk '{print $2}')
cat > /etc/iptables/rules.v4 << EOF
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A INPUT -p tcp --dport $current_port -j ACCEPT
COMMIT
EOF
iptables-restore < /etc/iptables/rules.v4
;;
4)
current_port=$(grep -E '^ *Port [0-9]+' /etc/ssh/sshd_config | awk '{print $2}')
cat > /etc/iptables/rules.v4 << EOF
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A INPUT -p tcp --dport $current_port -j ACCEPT
COMMIT
EOF
iptables-restore < /etc/iptables/rules.v4
;;
5)
read -p "请输入放行的IP: " o_ip
sed -i "/COMMIT/i -A INPUT -s $o_ip -j ACCEPT" /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
;;
6)
read -p "请输入封锁的IP: " c_ip
sed -i "/COMMIT/i -A INPUT -s $c_ip -j DROP" /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
;;
7)
read -p "请输入清除的IP: " d_ip
sed -i "/-A INPUT -s $d_ip/d" /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
;;
9)
remove iptables-persistent
rm /etc/iptables/rules.v4
break
;;
0)
break # 跳出循环,退出菜单
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
else
clear
echo "将为你安装防火墙该防火墙仅支持Debian/Ubuntu"
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
clear
iptables_open
remove iptables-persistent ufw
rm /etc/iptables/rules.v4
apt update -y && apt install -y iptables-persistent
current_port=$(grep -E '^ *Port [0-9]+' /etc/ssh/sshd_config | awk '{print $2}')
cat > /etc/iptables/rules.v4 << EOF
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A INPUT -p tcp --dport $current_port -j ACCEPT
COMMIT
EOF
iptables-restore < /etc/iptables/rules.v4
systemctl enable netfilter-persistent
echo "防火墙安装完成"
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
fi
;;
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 https://raw.githubusercontent.com/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
;;
24)
root_use
echo "ROOT私钥登录模式"
echo "------------------------------------------------"
echo "将会生成密钥对更安全的方式SSH登录"
read -p "确定继续吗?(Y/N): " choice
case "$choice" in
[Yy])
clear
add_sshkey
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
25)
root_use
echo "TG-bot监控预警功能"
echo "------------------------------------------------"
echo "您需要配置tg机器人API和接收预警的用户ID即可实现本机CPU内存硬盘流量SSH登录的实时监控预警"
echo "到达阈值后会向用户发预警消息"
echo -e "${hui}-关于流量,重启服务器将重新计算-${bai}"
read -p "确定继续吗?(Y/N): " choice
case "$choice" in
[Yy])
cd ~
install nano tmux bc jq
if [ -f ~/TG-check-notify.sh ]; then
chmod +x ~/TG-check-notify.sh
nano ~/TG-check-notify.sh
else
curl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/TG-check-notify.sh
chmod +x ~/TG-check-notify.sh
nano ~/TG-check-notify.sh
fi
tmux kill-session -t TG-check-notify > /dev/null 2>&1
tmux new -d -s TG-check-notify "~/TG-check-notify.sh"
crontab -l | grep -v '~/TG-check-notify.sh' | crontab - > /dev/null 2>&1
(crontab -l ; echo "@reboot tmux new -d -s TG-check-notify '~/TG-check-notify.sh'") | crontab - > /dev/null 2>&1
curl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/TG-SSH-check-notify.sh > /dev/null 2>&1
sed -i "3i$(grep '^TELEGRAM_BOT_TOKEN=' ~/TG-check-notify.sh)" TG-SSH-check-notify.sh > /dev/null 2>&1
sed -i "4i$(grep '^CHAT_ID=' ~/TG-check-notify.sh)" TG-SSH-check-notify.sh
chmod +x ~/TG-SSH-check-notify.sh
# 添加到 ~/.profile 文件中
if ! grep -q 'bash ~/TG-SSH-check-notify.sh' ~/.profile > /dev/null 2>&1; then
echo 'bash ~/TG-SSH-check-notify.sh' >> ~/.profile
fi
source ~/.profile
clear
echo "TG-bot预警系统已启动"
echo -e "${hui}你还可以将root目录中的TG-check-notify.sh预警文件放到其他机器上直接使用${bai}"
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
26)
root_use
cd ~
curl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/upgrade_openssh9.8p1.sh
chmod +x ~/upgrade_openssh9.8p1.sh
~/upgrade_openssh9.8p1.sh
rm -f ~/upgrade_openssh9.8p1.sh
;;
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 "留言板操作完成。"
;;
66)
root_use
echo "一条龙系统调优"
echo "------------------------------------------------"
echo "将对以下内容进行操作与优化"
echo "1. 更新系统到最新"
echo "2. 清理系统垃圾文件"
echo -e "3. 设置虚拟内存${huang}1G${bai}"
echo -e "4. 设置SSH端口号为${huang}5522${bai}"
echo -e "5. 开放所有端口"
echo -e "6. 开启${huang}BBR${bai}加速"
echo -e "7. 设置时区到${huang}上海${bai}"
echo -e "8. 优化DNS地址到${huang}1111 8888${bai}"
echo -e "9. 安装常用工具${huang}docker wget sudo tar unzip socat btop${bai}"
echo "------------------------------------------------"
read -p "确定一键保养吗?(Y/N): " choice
case "$choice" in
[Yy])
clear
echo "------------------------------------------------"
linux_update
echo -e "[${lv}OK${bai}] 1/9. 更新系统到最新"
echo "------------------------------------------------"
linux_clean
echo -e "[${lv}OK${bai}] 2/9. 清理系统垃圾文件"
echo "------------------------------------------------"
new_swap=1024
add_swap
echo -e "[${lv}OK${bai}] 3/9. 设置虚拟内存${huang}1G${bai}"
echo "------------------------------------------------"
new_port=5522
new_ssh_port
echo -e "[${lv}OK${bai}] 4/9. 设置SSH端口号为${huang}5522${bai}"
echo "------------------------------------------------"
echo -e "[${lv}OK${bai}] 5/9. 开放所有端口"
echo "------------------------------------------------"
bbr_on
echo -e "[${lv}OK${bai}] 6/9. 开启${huang}BBR${bai}加速"
echo "------------------------------------------------"
set_timedate Asia/Shanghai
echo -e "[${lv}OK${bai}] 7/9. 设置时区到${huang}上海${bai}"
echo "------------------------------------------------"
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
echo -e "[${lv}OK${bai}] 8/9. 优化DNS地址到${huang}1111 8888${bai}"
echo "------------------------------------------------"
install_add_docker
install wget sudo tar unzip socat btop
echo -e "[${lv}OK${bai}] 9/9. 安装常用工具${huang}docker wget sudo tar unzip socat btop${bai}"
echo "------------------------------------------------"
echo -e "${lv}一条龙系统调优已完成${bai}"
;;
[Nn])
echo "已取消"
;;
*)
echo "无效的选择,请输入 Y 或 N。"
;;
esac
;;
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 "14. 安装docker 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
;;
14)
py_task=install_docker.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 https://raw.githubusercontent.com/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
;;
p)
cd ~
curl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/palworld.sh && chmod +x palworld.sh && ./palworld.sh
exit
;;
00)
cd ~
clear
echo "更新日志"
echo "------------------------"
echo "全部日志: https://raw.githubusercontent.com/kejilion/sh/main/kejilion_sh_log.txt"
echo "------------------------"
curl -s https://raw.githubusercontent.com/kejilion/sh/main/kejilion_sh_log.txt | tail -n 35
sh_v_new=$(curl -s https://raw.githubusercontent.com/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 https://raw.githubusercontent.com/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