6535 lines
223 KiB
Bash
6535 lines
223 KiB
Bash
#!/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 "会根据系统自动安装,支持Debian,Ubuntu,Centos"
|
||
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-6,0代表星期日): " 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端口不能被占用,无法与宝塔,1panel,npm,ldnmp建站共存"
|
||
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-6,0代表星期日): " 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
|
||
|
||
|