Files
sh/ru/kejilion.sh
openclaw 0784a11c19
Some checks failed
Weekly Translation Workflow / translate (push) Has been cancelled
init: fork of kejilion/sh with certbot host-network fix
- Replace 'docker run -p 80:80' with '--network host' for certbot standalone HTTP-01 to avoid timeout in environments where Docker NAT port-publish breaks LE inbound traffic but host port 80 is reachable.
- Applies to kejilion.sh (all locale variants) and auto_cert_renewal.sh.
- README install command points to this Gitea mirror.
2026-05-18 17:06:42 +08:00

12223 lines
429 KiB
Bash
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
sh_v="3.9.3"
gl_hui='\e[37m'
gl_hong='\033[31m'
gl_lv='\033[32m'
gl_huang='\033[33m'
gl_lan='\033[34m'
gl_bai='\033[0m'
gl_zi='\033[35m'
gl_kjlan='\033[96m'
canshu="default"
permission_granted="false"
ENABLE_STATS="true"
quanju_canshu() {
if [ "$canshu" = "CN" ]; then
zhushi=0
gh_proxy="https://gh.kejilion.pro/"
elif [ "$canshu" = "V6" ]; then
zhushi=1
gh_proxy="https://gh.kejilion.pro/"
else
zhushi=1 # 0 表示执行1 表示不执行
gh_proxy="https://"
fi
}
quanju_canshu
# Определите функцию для выполнения команд
run_command() {
if [ "$zhushi" -eq 0 ]; then
"$@"
fi
}
canshu_v6() {
if grep -q '^canshu="V6"' /usr/local/bin/k > /dev/null 2>&1; then
sed -i 's/^canshu="default"/canshu="V6"/' ~/kejilion.sh
fi
}
CheckFirstRun_true() {
if grep -q '^permission_granted="true"' /usr/local/bin/k > /dev/null 2>&1; then
sed -i 's/^permission_granted="false"/permission_granted="true"/' ~/kejilion.sh
fi
}
# Функции, которые собирают функцию, захороненную информацию о том, записывают текущий номер версии сценария, время использования, системную версию, архитектуру ЦП, страну машины и имя функции, используемое пользователем. Они абсолютно не включают конфиденциальную информацию, пожалуйста, будьте уверены! Пожалуйста, поверьте мне!
# Зачем нам разработать эту функцию? Цель состоит в том, чтобы лучше понять функции, которые пользователи любят использовать, и еще больше оптимизировать функции, чтобы запустить больше функций, которые удовлетворяют потребности пользователей.
# Для полного текста вы можете искать местоположение вызова функции Send_stats, прозрачный и открытый исходный код, и вы можете отказаться использовать его, если у вас есть какие -либо проблемы.
send_stats() {
if [ "$ENABLE_STATS" == "false" ]; then
return
fi
local country=$(curl -s ipinfo.io/country)
local os_info=$(grep PRETTY_NAME /etc/os-release | cut -d '=' -f2 | tr -d '"')
local cpu_arch=$(uname -m)
(
curl -s -X POST "https://api.kejilion.pro/api/log" \
-H "Content-Type: application/json" \
-d "{\"action\":\"$1\",\"timestamp\":\"$(date -u '+%Y-%m-%d %H:%M:%S')\",\"country\":\"$country\",\"os_info\":\"$os_info\",\"cpu_arch\":\"$cpu_arch\",\"version\":\"$sh_v\"}" \
&>/dev/null
) &
}
yinsiyuanquan2() {
if grep -q '^ENABLE_STATS="false"' /usr/local/bin/k > /dev/null 2>&1; then
sed -i 's/^ENABLE_STATS="true"/ENABLE_STATS="false"/' ~/kejilion.sh
fi
}
canshu_v6
CheckFirstRun_true
yinsiyuanquan2
sed -i '/^alias k=/d' ~/.bashrc > /dev/null 2>&1
sed -i '/^alias k=/d' ~/.profile > /dev/null 2>&1
sed -i '/^alias k=/d' ~/.bash_profile > /dev/null 2>&1
cp -f ./kejilion.sh ~/kejilion.sh > /dev/null 2>&1
cp -f ~/kejilion.sh /usr/local/bin/k > /dev/null 2>&1
CheckFirstRun_false() {
if grep -q '^permission_granted="false"' /usr/local/bin/k > /dev/null 2>&1; then
UserLicenseAgreement
fi
}
# Позвольте пользователю согласиться с условиями
UserLicenseAgreement() {
clear
echo -e "${gl_kjlan}Добро пожаловать в The Tech Lion Script Toolbox${gl_bai}"
echo "Впервые используя сценарий, пожалуйста, прочитайте и согласитесь с пользовательским лицензионным соглашением."
echo "Пользовательский лицензионный соглашение: https://blog.kejilion.pro/user-license-agreement/"
echo -e "----------------------"
read -r -p "Вы согласны с вышеуказанными условиями? (Y/N):" user_input
if [ "$user_input" = "y" ] || [ "$user_input" = "Y" ]; then
send_stats "Лицензионное согласие"
sed -i 's/^permission_granted="false"/permission_granted="true"/' ~/kejilion.sh
sed -i 's/^permission_granted="false"/permission_granted="true"/' /usr/local/bin/k
else
send_stats "Отказ от разрешения"
clear
exit
fi
}
CheckFirstRun_false
ip_address() {
ipv4_address=$(curl -s https://ipinfo.io/ip && echo)
ipv6_address=$(curl -s --max-time 1 https://v6.ipinfo.io/ip && echo)
}
install() {
if [ $# -eq 0 ]; then
echo "Параметры пакета не предоставляются!"
return 1
fi
for package in "$@"; do
if ! command -v "$package" &>/dev/null; then
echo -e "${gl_huang}Установка$package...${gl_bai}"
if command -v dnf &>/dev/null; then
dnf -y update
dnf install -y epel-release
dnf install -y "$package"
elif command -v yum &>/dev/null; then
yum -y update
yum install -y epel-release
yum install -y "$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"
elif command -v pacman &>/dev/null; then
pacman -Syu --noconfirm
pacman -S --noconfirm "$package"
elif command -v zypper &>/dev/null; then
zypper refresh
zypper install -y "$package"
elif command -v opkg &>/dev/null; then
opkg update
opkg install "$package"
elif command -v pkg &>/dev/null; then
pkg update
pkg install -y "$package"
else
echo "Неизвестный менеджер пакетов!"
return 1
fi
fi
done
}
check_disk_space() {
required_gb=$1
required_space_mb=$((required_gb * 1024))
available_space_mb=$(df -m / | awk 'NR==2 {print $4}')
if [ $available_space_mb -lt $required_space_mb ]; then
echo -e "${gl_huang}намекать:${gl_bai}Недостаточное пространство диска!"
echo "Текущее доступное пространство: $ ((доступен_space_mb/1024)) g"
echo "Минимальное пространство спроса:${required_gb}G"
echo "Установка не может быть продолжена. Пожалуйста, очистите пространство диска и попробуйте еще раз."
send_stats "Недостаточно дискового пространства"
break_end
kejilion
fi
}
install_dependency() {
install wget unzip tar jq
}
remove() {
if [ $# -eq 0 ]; then
echo "Параметры пакета не предоставляются!"
return 1
fi
for package in "$@"; do
echo -e "${gl_huang}Удаление$package...${gl_bai}"
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"
elif command -v pacman &>/dev/null; then
pacman -Rns --noconfirm "$package"
elif command -v zypper &>/dev/null; then
zypper remove -y "$package"
elif command -v opkg &>/dev/null; then
opkg remove "$package"
elif command -v pkg &>/dev/null; then
pkg delete -y "$package"
else
echo "Неизвестный менеджер пакетов!"
return 1
fi
done
}
# Универсальная функция SystemCtl, подходящая для различных распределений
systemctl() {
local COMMAND="$1"
local SERVICE_NAME="$2"
if command -v apk &>/dev/null; then
service "$SERVICE_NAME" "$COMMAND"
else
/bin/systemctl "$COMMAND" "$SERVICE_NAME"
fi
}
# Перезагрузите услугу
restart() {
systemctl restart "$1"
if [ $? -eq 0 ]; then
echo "$1Служба была перезапущена."
else
echo "Ошибка: перезапуск$1Служба не удалась."
fi
}
# Начните сервис
start() {
systemctl start "$1"
if [ $? -eq 0 ]; then
echo "$1Служба была начата."
else
echo "Ошибка: запуск$1Служба не удалась."
fi
}
# Остановить обслуживание
stop() {
systemctl stop "$1"
if [ $? -eq 0 ]; then
echo "$1Служба была остановлена."
else
echo "Ошибка: остановиться$1Служба не удалась."
fi
}
# Проверьте статус службы
status() {
systemctl status "$1"
if [ $? -eq 0 ]; then
echo "$1Статус службы отображается."
else
echo "Ошибка: невозможно отобразить$1Служба статуса."
fi
}
enable() {
local SERVICE_NAME="$1"
if command -v apk &>/dev/null; then
rc-update add "$SERVICE_NAME" default
else
/bin/systemctl enable "$SERVICE_NAME"
fi
echo "$SERVICE_NAMEУстановить на питание."
}
break_end() {
echo -e "${gl_lv}Операция завершена${gl_bai}"
echo "Нажмите любую клавишу, чтобы продолжить ..."
read -n 1 -s -r -p ""
echo ""
clear
}
kejilion() {
cd ~
kejilion_sh
}
check_port() {
install lsof
stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)
if [ -n "$containers" ]; then
docker stop $containers
else
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}
stop_containers_or_kill_process 80
stop_containers_or_kill_process 443
}
install_add_docker_cn() {
local country=$(curl -s ipinfo.io/country)
if [ "$country" = "CN" ]; then
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://docker-0.unsee.tech",
"https://docker.1panel.live",
"https://registry.dockermirror.com",
"https://docker.imgdb.de",
"https://docker.m.daocloud.io",
"https://hub.firefly.store",
"https://hub.littlediary.cn",
"https://hub.rat.dev",
"https://dhub.kubesre.xyz",
"https://cjie.eu.org",
"https://docker.1panelproxy.com",
"https://docker.hlmirror.com",
"https://hub.fast360.xyz",
"https://dockerpull.cn",
"https://cr.laoyou.ip-ddns.com",
"https://docker.melikeme.cn",
"https://docker.kejilion.pro"
]
}
EOF
fi
enable docker
start docker
restart docker
}
install_add_docker_guanfang() {
local country=$(curl -s ipinfo.io/country)
if [ "$country" = "CN" ]; then
cd ~
curl -sS -O ${gh_proxy}raw.githubusercontent.com/kejilion/docker/main/install && chmod +x install
sh install --mirror Aliyun
rm -f install
else
curl -fsSL https://get.docker.com | sh
fi
install_add_docker_cn
}
install_add_docker() {
echo -e "${gl_huang}Установка среды Docker ...${gl_bai}"
if [ -f /etc/os-release ] && grep -q "Fedora" /etc/os-release; then
install_add_docker_guanfang
elif command -v dnf &>/dev/null; then
dnf update -y
dnf install -y yum-utils device-mapper-persistent-data lvm2
rm -f /etc/yum.repos.d/docker*.repo > /dev/null
country=$(curl -s ipinfo.io/country)
arch=$(uname -m)
if [ "$country" = "CN" ]; then
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo | tee /etc/yum.repos.d/docker-ce.repo > /dev/null
else
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo > /dev/null
fi
dnf install -y docker-ce docker-ce-cli containerd.io
install_add_docker_cn
elif [ -f /etc/os-release ] && grep -q "Kali" /etc/os-release; then
apt update
apt upgrade -y
apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
rm -f /usr/share/keyrings/docker-archive-keyring.gpg
local country=$(curl -s ipinfo.io/country)
local arch=$(uname -m)
if [ "$country" = "CN" ]; then
if [ "$arch" = "x86_64" ]; then
sed -i '/^deb \[arch=amd64 signed-by=\/etc\/apt\/keyrings\/docker-archive-keyring.gpg\] https:\/\/mirrors.aliyun.com\/docker-ce\/linux\/debian bullseye stable/d' /etc/apt/sources.list.d/docker.list > /dev/null
mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg > /dev/null
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian bullseye stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
elif [ "$arch" = "aarch64" ]; then
sed -i '/^deb \[arch=arm64 signed-by=\/etc\/apt\/keyrings\/docker-archive-keyring.gpg\] https:\/\/mirrors.aliyun.com\/docker-ce\/linux\/debian bullseye stable/d' /etc/apt/sources.list.d/docker.list > /dev/null
mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg > /dev/null
echo "deb [arch=arm64 signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian bullseye stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
fi
else
if [ "$arch" = "x86_64" ]; then
sed -i '/^deb \[arch=amd64 signed-by=\/usr\/share\/keyrings\/docker-archive-keyring.gpg\] https:\/\/download.docker.com\/linux\/debian bullseye stable/d' /etc/apt/sources.list.d/docker.list > /dev/null
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg > /dev/null
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bullseye stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
elif [ "$arch" = "aarch64" ]; then
sed -i '/^deb \[arch=arm64 signed-by=\/usr\/share\/keyrings\/docker-archive-keyring.gpg\] https:\/\/download.docker.com\/linux\/debian bullseye stable/d' /etc/apt/sources.list.d/docker.list > /dev/null
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg > /dev/null
echo "deb [arch=arm64 signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bullseye stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
fi
fi
apt update
apt install -y docker-ce docker-ce-cli containerd.io
install_add_docker_cn
elif command -v apt &>/dev/null || command -v yum &>/dev/null; then
install_add_docker_guanfang
else
install docker docker-compose
install_add_docker_cn
fi
sleep 2
}
install_docker() {
if ! command -v docker &>/dev/null; then
install_add_docker
fi
}
docker_ps() {
while true; do
clear
send_stats "Управление контейнерами Docker"
echo "Список контейнеров Docker"
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
echo ""
echo "Работа контейнера"
echo "------------------------"
echo "1. Создать новый контейнер"
echo "------------------------"
echo "2. Запустите указанный контейнер 6. Запустите все контейнеры"
echo "3. Остановите указанный контейнер 7. Остановите все контейнеры"
echo "4. Удалить указанный контейнер 8. Удалить все контейнеры"
echo "5. Перезагрузите указанный контейнер 9. Перезапустите все контейнеры"
echo "------------------------"
echo "11. Введите указанный контейнер 12. Просмотреть журнал контейнера"
echo "13. Просмотреть сеть контейнеров 14. Просмотреть занятость контейнера"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
send_stats "Создать новый контейнер"
read -e -p "Пожалуйста, введите команду Creation:" dockername
$dockername
;;
2)
send_stats "Запустите указанный контейнер"
read -e -p "Пожалуйста, введите имя контейнера (несколько имен контейнеров, разделенных пространствами):" dockername
docker start $dockername
;;
3)
send_stats "Остановить указанный контейнер"
read -e -p "Пожалуйста, введите имя контейнера (несколько имен контейнеров, разделенных пространствами):" dockername
docker stop $dockername
;;
4)
send_stats "Удалить указанный контейнер"
read -e -p "Пожалуйста, введите имя контейнера (несколько имен контейнеров, разделенных пространствами):" dockername
docker rm -f $dockername
;;
5)
send_stats "Перезагрузить указанный контейнер"
read -e -p "Пожалуйста, введите имя контейнера (несколько имен контейнеров, разделенных пространствами):" dockername
docker restart $dockername
;;
6)
send_stats "Начните все контейнеры"
docker start $(docker ps -a -q)
;;
7)
send_stats "Остановите все контейнеры"
docker stop $(docker ps -q)
;;
8)
send_stats "Удалить все контейнеры"
read -e -p "$(echo -e "${gl_hong}注意: ${gl_bai}确定删除所有容器吗?(Y/N): ")" choice
case "$choice" in
[Yy])
docker rm -f $(docker ps -a -q)
;;
[Nn])
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
9)
send_stats "Перезапустите все контейнеры"
docker restart $(docker ps -q)
;;
11)
send_stats "Введите контейнер"
read -e -p "Пожалуйста, введите имя контейнера:" dockername
docker exec -it $dockername /bin/sh
break_end
;;
12)
send_stats "Просмотреть журнал контейнеров"
read -e -p "Пожалуйста, введите имя контейнера:" dockername
docker logs $dockername
break_end
;;
13)
send_stats "Просмотреть контейнерные сеть"
echo ""
container_ids=$(docker ps -q)
echo "------------------------------------------------------------"
printf "%-25s %-25s %-25s\n" "容器名称" "网络名称" "IP地址"
for container_id in $container_ids; do
local container_info=$(docker inspect --format '{{ .Name }}{{ range $network, $config := .NetworkSettings.Networks }} {{ $network }} {{ $config.IPAddress }}{{ end }}' "$container_id")
local container_name=$(echo "$container_info" | awk '{print $1}')
local network_info=$(echo "$container_info" | cut -d' ' -f2-)
while IFS= read -r line; do
local network_name=$(echo "$line" | awk '{print $1}')
local ip_address=$(echo "$line" | awk '{print $2}')
printf "%-20s %-20s %-15s\n" "$container_name" "$network_name" "$ip_address"
done <<< "$network_info"
done
break_end
;;
14)
send_stats "Просмотреть занятость контейнера"
docker stats --no-stream
break_end
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
}
docker_image() {
while true; do
clear
send_stats "Docker Management"
echo "Список изображений Docker"
docker image ls
echo ""
echo "Зеркальная операция"
echo "------------------------"
echo "1. Получите указанное изображение 3. Удалить указанное изображение"
echo "2. Обновите указанное изображение 4. Удалить все изображения"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
send_stats "Потяните зеркало"
read -e -p "Пожалуйста, введите имя зеркала (пожалуйста, разделяйте несколько имен зеркала с пробелами):" imagenames
for name in $imagenames; do
echo -e "${gl_huang}Получение изображения:$name${gl_bai}"
docker pull $name
done
;;
2)
send_stats "Обновите изображение"
read -e -p "Пожалуйста, введите имя зеркала (пожалуйста, разделяйте несколько имен зеркала с пробелами):" imagenames
for name in $imagenames; do
echo -e "${gl_huang}Обновленное изображение:$name${gl_bai}"
docker pull $name
done
;;
3)
send_stats "Удалить зеркало"
read -e -p "Пожалуйста, введите имя зеркала (пожалуйста, разделяйте несколько имен зеркала с пробелами):" imagenames
for name in $imagenames; do
docker rmi -f $name
done
;;
4)
send_stats "Удалить все изображения"
read -e -p "$(echo -e "${gl_hong}注意: ${gl_bai}确定删除所有镜像吗?(Y/N): ")" choice
case "$choice" in
[Yy])
docker rmi -f $(docker images -q)
;;
[Nn])
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
}
check_crontab_installed() {
if ! command -v crontab >/dev/null 2>&1; then
install_crontab
fi
}
install_crontab() {
if [ -f /etc/os-release ]; then
. /etc/os-release
case "$ID" in
ubuntu|debian|kali)
apt update
apt install -y cron
systemctl enable cron
systemctl start cron
;;
centos|rhel|almalinux|rocky|fedora)
yum install -y cronie
systemctl enable crond
systemctl start crond
;;
alpine)
apk add --no-cache cronie
rc-update add crond
rc-service crond start
;;
arch|manjaro)
pacman -S --noconfirm cronie
systemctl enable cronie
systemctl start cronie
;;
opensuse|suse|opensuse-tumbleweed)
zypper install -y cron
systemctl enable cron
systemctl start cron
;;
iStoreOS|openwrt|ImmortalWrt|lede)
opkg update
opkg install cron
/etc/init.d/cron enable
/etc/init.d/cron start
;;
FreeBSD)
pkg install -y cronie
sysrc cron_enable="YES"
service cron start
;;
*)
echo "Неподдерживаемые распределения:$ID"
return
;;
esac
else
echo "Операционная система не может быть определена."
return
fi
echo -e "${gl_lv}Crontab установлен, а сервис Cron работает.${gl_bai}"
}
docker_ipv6_on() {
root_use
install jq
local CONFIG_FILE="/etc/docker/daemon.json"
local REQUIRED_IPV6_CONFIG='{"ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64"}'
# Проверьте, существует ли файл конфигурации, создайте файл и напишите настройки по умолчанию, если его не существует
if [ ! -f "$CONFIG_FILE" ]; then
echo "$REQUIRED_IPV6_CONFIG" | jq . > "$CONFIG_FILE"
restart docker
else
# Используйте JQ для обработки обновлений файлов конфигурации
local ORIGINAL_CONFIG=$(<"$CONFIG_FILE")
# Проверьте, есть ли текущая конфигурация уже есть настройки IPv6
local CURRENT_IPV6=$(echo "$ORIGINAL_CONFIG" | jq '.ipv6 // false')
# Обновить конфигурацию и включить IPv6
if [[ "$CURRENT_IPV6" == "false" ]]; then
UPDATED_CONFIG=$(echo "$ORIGINAL_CONFIG" | jq '. + {ipv6: true, "fixed-cidr-v6": "2001:db8:1::/64"}')
else
UPDATED_CONFIG=$(echo "$ORIGINAL_CONFIG" | jq '. + {"fixed-cidr-v6": "2001:db8:1::/64"}')
fi
# Сравнение исходной конфигурации с новой конфигурацией
if [[ "$ORIGINAL_CONFIG" == "$UPDATED_CONFIG" ]]; then
echo -e "${gl_huang}Доступ к IPv6 в настоящее время включен${gl_bai}"
else
echo "$UPDATED_CONFIG" | jq . > "$CONFIG_FILE"
restart docker
fi
fi
}
docker_ipv6_off() {
root_use
install jq
local CONFIG_FILE="/etc/docker/daemon.json"
# Проверьте, существует ли файл конфигурации
if [ ! -f "$CONFIG_FILE" ]; then
echo -e "${gl_hong}Файла конфигурации не существует${gl_bai}"
return
fi
# Прочитайте текущую конфигурацию
local ORIGINAL_CONFIG=$(<"$CONFIG_FILE")
# Используйте JQ для обработки обновлений файлов конфигурации
local UPDATED_CONFIG=$(echo "$ORIGINAL_CONFIG" | jq 'del(.["fixed-cidr-v6"]) | .ipv6 = false')
# Проверьте текущий статус IPv6
local CURRENT_IPV6=$(echo "$ORIGINAL_CONFIG" | jq -r '.ipv6 // false')
# Сравнение исходной конфигурации с новой конфигурацией
if [[ "$CURRENT_IPV6" == "false" ]]; then
echo -e "${gl_huang}Доступ к IPv6 в настоящее время закрыт${gl_bai}"
else
echo "$UPDATED_CONFIG" | jq . > "$CONFIG_FILE"
restart docker
echo -e "${gl_huang}Доступ к IPv6 был успешно закрыт${gl_bai}"
fi
}
save_iptables_rules() {
mkdir -p /etc/iptables
touch /etc/iptables/rules.v4
iptables-save > /etc/iptables/rules.v4
check_crontab_installed
crontab -l | grep -v 'iptables-restore' | crontab - > /dev/null 2>&1
(crontab -l ; echo '@reboot iptables-restore < /etc/iptables/rules.v4') | crontab - > /dev/null 2>&1
}
iptables_open() {
install iptables
save_iptables_rules
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
}
open_port() {
local ports=($@) # 将传入的参数转换为数组
if [ ${#ports[@]} -eq 0 ]; then
echo "Пожалуйста, предоставьте хотя бы один номер порта"
return 1
fi
install iptables
for port in "${ports[@]}"; do
# Удалить существующие правила закрытия
iptables -D INPUT -p tcp --dport $port -j DROP 2>/dev/null
iptables -D INPUT -p udp --dport $port -j DROP 2>/dev/null
# Добавьте открытые правила
if ! iptables -C INPUT -p tcp --dport $port -j ACCEPT 2>/dev/null; then
iptables -I INPUT 1 -p tcp --dport $port -j ACCEPT
fi
if ! iptables -C INPUT -p udp --dport $port -j ACCEPT 2>/dev/null; then
iptables -I INPUT 1 -p udp --dport $port -j ACCEPT
echo "Порт был открыт$port"
fi
done
save_iptables_rules
send_stats "Порт был открыт"
}
close_port() {
local ports=($@) # 将传入的参数转换为数组
if [ ${#ports[@]} -eq 0 ]; then
echo "Пожалуйста, предоставьте хотя бы один номер порта"
return 1
fi
install iptables
for port in "${ports[@]}"; do
# Удалить существующие открытые правила
iptables -D INPUT -p tcp --dport $port -j ACCEPT 2>/dev/null
iptables -D INPUT -p udp --dport $port -j ACCEPT 2>/dev/null
# Добавить правило
if ! iptables -C INPUT -p tcp --dport $port -j DROP 2>/dev/null; then
iptables -I INPUT 1 -p tcp --dport $port -j DROP
fi
if ! iptables -C INPUT -p udp --dport $port -j DROP 2>/dev/null; then
iptables -I INPUT 1 -p udp --dport $port -j DROP
echo "Порт закрыт$port"
fi
done
save_iptables_rules
send_stats "Порт закрыт"
}
allow_ip() {
local ips=($@) # 将传入的参数转换为数组
if [ ${#ips[@]} -eq 0 ]; then
echo "Пожалуйста, предоставьте хотя бы один IP -адрес или IP -сегмент"
return 1
fi
install iptables
for ip in "${ips[@]}"; do
# Удалить существующие правила блокировки
iptables -D INPUT -s $ip -j DROP 2>/dev/null
# Добавить разрешить правила
if ! iptables -C INPUT -s $ip -j ACCEPT 2>/dev/null; then
iptables -I INPUT 1 -s $ip -j ACCEPT
echo "Выпущен IP$ip"
fi
done
save_iptables_rules
send_stats "Выпущен IP"
}
block_ip() {
local ips=($@) # 将传入的参数转换为数组
if [ ${#ips[@]} -eq 0 ]; then
echo "Пожалуйста, предоставьте хотя бы один IP -адрес или IP -сегмент"
return 1
fi
install iptables
for ip in "${ips[@]}"; do
# Удалить существующие разрешения правил
iptables -D INPUT -s $ip -j ACCEPT 2>/dev/null
# Добавить правила блокировки
if ! iptables -C INPUT -s $ip -j DROP 2>/dev/null; then
iptables -I INPUT 1 -s $ip -j DROP
echo "IP заблокирован$ip"
fi
done
save_iptables_rules
send_stats "IP заблокирован"
}
enable_ddos_defense() {
# Включите оборону DDOS
iptables -A DOCKER-USER -p tcp --syn -m limit --limit 500/s --limit-burst 100 -j ACCEPT
iptables -A DOCKER-USER -p tcp --syn -j DROP
iptables -A DOCKER-USER -p udp -m limit --limit 3000/s -j ACCEPT
iptables -A DOCKER-USER -p udp -j DROP
iptables -A INPUT -p tcp --syn -m limit --limit 500/s --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
iptables -A INPUT -p udp -m limit --limit 3000/s -j ACCEPT
iptables -A INPUT -p udp -j DROP
send_stats "Включите защиту DDOS"
}
# Выключить защиту DDOS
disable_ddos_defense() {
# Выключить защиту DDOS
iptables -D DOCKER-USER -p tcp --syn -m limit --limit 500/s --limit-burst 100 -j ACCEPT 2>/dev/null
iptables -D DOCKER-USER -p tcp --syn -j DROP 2>/dev/null
iptables -D DOCKER-USER -p udp -m limit --limit 3000/s -j ACCEPT 2>/dev/null
iptables -D DOCKER-USER -p udp -j DROP 2>/dev/null
iptables -D INPUT -p tcp --syn -m limit --limit 500/s --limit-burst 100 -j ACCEPT 2>/dev/null
iptables -D INPUT -p tcp --syn -j DROP 2>/dev/null
iptables -D INPUT -p udp -m limit --limit 3000/s -j ACCEPT 2>/dev/null
iptables -D INPUT -p udp -j DROP 2>/dev/null
send_stats "Выключить защиту DDOS"
}
# Функции, которые управляют национальными правилами ИС
manage_country_rules() {
local action="$1"
local country_code="$2"
local ipset_name="${country_code,,}_block"
local download_url="http://www.ipdeny.com/ipblocks/data/countries/${country_code,,}.zone"
install ipset
case "$action" in
block)
# Создайте, если IPSet не существует
if ! ipset list "$ipset_name" &> /dev/null; then
ipset create "$ipset_name" hash:net
fi
# Скачать файл IP области
if ! wget -q "$download_url" -O "${country_code,,}.zone"; then
echo "Ошибка: скачать$country_codeФайл IP Zone не удастся"
exit 1
fi
# Добавить IP в IPSet
while IFS= read -r ip; do
ipset add "$ipset_name" "$ip"
done < "${country_code,,}.zone"
# Block IP с помощью iptables
iptables -I INPUT -m set --match-set "$ipset_name" src -j DROP
iptables -I OUTPUT -m set --match-set "$ipset_name" dst -j DROP
echo "Заблокировано успешно$country_codeIP -адрес"
rm "${country_code,,}.zone"
;;
allow)
# Создайте IPSet для разрешенных стран (если нет)
if ! ipset list "$ipset_name" &> /dev/null; then
ipset create "$ipset_name" hash:net
fi
# Скачать файл IP области
if ! wget -q "$download_url" -O "${country_code,,}.zone"; then
echo "Ошибка: скачать$country_codeФайл IP Zone не удастся"
exit 1
fi
# Удалить существующие национальные правила
iptables -D INPUT -m set --match-set "$ipset_name" src -j DROP 2>/dev/null
iptables -D OUTPUT -m set --match-set "$ipset_name" dst -j DROP 2>/dev/null
ipset flush "$ipset_name"
# Добавить IP в IPSet
while IFS= read -r ip; do
ipset add "$ipset_name" "$ip"
done < "${country_code,,}.zone"
# Разрешены только IPS в назначенных странах
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A INPUT -m set --match-set "$ipset_name" src -j ACCEPT
iptables -A OUTPUT -m set --match-set "$ipset_name" dst -j ACCEPT
echo "Успешно разрешено$country_codeIP -адрес"
rm "${country_code,,}.zone"
;;
unblock)
# Удалить правила iptables для страны
iptables -D INPUT -m set --match-set "$ipset_name" src -j DROP 2>/dev/null
iptables -D OUTPUT -m set --match-set "$ipset_name" dst -j DROP 2>/dev/null
# Уничтожить IPSet
if ipset list "$ipset_name" &> /dev/null; then
ipset destroy "$ipset_name"
fi
echo "Успешно поднялся$country_codeОграничения IP -адреса"
;;
*)
;;
esac
}
iptables_panel() {
root_use
install iptables
save_iptables_rules
while true; do
clear
echo "Продвинутый управление брандмауэром"
send_stats "Продвинутый управление брандмауэром"
echo "------------------------"
iptables -L INPUT
echo ""
echo "Управление брандмауэром"
echo "------------------------"
echo "1. Откройте указанный порт 2. Закройте указанный порт"
echo "3. Откройте все порты 4. Закройте все порты"
echo "------------------------"
echo "5. IP WhiteList 6. IP Blacklist"
echo "7. Очистить указанный IP"
echo "------------------------"
echo "11. разрешить пинг 12. Отключить пинг"
echo "------------------------"
echo "13. Начать защиту DDOS 14. Выключите защиту DDOS"
echo "------------------------"
echo "15. Блок Указанный страна IP 16. Разрешены только указанная страна IPS"
echo "17. Выпустите ограничения IP в назначенных странах"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
read -e -p "Пожалуйста, введите номер открытого порта:" o_port
open_port $o_port
send_stats "Откройте указанный порт"
;;
2)
read -e -p "Пожалуйста, введите закрытый номер порта:" c_port
close_port $c_port
send_stats "Закрыть указанный порт"
;;
3)
# Откройте все порты
current_port=$(grep -E '^ *Port [0-9]+' /etc/ssh/sshd_config | awk '{print $2}')
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport $current_port -j ACCEPT
iptables-save > /etc/iptables/rules.v4
send_stats "Откройте все порты"
;;
4)
# Закройте все порты
current_port=$(grep -E '^ *Port [0-9]+' /etc/ssh/sshd_config | awk '{print $2}')
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport $current_port -j ACCEPT
iptables-save > /etc/iptables/rules.v4
send_stats "Закройте все порты"
;;
5)
# IP Whitelist
read -e -p "Пожалуйста, введите сегмент IP или IP, чтобы выпустить:" o_ip
allow_ip $o_ip
;;
6)
# IP Blacklist
read -e -p "Пожалуйста, введите заблокированный IP или IP -сегмент:" c_ip
block_ip $c_ip
;;
7)
# Очистить указанный IP
read -e -p "Пожалуйста, введите очищенный IP:" d_ip
iptables -D INPUT -s $d_ip -j ACCEPT 2>/dev/null
iptables -D INPUT -s $d_ip -j DROP 2>/dev/null
iptables-save > /etc/iptables/rules.v4
send_stats "Очистить указанный IP"
;;
11)
# Разрешить пинг
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables-save > /etc/iptables/rules.v4
send_stats "Разрешить пинг"
;;
12)
# Отключить пинг
iptables -D INPUT -p icmp --icmp-type echo-request -j ACCEPT 2>/dev/null
iptables -D OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT 2>/dev/null
iptables-save > /etc/iptables/rules.v4
send_stats "Отключить пинг"
;;
13)
enable_ddos_defense
;;
14)
disable_ddos_defense
;;
15)
read -e -p "Пожалуйста, введите заблокированный код страны (например, CN, US, JP):" country_code
manage_country_rules block $country_code
send_stats "Разрешен страны$country_codeIP"
;;
16)
read -e -p "Пожалуйста, введите разрешенный код страны (например, CN, US, JP):" country_code
manage_country_rules allow $country_code
send_stats "Заблокировать страну$country_codeIP"
;;
17)
read -e -p "Пожалуйста, введите код очищенной страны (например, CN, US, JP):" country_code
manage_country_rules unblock $country_code
send_stats "Очистить страну$country_codeIP"
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
}
add_swap() {
local new_swap=$1 # 获取传入的参数
# Получить все перегородки в текущей системе
local swap_partitions=$(grep -E '^/dev/' /proc/swaps | awk '{print $1}')
# Итерация и удаление всех перегородков обмена
for partition in $swap_partitions; do
swapoff "$partition"
wipefs -a "$partition"
mkswap -f "$partition"
done
# Убедитесь, что /Swapfile больше не используется
swapoff /swapfile
# Удалить старый /Swapfile
rm -f /swapfile
# Создать новый перегородка
fallocate -l ${new_swap}M /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
sed -i '/\/swapfile/d' /etc/fstab
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
if [ -f /etc/alpine-release ]; then
echo "nohup swapon /swapfile" > /etc/local.d/swap.start
chmod +x /etc/local.d/swap.start
rc-update add local
fi
echo -e "Размер виртуальной памяти был изменен на${gl_huang}${new_swap}${gl_bai}M"
}
check_swap() {
local swap_total=$(free -m | awk 'NR==3{print $2}')
# Определите, нужно ли создать виртуальную память
[ "$swap_total" -gt 0 ] || add_swap 1024
}
ldnmp_v() {
# Получите версию Nginx
local nginx_version=$(docker exec nginx nginx -v 2>&1)
local nginx_version=$(echo "$nginx_version" | grep -oP "nginx/\K[0-9]+\.[0-9]+\.[0-9]+")
echo -n -e "nginx : ${gl_huang}v$nginx_version${gl_bai}"
# Получите версию MySQL
local dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
local mysql_version=$(docker exec mysql mysql -u root -p"$dbrootpasswd" -e "SELECT VERSION();" 2>/dev/null | tail -n 1)
echo -n -e " mysql : ${gl_huang}v$mysql_version${gl_bai}"
# Получите версию PHP
local php_version=$(docker exec php php -v 2>/dev/null | grep -oP "PHP \K[0-9]+\.[0-9]+\.[0-9]+")
echo -n -e " php : ${gl_huang}v$php_version${gl_bai}"
# Получить версию Redis
local redis_version=$(docker exec redis redis-server -v 2>&1 | grep -oP "v=+\K[0-9]+\.[0-9]+")
echo -e " redis : ${gl_huang}v$redis_version${gl_bai}"
echo "------------------------"
echo ""
}
install_ldnmp_conf() {
# Создать необходимые каталоги и файлы
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 ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/nginx10.conf
wget -O /home/web/conf.d/default.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/default10.conf
wget -O /home/web/redis/valkey.conf ${gh_proxy}raw.githubusercontent.com/kejilion/sh/main/valkey.conf
default_server_ssl
# Загрузите файл docker-compose.yml и замените его
wget -O /home/web/docker-compose.yml ${gh_proxy}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() {
check_swap
cp /home/web/docker-compose.yml /home/web/docker-compose1.yml
if ! grep -q "php-socket" /home/web/docker-compose.yml; then
wget -O /home/web/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/kejilion/docker/main/LNMP-docker-compose-10.yml
dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose1.yml | tr -d '[:space:]')
dbuse=$(grep -oP 'MYSQL_USER:\s*\K.*' /home/web/docker-compose1.yml | tr -d '[:space:]')
dbusepasswd=$(grep -oP 'MYSQL_PASSWORD:\s*\K.*' /home/web/docker-compose1.yml | tr -d '[:space:]')
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
fi
if grep -q "kjlion/nginx:alpine" /home/web/docker-compose1.yml; then
sed -i 's|kjlion/nginx:alpine|nginx:alpine|g' /home/web/docker-compose.yml > /dev/null 2>&1
sed -i 's|nginx:alpine|kjlion/nginx:alpine|g' /home/web/docker-compose.yml > /dev/null 2>&1
fi
cd /home/web && docker compose up -d
sleep 1
crontab -l 2>/dev/null | grep -v 'logrotate' | crontab -
(crontab -l 2>/dev/null; echo '0 2 * * * docker exec nginx apk add logrotate && docker exec nginx logrotate -f /etc/logrotate.conf') | crontab -
fix_phpfpm_conf php
fix_phpfpm_conf php74
restart_ldnmp
clear
echo "Среда LDNMP была установлена"
echo "------------------------"
ldnmp_v
}
install_certbot() {
cd ~
curl -sS -O ${gh_proxy}raw.githubusercontent.com/kejilion/sh/main/auto_cert_renewal.sh
chmod +x auto_cert_renewal.sh
check_crontab_installed
local cron_job="0 0 * * * ~/auto_cert_renewal.sh"
crontab -l 2>/dev/null | grep -vF "$cron_job" | crontab -
(crontab -l 2>/dev/null; echo "$cron_job") | crontab -
echo "Задача об обновлении была обновлена"
}
install_ssltls() {
docker stop nginx > /dev/null 2>&1
check_port > /dev/null 2>&1
cd ~
local file_path="/etc/letsencrypt/live/$yuming/fullchain.pem"
if [ ! -f "$file_path" ]; then
local ipv4_pattern='^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'
local ipv6_pattern='^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?))|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?))|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?))|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?))))$'
if [[ ($yuming =~ $ipv4_pattern || $yuming =~ $ipv6_pattern) ]]; then
mkdir -p /etc/letsencrypt/live/$yuming/
if command -v dnf &>/dev/null || command -v yum &>/dev/null; then
openssl req -x509 -nodes -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -keyout /etc/letsencrypt/live/$yuming/privkey.pem -out /etc/letsencrypt/live/$yuming/fullchain.pem -days 5475 -subj "/C=US/ST=State/L=City/O=Organization/OU=Organizational Unit/CN=Common Name"
else
openssl genpkey -algorithm Ed25519 -out /etc/letsencrypt/live/$yuming/privkey.pem
openssl req -x509 -key /etc/letsencrypt/live/$yuming/privkey.pem -out /etc/letsencrypt/live/$yuming/fullchain.pem -days 5475 -subj "/C=US/ST=State/L=City/O=Organization/OU=Organizational Unit/CN=Common Name"
fi
else
docker run -it --rm --network host -v /etc/letsencrypt/:/etc/letsencrypt certbot/certbot certonly --standalone --http-01-address 0.0.0.0 --http-01-port 80 -d "$yuming" --email your@email.com --agree-tos --no-eff-email --force-renewal --key-type ecdsa
fi
fi
mkdir -p /home/web/certs/
cp /etc/letsencrypt/live/$yuming/fullchain.pem /home/web/certs/${yuming}_cert.pem > /dev/null 2>&1
cp /etc/letsencrypt/live/$yuming/privkey.pem /home/web/certs/${yuming}_key.pem > /dev/null 2>&1
docker start nginx > /dev/null 2>&1
}
install_ssltls_text() {
echo -e "${gl_huang}$yumingИнформация об открытом ключе${gl_bai}"
cat /etc/letsencrypt/live/$yuming/fullchain.pem
echo ""
echo -e "${gl_huang}$yumingИнформация о частном ключе${gl_bai}"
cat /etc/letsencrypt/live/$yuming/privkey.pem
echo ""
echo -e "${gl_huang}Путь хранения сертификата${gl_bai}"
echo "Открытый ключ:/etc/letsEncrypt/live/$yuming/fullchain.pem"
echo "Закрытый ключ:/и т.д./letsEncrypt/live/$yuming/privkey.pem"
echo ""
}
add_ssl() {
yuming="${1:-}"
if [ -z "$yuming" ]; then
add_yuming
fi
install_docker
install_certbot
docker run -it --rm -v /etc/letsencrypt/:/etc/letsencrypt certbot/certbot delete --cert-name "$yuming" -n 2>/dev/null
install_ssltls
certs_status
install_ssltls_text
ssl_ps
}
ssl_ps() {
echo -e "${gl_huang}Истечение примененного сертификата${gl_bai}"
echo "Информация о сайте Сертификат истечения срока действия"
echo "------------------------"
for cert_dir in /etc/letsencrypt/live/*; do
local cert_file="$cert_dir/fullchain.pem"
if [ -f "$cert_file" ]; then
local domain=$(basename "$cert_dir")
local expire_date=$(openssl x509 -noout -enddate -in "$cert_file" | awk -F'=' '{print $2}')
local formatted_date=$(date -d "$expire_date" '+%Y-%m-%d')
printf "%-30s%s\n" "$domain" "$formatted_date"
fi
done
echo ""
}
default_server_ssl() {
install openssl
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
openssl rand -out /home/web/certs/ticket12.key 48
openssl rand -out /home/web/certs/ticket13.key 80
}
certs_status() {
sleep 1
local file_path="/etc/letsencrypt/live/$yuming/fullchain.pem"
if [ -f "$file_path" ]; then
send_stats "Успешное заявление на сертификат доменного имени"
else
send_stats "Приложение для доменного имени Сертификат не удалось"
echo -e "${gl_hong}Уведомление:${gl_bai}Заявление о сертификате не удалось. Пожалуйста, проверьте следующие возможные причины и попробуйте еще раз:"
echo -e "1.. Ошибка орфографии доменного имени ➠ Пожалуйста, проверьте, правильно ли введено доменное имя"
echo -e "2. Проблема разрешения DNS ➠ Убедитесь, что доменное имя было правильно разрешено для этого сервера IP"
echo -e "3. Проблемы конфигурации сети ➠ Если вы используете Warpp и другие виртуальные сети CloudFlare, пожалуйста, временно выключите"
echo -e "4. Ограничения брандмауэра ➠ Проверьте, открыт ли порт 80/443 для обеспечения проверки доступной"
echo -e "5. Количество приложений превышает предел ➠ Let's Encrypt имеет еженедельный лимит (5 раз/доменное имя/неделя)"
break_end
clear
echo "Пожалуйста, попробуйте развернуть еще раз$webname"
add_yuming
install_ssltls
certs_status
fi
}
repeat_add_yuming() {
if [ -e /home/web/conf.d/$yuming.conf ]; then
send_stats "Повторное использование доменного имени"
web_del "${yuming}" > /dev/null 2>&1
fi
}
add_yuming() {
ip_address
echo -e "Сначала разрешить доменное имя в локальном IP:${gl_huang}$ipv4_address $ipv6_address${gl_bai}"
read -e -p "Пожалуйста, введите свой IP или разрешенное доменное имя:" 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 ${gh_proxy}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
nginx_http_on
docker exec nginx nginx -s reload
}
restart_redis() {
rm -rf /home/web/redis/*
docker exec redis redis-cli FLUSHALL > /dev/null 2>&1
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
docker exec -it redis redis-cli CONFIG SET save "" > /dev/null 2>&1
docker exec -it redis redis-cli CONFIG SET appendonly no > /dev/null 2>&1
}
restart_ldnmp() {
restart_redis
docker exec nginx chown -R nginx:nginx /var/www/html > /dev/null 2>&1
docker exec nginx mkdir -p /var/cache/nginx/proxy > /dev/null 2>&1
docker exec nginx mkdir -p /var/cache/nginx/fastcgi > /dev/null 2>&1
docker exec nginx chown -R nginx:nginx /var/cache/nginx/proxy > /dev/null 2>&1
docker exec nginx chown -R nginx:nginx /var/cache/nginx/fastcgi > /dev/null 2>&1
docker exec php chown -R www-data:www-data /var/www/html > /dev/null 2>&1
docker exec php74 chown -R www-data:www-data /var/www/html > /dev/null 2>&1
cd /home/web && docker compose restart nginx php php74
}
nginx_upgrade() {
local ldnmp_pods="nginx"
cd /home/web/
docker rm -f $ldnmp_pods > /dev/null 2>&1
docker images --filter=reference="kjlion/${ldnmp_pods}*" -q | xargs docker rmi > /dev/null 2>&1
docker images --filter=reference="${ldnmp_pods}*" -q | xargs docker rmi > /dev/null 2>&1
docker compose up -d --force-recreate $ldnmp_pods
crontab -l 2>/dev/null | grep -v 'logrotate' | crontab -
(crontab -l 2>/dev/null; echo '0 2 * * * docker exec nginx apk add logrotate && docker exec nginx logrotate -f /etc/logrotate.conf') | crontab -
docker exec nginx chown -R nginx:nginx /var/www/html
docker exec nginx mkdir -p /var/cache/nginx/proxy
docker exec nginx mkdir -p /var/cache/nginx/fastcgi
docker exec nginx chown -R nginx:nginx /var/cache/nginx/proxy
docker exec nginx chown -R nginx:nginx /var/cache/nginx/fastcgi
docker restart $ldnmp_pods > /dev/null 2>&1
send_stats "обновлять$ldnmp_pods"
echo "обновлять${ldnmp_pods}Заканчивать"
}
phpmyadmin_upgrade() {
local ldnmp_pods="phpmyadmin"
local local docker_port=8877
local dbuse=$(grep -oP 'MYSQL_USER:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
local dbusepasswd=$(grep -oP 'MYSQL_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
cd /home/web/
docker rm -f $ldnmp_pods > /dev/null 2>&1
docker images --filter=reference="$ldnmp_pods*" -q | xargs docker rmi > /dev/null 2>&1
curl -sS -O https://raw.githubusercontent.com/kejilion/docker/refs/heads/main/docker-compose.phpmyadmin.yml
docker compose -f docker-compose.phpmyadmin.yml up -d
clear
ip_address
check_docker_app_ip
echo "Информация о входе в систему:"
echo "имя пользователя:$dbuse"
echo "пароль:$dbusepasswd"
echo
send_stats "запускать$ldnmp_pods"
}
cf_purge_cache() {
local CONFIG_FILE="/home/web/config/cf-purge-cache.txt"
local API_TOKEN
local EMAIL
local ZONE_IDS
# Проверьте, существует ли файл конфигурации
if [ -f "$CONFIG_FILE" ]; then
# Читать API_TOKEN и ZEAN_ID из файлов конфигурации
read API_TOKEN EMAIL ZONE_IDS < "$CONFIG_FILE"
# Преобразовать Zone_IDS в массив
ZONE_IDS=($ZONE_IDS)
else
# Позвольте пользователю чистить кэш
read -e -p "Нужно чистить кеш Cloudflare? (Y/N):" answer
if [[ "$answer" == "y" ]]; then
echo "Информация CF сохраняется в$CONFIG_FILE, вы можете изменить информацию CF позже"
read -e -p "Пожалуйста, введите свой API_TOKEN:" API_TOKEN
read -e -p "Пожалуйста, введите свое имя пользователя CF:" EMAIL
read -e -p "Пожалуйста, введите Zone_ID (несколько разделенных пробелами):" -a ZONE_IDS
mkdir -p /home/web/config/
echo "$API_TOKEN $EMAIL ${ZONE_IDS[*]}" > "$CONFIG_FILE"
fi
fi
# Перевернуть через каждую Zone_id и выполнить команду Clear Cache
for ZONE_ID in "${ZONE_IDS[@]}"; do
echo "Кэш очистки для Zone_ID:$ZONE_ID"
curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/purge_cache" \
-H "X-Auth-Email: $EMAIL" \
-H "X-Auth-Key: $API_TOKEN" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}'
done
echo "Запрос Cache Clear был отправлен."
}
web_cache() {
send_stats "Очистить кеш сайта"
cf_purge_cache
docker exec php php -r 'opcache_reset();'
docker exec php74 php -r 'opcache_reset();'
docker exec nginx nginx -s stop
docker exec nginx rm -rf /var/cache/nginx/*
docker exec nginx nginx
docker restart redis
restart_redis
}
web_del() {
send_stats "Удалить данные сайта"
yuming_list="${1:-}"
if [ -z "$yuming_list" ]; then
read -e -p "Чтобы удалить данные сайта, введите свое доменное имя (несколько доменных имен разделены пространствами):" yuming_list
if [[ -z "$yuming_list" ]]; then
return
fi
fi
for yuming in $yuming_list; do
echo "Удаление доменного имени:$yuming"
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
# Преобразовать доменное имя в имя базы данных
dbname=$(echo "$yuming" | sed -e 's/[^A-Za-z0-9]/_/g')
dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
# Проверьте, существует ли база данных перед удалением, чтобы избежать ошибок
echo "Удаление базы данных:$dbname"
docker exec mysql mysql -u root -p"$dbrootpasswd" -e "DROP DATABASE ${dbname};" > /dev/null 2>&1
done
docker exec nginx nginx -s reload
}
nginx_waf() {
local mode=$1
if ! grep -q "kjlion/nginx:alpine" /home/web/docker-compose.yml; then
wget -O /home/web/nginx.conf "${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/nginx10.conf"
fi
# Решите включить или выключить WAF в соответствии с параметрами режима
if [ "$mode" == "on" ]; then
# Включите WAF: удалить комментарии
sed -i 's|# load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;|load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;|' /home/web/nginx.conf > /dev/null 2>&1
sed -i 's|^\(\s*\)# modsecurity on;|\1modsecurity on;|' /home/web/nginx.conf > /dev/null 2>&1
sed -i 's|^\(\s*\)# modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;|\1modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;|' /home/web/nginx.conf > /dev/null 2>&1
elif [ "$mode" == "off" ]; then
# Закрыть WAF: добавить комментарии
sed -i 's|^load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;|# load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;|' /home/web/nginx.conf > /dev/null 2>&1
sed -i 's|^\(\s*\)modsecurity on;|\1# modsecurity on;|' /home/web/nginx.conf > /dev/null 2>&1
sed -i 's|^\(\s*\)modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;|\1# modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;|' /home/web/nginx.conf > /dev/null 2>&1
else
echo "Неверный параметр: используйте 'on' или 'off'"
return 1
fi
# Проверьте изображения Nginx и обрабатывайте их в соответствии с ситуацией
if grep -q "kjlion/nginx:alpine" /home/web/docker-compose.yml; then
docker exec nginx nginx -s reload
else
sed -i 's|nginx:alpine|kjlion/nginx:alpine|g' /home/web/docker-compose.yml
nginx_upgrade
fi
}
check_waf_status() {
if grep -q "^\s*#\s*modsecurity on;" /home/web/nginx.conf; then
waf_status=""
elif grep -q "modsecurity on;" /home/web/nginx.conf; then
waf_status=" WAF已开启"
else
waf_status=""
fi
}
check_cf_mode() {
if [ -f "/path/to/fail2ban/config/fail2ban/action.d/cloudflare-docker.conf" ]; then
CFmessage=" cf模式已开启"
else
CFmessage=""
fi
}
nginx_http_on() {
local ipv4_pattern='^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'
local ipv6_pattern='^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?))|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?))|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?))|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|(2[0-4][0-9]|[01]?[0-9][0-9]?))))$'
if [[ ($yuming =~ $ipv4_pattern || $yuming =~ $ipv6_pattern) ]]; then
sed -i '/if (\$scheme = http) {/,/}/s/^/#/' /home/web/conf.d/${yuming}.conf
fi
}
check_docker_app() {
if docker inspect "$docker_name" &>/dev/null; then
check_docker="${gl_lv}已安装${gl_bai}"
else
check_docker="${gl_hui}未安装${gl_bai}"
fi
}
check_docker_app_ip() {
echo "------------------------"
echo "Адрес доступа:"
ip_address
if [ -n "$ipv4_address" ]; then
echo "http://$ipv4_address:${docker_port}"
fi
if [ -n "$ipv6_address" ]; then
echo "http://[$ipv6_address]:${docker_port}"
fi
local search_pattern="$ipv4_address:${docker_port}"
for file in /home/web/conf.d/*; do
if [ -f "$file" ]; then
if grep -q "$search_pattern" "$file" 2>/dev/null; then
echo "https://$(basename "$file" | sed 's/\.conf$//')"
fi
fi
done
}
check_docker_image_update() {
local container_name=$1
local country=$(curl -s ipinfo.io/country)
if [[ "$country" == "CN" ]]; then
update_status=""
return
fi
# Получить время создания контейнера и имя изображения
local container_info=$(docker inspect --format='{{.Created}},{{.Config.Image}}' "$container_name" 2>/dev/null)
local container_created=$(echo "$container_info" | cut -d',' -f1)
local image_name=$(echo "$container_info" | cut -d',' -f2)
# Извлекать зеркальные склады и теги
local image_repo=${image_name%%:*}
local image_tag=${image_name##*:}
# Лейбл по умолчанию является последним
[[ "$image_repo" == "$image_tag" ]] && image_tag="latest"
# Добавить поддержку официальных изображений
[[ "$image_repo" != */* ]] && image_repo="library/$image_repo"
# Получить время публикации изображений от Docker Hub API
local hub_info=$(curl -s "https://hub.docker.com/v2/repositories/$image_repo/tags/$image_tag")
local last_updated=$(echo "$hub_info" | jq -r '.last_updated' 2>/dev/null)
# Проверьте время приобретения
if [[ -n "$last_updated" && "$last_updated" != "null" ]]; then
local container_created_ts=$(date -d "$container_created" +%s 2>/dev/null)
local last_updated_ts=$(date -d "$last_updated" +%s 2>/dev/null)
# Сравните временные метки
if [[ $container_created_ts -lt $last_updated_ts ]]; then
update_status="${gl_huang}发现新版本!${gl_bai}"
else
update_status=""
fi
else
update_status=""
fi
}
block_container_port() {
local container_name_or_id=$1
local allowed_ip=$2
# Получите IP -адрес контейнера
local container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container_name_or_id")
if [ -z "$container_ip" ]; then
echo "Ошибка: невозможно получить контейнер$container_name_or_idIP -адрес. Пожалуйста, проверьте, является ли имя или идентификатор контейнера."
return 1
fi
install iptables
# Проверьте и заблокируйте все остальные IPS
if ! iptables -C DOCKER-USER -p tcp -d "$container_ip" -j DROP &>/dev/null; then
iptables -I DOCKER-USER -p tcp -d "$container_ip" -j DROP
fi
# Проверьте и выпустите указанный IP
if ! iptables -C DOCKER-USER -p tcp -s "$allowed_ip" -d "$container_ip" -j ACCEPT &>/dev/null; then
iptables -I DOCKER-USER -p tcp -s "$allowed_ip" -d "$container_ip" -j ACCEPT
fi
# Проверьте и выпустите локальную сеть 127.0.0/8
if ! iptables -C DOCKER-USER -p tcp -s 127.0.0.0/8 -d "$container_ip" -j ACCEPT &>/dev/null; then
iptables -I DOCKER-USER -p tcp -s 127.0.0.0/8 -d "$container_ip" -j ACCEPT
fi
# Проверьте и заблокируйте все остальные IPS
if ! iptables -C DOCKER-USER -p udp -d "$container_ip" -j DROP &>/dev/null; then
iptables -I DOCKER-USER -p udp -d "$container_ip" -j DROP
fi
# Проверьте и выпустите указанный IP
if ! iptables -C DOCKER-USER -p udp -s "$allowed_ip" -d "$container_ip" -j ACCEPT &>/dev/null; then
iptables -I DOCKER-USER -p udp -s "$allowed_ip" -d "$container_ip" -j ACCEPT
fi
# Проверьте и выпустите локальную сеть 127.0.0/8
if ! iptables -C DOCKER-USER -p udp -s 127.0.0.0/8 -d "$container_ip" -j ACCEPT &>/dev/null; then
iptables -I DOCKER-USER -p udp -s 127.0.0.0/8 -d "$container_ip" -j ACCEPT
fi
if ! iptables -C DOCKER-USER -m state --state ESTABLISHED,RELATED -d "$container_ip" -j ACCEPT &>/dev/null; then
iptables -I DOCKER-USER -m state --state ESTABLISHED,RELATED -d "$container_ip" -j ACCEPT
fi
echo "Порты IP+ были заблокированы от доступа к сервису"
save_iptables_rules
}
clear_container_rules() {
local container_name_or_id=$1
local allowed_ip=$2
# Получите IP -адрес контейнера
local container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container_name_or_id")
if [ -z "$container_ip" ]; then
echo "Ошибка: невозможно получить контейнер$container_name_or_idIP -адрес. Пожалуйста, проверьте, является ли имя или идентификатор контейнера."
return 1
fi
install iptables
# Четкие правила, которые блокируют все остальные IPS
if iptables -C DOCKER-USER -p tcp -d "$container_ip" -j DROP &>/dev/null; then
iptables -D DOCKER-USER -p tcp -d "$container_ip" -j DROP
fi
# Очистить правила выпуска указанного IP
if iptables -C DOCKER-USER -p tcp -s "$allowed_ip" -d "$container_ip" -j ACCEPT &>/dev/null; then
iptables -D DOCKER-USER -p tcp -s "$allowed_ip" -d "$container_ip" -j ACCEPT
fi
# Снимите правила для выпуска Local Network 127.0.0.0/8
if iptables -C DOCKER-USER -p tcp -s 127.0.0.0/8 -d "$container_ip" -j ACCEPT &>/dev/null; then
iptables -D DOCKER-USER -p tcp -s 127.0.0.0/8 -d "$container_ip" -j ACCEPT
fi
# Четкие правила, которые блокируют все остальные IPS
if iptables -C DOCKER-USER -p udp -d "$container_ip" -j DROP &>/dev/null; then
iptables -D DOCKER-USER -p udp -d "$container_ip" -j DROP
fi
# Очистить правила выпуска указанного IP
if iptables -C DOCKER-USER -p udp -s "$allowed_ip" -d "$container_ip" -j ACCEPT &>/dev/null; then
iptables -D DOCKER-USER -p udp -s "$allowed_ip" -d "$container_ip" -j ACCEPT
fi
# Снимите правила для выпуска Local Network 127.0.0.0/8
if iptables -C DOCKER-USER -p udp -s 127.0.0.0/8 -d "$container_ip" -j ACCEPT &>/dev/null; then
iptables -D DOCKER-USER -p udp -s 127.0.0.0/8 -d "$container_ip" -j ACCEPT
fi
if iptables -C DOCKER-USER -m state --state ESTABLISHED,RELATED -d "$container_ip" -j ACCEPT &>/dev/null; then
iptables -D DOCKER-USER -m state --state ESTABLISHED,RELATED -d "$container_ip" -j ACCEPT
fi
echo "Портам IP+разрешено получить доступ к сервису"
save_iptables_rules
}
block_host_port() {
local port=$1
local allowed_ip=$2
if [[ -z "$port" || -z "$allowed_ip" ]]; then
echo "Ошибка: Пожалуйста, предоставьте номер порта и IP, который разрешается получить доступ."
echo "Использование: block_host_port <Номер порта> <Авторизованный IP>"
return 1
fi
install iptables
# Отрицал весь другой доступ к IP
if ! iptables -C INPUT -p tcp --dport "$port" -j DROP &>/dev/null; then
iptables -I INPUT -p tcp --dport "$port" -j DROP
fi
# Разрешить указанный доступ к IP
if ! iptables -C INPUT -p tcp --dport "$port" -s "$allowed_ip" -j ACCEPT &>/dev/null; then
iptables -I INPUT -p tcp --dport "$port" -s "$allowed_ip" -j ACCEPT
fi
# Разрешить местный доступ
if ! iptables -C INPUT -p tcp --dport "$port" -s 127.0.0.0/8 -j ACCEPT &>/dev/null; then
iptables -I INPUT -p tcp --dport "$port" -s 127.0.0.0/8 -j ACCEPT
fi
# Отрицал весь другой доступ к IP
if ! iptables -C INPUT -p udp --dport "$port" -j DROP &>/dev/null; then
iptables -I INPUT -p udp --dport "$port" -j DROP
fi
# Разрешить указанный доступ к IP
if ! iptables -C INPUT -p udp --dport "$port" -s "$allowed_ip" -j ACCEPT &>/dev/null; then
iptables -I INPUT -p udp --dport "$port" -s "$allowed_ip" -j ACCEPT
fi
# Разрешить местный доступ
if ! iptables -C INPUT -p udp --dport "$port" -s 127.0.0.0/8 -j ACCEPT &>/dev/null; then
iptables -I INPUT -p udp --dport "$port" -s 127.0.0.0/8 -j ACCEPT
fi
# Разрешить трафик для установленных и связанных соединений
if ! iptables -C INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT &>/dev/null; then
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
fi
echo "Порты IP+ были заблокированы от доступа к сервису"
save_iptables_rules
}
clear_host_port_rules() {
local port=$1
local allowed_ip=$2
if [[ -z "$port" || -z "$allowed_ip" ]]; then
echo "Ошибка: Пожалуйста, предоставьте номер порта и IP, который разрешается получить доступ."
echo "Использование: clear_host_port_rules <номер порта> <Авторизованный IP>"
return 1
fi
install iptables
# Очистить правила, которые блокируют все другие доступ к IP
if iptables -C INPUT -p tcp --dport "$port" -j DROP &>/dev/null; then
iptables -D INPUT -p tcp --dport "$port" -j DROP
fi
# Четкие правила, которые допускают нативный доступ
if iptables -C INPUT -p tcp --dport "$port" -s 127.0.0.0/8 -j ACCEPT &>/dev/null; then
iptables -D INPUT -p tcp --dport "$port" -s 127.0.0.0/8 -j ACCEPT
fi
# Очистить правила, которые разрешают указанный доступ к IP
if iptables -C INPUT -p tcp --dport "$port" -s "$allowed_ip" -j ACCEPT &>/dev/null; then
iptables -D INPUT -p tcp --dport "$port" -s "$allowed_ip" -j ACCEPT
fi
# Очистить правила, которые блокируют все другие доступ к IP
if iptables -C INPUT -p udp --dport "$port" -j DROP &>/dev/null; then
iptables -D INPUT -p udp --dport "$port" -j DROP
fi
# Четкие правила, которые допускают нативный доступ
if iptables -C INPUT -p udp --dport "$port" -s 127.0.0.0/8 -j ACCEPT &>/dev/null; then
iptables -D INPUT -p udp --dport "$port" -s 127.0.0.0/8 -j ACCEPT
fi
# Очистить правила, которые разрешают указанный доступ к IP
if iptables -C INPUT -p udp --dport "$port" -s "$allowed_ip" -j ACCEPT &>/dev/null; then
iptables -D INPUT -p udp --dport "$port" -s "$allowed_ip" -j ACCEPT
fi
echo "Портам IP+разрешено получить доступ к сервису"
save_iptables_rules
}
docker_app() {
send_stats "${docker_name}управлять"
while true; do
clear
check_docker_app
check_docker_image_update $docker_name
echo -e "$docker_name $check_docker $update_status"
echo "$docker_describe"
echo "$docker_url"
if docker inspect "$docker_name" &>/dev/null; then
local docker_port=$(docker port "$docker_name" | head -n1 | awk -F'[:]' '/->/ {print $NF; exit}')
docker_port=${docker_port:-0000}
check_docker_app_ip
fi
echo ""
echo "------------------------"
echo "1. Установите 2. Обновление 3. Удалить"
echo "------------------------"
echo "5. Добавьте доменное имя доступа 6. Удалить домен и имя домена"
echo "7. Разрешить IP+ Port Access 8. Block IP+ Access Access"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" choice
case $choice in
1)
check_disk_space $app_size
read -e -p "Введите внешний сервисный порт приложения и введите по умолчанию${docker_port}Порт:" app_port
local app_port=${app_port:-${docker_port}}
local docker_port=$app_port
install jq
install_docker
docker_rum
clear
echo "$docker_nameУстановлен"
check_docker_app_ip
echo ""
$docker_use
$docker_passwd
send_stats "Установить$docker_name"
;;
2)
docker rm -f "$docker_name"
docker rmi -f "$docker_img"
docker_rum
clear
echo "$docker_nameУстановлен"
check_docker_app_ip
echo ""
$docker_use
$docker_passwd
send_stats "обновлять$docker_name"
;;
3)
docker rm -f "$docker_name"
docker rmi -f "$docker_img"
rm -rf "/home/docker/$docker_name"
echo "Приложение было удалено"
send_stats "удалить$docker_name"
;;
5)
echo "${docker_name}Настройки домена домена"
send_stats "${docker_name}Настройки домена домена"
add_yuming
ldnmp_Proxy ${yuming} ${ipv4_address} ${docker_port}
block_container_port "$docker_name" "$ipv4_address"
;;
6)
echo "Формат доменного имени example.com не поставляется с https: //"
web_del
;;
7)
send_stats "Разрешить IP -доступ${docker_name}"
clear_container_rules "$docker_name" "$ipv4_address"
;;
8)
send_stats "Block IP Access${docker_name}"
block_container_port "$docker_name" "$ipv4_address"
;;
*)
break
;;
esac
break_end
done
}
docker_app_plus() {
send_stats "$app_name"
while true; do
clear
check_docker_app
check_docker_image_update $docker_name
echo -e "$app_name $check_docker $update_status"
echo "$app_text"
echo "$app_url"
if docker inspect "$docker_name" &>/dev/null; then
local docker_port=$(docker port "$docker_name" | head -n1 | awk -F'[:]' '/->/ {print $NF; exit}')
docker_port=${docker_port:-0000}
check_docker_app_ip
fi
echo ""
echo "------------------------"
echo "1. Установите 2. Обновление 3. Удалить"
echo "------------------------"
echo "5. Добавьте доменное имя доступа 6. Удалить домен и имя домена"
echo "7. Разрешить IP+ Port Access 8. Block IP+ Access Access"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Введите свой выбор:" choice
case $choice in
1)
check_disk_space $app_size
read -e -p "Введите внешний сервисный порт приложения и введите по умолчанию${docker_port}Порт:" app_port
local app_port=${app_port:-${docker_port}}
local docker_port=$app_port
install jq
install_docker
docker_app_install
;;
2)
docker_app_update
;;
3)
docker_app_uninstall
;;
5)
echo "${docker_name}Настройки домена домена"
send_stats "${docker_name}Настройки домена домена"
add_yuming
ldnmp_Proxy ${yuming} ${ipv4_address} ${docker_port}
block_container_port "$docker_name" "$ipv4_address"
;;
6)
echo "Формат доменного имени example.com не поставляется с https: //"
web_del
;;
7)
send_stats "Разрешить IP -доступ${docker_name}"
clear_container_rules "$docker_name" "$ipv4_address"
;;
8)
send_stats "Block IP Access${docker_name}"
block_container_port "$docker_name" "$ipv4_address"
;;
*)
break
;;
esac
break_end
done
}
prometheus_install() {
local PROMETHEUS_DIR="/home/docker/monitoring/prometheus"
local GRAFANA_DIR="/home/docker/monitoring/grafana"
local NETWORK_NAME="monitoring"
# Create necessary directories
mkdir -p $PROMETHEUS_DIR
mkdir -p $GRAFANA_DIR
# Set correct ownership for Grafana directory
chown -R 472:472 $GRAFANA_DIR
if [ ! -f "$PROMETHEUS_DIR/prometheus.yml" ]; then
curl -o "$PROMETHEUS_DIR/prometheus.yml" ${gh_proxy}raw.githubusercontent.com/kejilion/config/refs/heads/main/prometheus/prometheus.yml
fi
# Create Docker network for monitoring
docker network create $NETWORK_NAME
# Run Node Exporter container
docker run -d \
--name=node-exporter \
--network $NETWORK_NAME \
--restart unless-stopped \
prom/node-exporter
# Run Prometheus container
docker run -d \
--name prometheus \
-v $PROMETHEUS_DIR/prometheus.yml:/etc/prometheus/prometheus.yml \
-v $PROMETHEUS_DIR/data:/prometheus \
--network $NETWORK_NAME \
--restart unless-stopped \
--user 0:0 \
prom/prometheus:latest
# Run Grafana container
docker run -d \
--name grafana \
-p ${docker_port}:3000 \
-v $GRAFANA_DIR:/var/lib/grafana \
--network $NETWORK_NAME \
--restart unless-stopped \
grafana/grafana:latest
}
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
}
tmux_run_d() {
local base_name="tmuxd"
local tmuxd_ID=1
# Функции, которые проверяют, существует ли сеанс
session_exists() {
tmux has-session -t $1 2>/dev/null
}
# Цикл до тех пор, пока не найдено не существующее имя сеанса
while session_exists "$base_name-$tmuxd_ID"; do
local tmuxd_ID=$((tmuxd_ID + 1))
done
# Создать новый сеанс TMUX
tmux new -d -s "$base_name-$tmuxd_ID" "$tmuxd"
}
f2b_status() {
docker exec -it fail2ban fail2ban-client reload
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 ${gh_proxy}raw.githubusercontent.com/kejilion/config/main/fail2ban/alpine-sshd.conf
curl -sS -O ${gh_proxy}raw.githubusercontent.com/kejilion/config/main/fail2ban/alpine-sshd-ddos.conf
cd /path/to/fail2ban/config/fail2ban/jail.d/
curl -sS -O ${gh_proxy}raw.githubusercontent.com/kejilion/config/main/fail2ban/alpine-ssh.conf
elif command -v dnf &>/dev/null; then
cd /path/to/fail2ban/config/fail2ban/jail.d/
curl -sS -O ${gh_proxy}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 ${gh_proxy}raw.githubusercontent.com/kejilion/config/main/fail2ban/linux-ssh.conf
systemctl restart rsyslog
fi
}
f2b_sshd() {
if grep -q 'Alpine' /etc/issue; then
xxx=alpine-sshd
f2b_status_xxx
elif command -v dnf &>/dev/null; then
xxx=centos-sshd
f2b_status_xxx
else
xxx=linux-sshd
f2b_status_xxx
fi
}
server_reboot() {
read -e -p "$(echo -e "${gl_huang}提示: ${gl_bai}现在重启服务器吗?(Y/N): ")" rboot
case "$rboot" in
[Yy])
echo "Перезагружен"
reboot
;;
*)
echo "Отменен"
;;
esac
}
# output_status() {
# output=$(awk 'BEGIN { rx_total = 0; tx_total = 0 }
# # Сопоставьте общие общедоступные сетевые карты имена: ETH*, ENS*, ENP*, ENO*
# $1 ~ /^(eth|ens|enp|eno)[0-9]+/ {
# rx_total += $2
# tx_total += $10
# }
# END {
# rx_units = "Bytes";
# tx_units = "Bytes";
# if (rx_total > 1024) { rx_total /= 1024; rx_units = "K"; }
# if (rx_total > 1024) { rx_total /= 1024; rx_units = "M"; }
# if (rx_total > 1024) { rx_total /= 1024; rx_units = "G"; }
# if (tx_total > 1024) { tx_total /= 1024; tx_units = "K"; }
# if (tx_total > 1024) { tx_total /= 1024; tx_units = "M"; }
# if (tx_total > 1024) { tx_total /= 1024; tx_units = "G"; }
# printf («Общий прием: %.2f %s \ ntotal передача: %.2f %s \ n», rx_total, rx_units, tx_total, tx_units);
# }' /proc/net/dev)
# # echo "$output"
# }
output_status() {
output=$(awk 'BEGIN { rx_total = 0; tx_total = 0 }
$1 ~ /^(eth|ens|enp|eno)[0-9]+/ {
rx_total += $2
tx_total += $10
}
END {
rx_units = "Bytes";
tx_units = "Bytes";
if (rx_total > 1024) { rx_total /= 1024; rx_units = "K"; }
if (rx_total > 1024) { rx_total /= 1024; rx_units = "M"; }
if (rx_total > 1024) { rx_total /= 1024; rx_units = "G"; }
if (tx_total > 1024) { tx_total /= 1024; tx_units = "K"; }
if (tx_total > 1024) { tx_total /= 1024; tx_units = "M"; }
if (tx_total > 1024) { tx_total /= 1024; tx_units = "G"; }
printf("%.2f%s %.2f%s\n", rx_total, rx_units, tx_total, tx_units);
}' /proc/net/dev)
rx=$(echo "$output" | awk '{print $1}')
tx=$(echo "$output" | awk '{print $2}')
}
ldnmp_install_status_one() {
if docker inspect "php" &>/dev/null; then
clear
send_stats "Невозможно снова установить среду LDNMP"
echo -e "${gl_huang}намекать:${gl_bai}Среда строительства веб -сайта установлена. Не нужно снова устанавливать!"
break_end
linux_ldnmp
fi
}
ldnmp_install_all() {
cd ~
send_stats "Установите среду LDNMP"
root_use
clear
echo -e "${gl_huang}Среда LDNMP не установлена, начните установить среду LDNMP ...${gl_bai}"
check_disk_space 3
check_port
install_dependency
install_docker
install_certbot
install_ldnmp_conf
install_ldnmp
}
nginx_install_all() {
cd ~
send_stats "Установите среду Nginx"
root_use
clear
echo -e "${gl_huang}Nginx не установлен, начните установить среду Nginx ...${gl_bai}"
check_disk_space 1
check_port
install_dependency
install_docker
install_certbot
install_ldnmp_conf
nginx_upgrade
clear
local nginx_version=$(docker exec nginx nginx -v 2>&1)
local nginx_version=$(echo "$nginx_version" | grep -oP "nginx/\K[0-9]+\.[0-9]+\.[0-9]+")
echo "nginx был установлен"
echo -e "Текущая версия:${gl_huang}v$nginx_version${gl_bai}"
echo ""
}
ldnmp_install_status() {
if ! docker inspect "php" &>/dev/null; then
send_stats "Пожалуйста, сначала установите среду LDNMP"
ldnmp_install_all
fi
}
nginx_install_status() {
if ! docker inspect "nginx" &>/dev/null; then
send_stats "Пожалуйста, сначала установите среду nginx"
nginx_install_all
fi
}
ldnmp_web_on() {
clear
echo "Ваш$webnameПостроен!"
echo "https://$yuming"
echo "------------------------"
echo "$webnameИнформация об установке следующая:"
}
nginx_web_on() {
clear
echo "Ваш$webnameПостроен!"
echo "https://$yuming"
}
ldnmp_wp() {
clear
# wordpress
webname="WordPress"
yuming="${1:-}"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
if [ -z "$yuming" ]; then
add_yuming
fi
repeat_add_yuming
ldnmp_install_status
install_ssltls
certs_status
add_db
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/wordpress.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
nginx_http_on
cd /home/web/html
mkdir $yuming
cd $yuming
wget -O latest.zip ${gh_proxy}github.com/kejilion/Website_source_code/raw/refs/heads/main/wp-latest.zip
# wget -O latest.zip https://cn.wordpress.org/latest-zh_CN.zip
# wget -O latest.zip https://wordpress.org/latest.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
sed -i "s|database_name_here|$dbname|g" /home/web/html/$yuming/wordpress/wp-config-sample.php
sed -i "s|username_here|$dbuse|g" /home/web/html/$yuming/wordpress/wp-config-sample.php
sed -i "s|password_here|$dbusepasswd|g" /home/web/html/$yuming/wordpress/wp-config-sample.php
sed -i "s|localhost|mysql|g" /home/web/html/$yuming/wordpress/wp-config-sample.php
cp /home/web/html/$yuming/wordpress/wp-config-sample.php /home/web/html/$yuming/wordpress/wp-config.php
restart_ldnmp
nginx_web_on
# Эхо "Имя базы данных: $ dbname"
# Эхо "Имя пользователя: $ dbuse"
# Эхо "пароль: $ dbusepasswd"
# Эхо "Адрес базы данных: mysql"
# Echo "таблица префикс: wp_"
}
ldnmp_Proxy() {
clear
webname="反向代理-IP+端口"
yuming="${1:-}"
reverseproxy="${2:-}"
port="${3:-}"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
if [ -z "$yuming" ]; then
add_yuming
fi
if [ -z "$reverseproxy" ]; then
read -e -p "Пожалуйста, введите свой анти-поколение IP:" reverseproxy
fi
if [ -z "$port" ]; then
read -e -p "Пожалуйста, введите свой порт против поколения:" port
fi
nginx_install_status
install_ssltls
certs_status
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}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
nginx_http_on
docker exec nginx nginx -s reload
nginx_web_on
}
ldnmp_Proxy_backend() {
clear
webname="反向代理-负载均衡"
yuming="${1:-}"
reverseproxy_port="${2:-}"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
if [ -z "$yuming" ]; then
add_yuming
fi
# Получите несколько IPS, введенные пользователем: порты (разделенные пространствами)
if [ -z "$reverseproxy_port" ]; then
read -e -p "Пожалуйста, введите свои порты с несколькими антигенерациями IP+, разделенные пространствами (например, 127.0.0.1:3000 127.0.0.1:3002):" reverseproxy_port
fi
nginx_install_status
install_ssltls
certs_status
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/reverse-proxy-backend.conf
backend=$(tr -dc 'A-Za-z' < /dev/urandom | head -c 8)
sed -i "s/backend_yuming_com/backend_$backend/g" /home/web/conf.d/"$yuming".conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
# Динамически генерировать конфигурацию вверх по течению
upstream_servers=""
for server in $reverseproxy_port; do
upstream_servers="$upstream_servers server $server;\n"
done
# Заменить заполнители в шаблонах
sed -i "s/# 动态添加/$upstream_servers/g" /home/web/conf.d/$yuming.conf
nginx_http_on
docker exec nginx nginx -s reload
nginx_web_on
}
ldnmp_web_status() {
root_use
while true; do
local cert_count=$(ls /home/web/certs/*_cert.pem 2>/dev/null | wc -l)
local output="站点: ${gl_lv}${cert_count}${gl_bai}"
local dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose.yml | tr -d '[:space:]')
local db_count=$(docker exec mysql mysql -u root -p"$dbrootpasswd" -e "SHOW DATABASES;" 2> /dev/null | grep -Ev "Database|information_schema|mysql|performance_schema|sys" | wc -l)
local db_output="数据库: ${gl_lv}${db_count}${gl_bai}"
clear
send_stats "Управление сайтом LDNMP"
echo "LDNMP среда"
echo "------------------------"
ldnmp_v
# ls -t /home/web/conf.d | sed 's/\.[^.]*$//'
echo -e "${output}Срок действия сертификата"
echo -e "------------------------"
for cert_file in /home/web/certs/*_cert.pem; do
local domain=$(basename "$cert_file" | sed 's/_cert.pem//')
if [ -n "$domain" ]; then
local expire_date=$(openssl x509 -noout -enddate -in "$cert_file" | awk -F'=' '{print $2}')
local formatted_date=$(date -d "$expire_date" '+%Y-%m-%d')
printf "%-30s%s\n" "$domain" "$formatted_date"
fi
done
echo "------------------------"
echo ""
echo -e "${db_output}"
echo -e "------------------------"
local 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 "данные${gl_hui}/home/web/html${gl_bai}Сертификат${gl_hui}/home/web/certs${gl_bai}Конфигурация${gl_hui}/home/web/conf.d${gl_bai}"
echo "------------------------"
echo ""
echo "работать"
echo "------------------------"
echo "1. Подать заявку на/обновить сертификат доменного имени. 2. Измените имя домена Сайта"
echo "3. Очистите кэш сайта 4. Создайте связанный сайт"
echo "5. Просмотреть журнал доступа 6. Просмотреть журнал ошибок"
echo "7. Редактировать глобальную конфигурацию 8. Редактировать конфигурацию сайта"
echo "9. Управление базой данных сайта 10. Просмотреть отчет об анализе сайтов"
echo "------------------------"
echo "20. Удалить указанные данные сайта"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
send_stats "Подать заявку на сертификат доменного имени"
read -e -p "Пожалуйста, введите свое доменное имя:" yuming
install_certbot
docker run -it --rm -v /etc/letsencrypt/:/etc/letsencrypt certbot/certbot delete --cert-name "$yuming" -n 2>/dev/null
install_ssltls
certs_status
;;
2)
send_stats "Измените доменное имя сайта"
echo -e "${gl_hong}Настоятельно рекомендуется:${gl_bai}Сначала резервните все данные сайта, а затем измените доменное имя сайта!"
read -e -p "Пожалуйста, введите старое доменное имя:" oddyuming
read -e -p "Пожалуйста, введите новое доменное имя:" yuming
install_certbot
install_ssltls
certs_status
# замена MySQL
add_db
local odd_dbname=$(echo "$oddyuming" | sed -e 's/[^A-Za-z0-9]/_/g')
local odd_dbname="${odd_dbname}"
docker exec mysql mysqldump -u root -p"$dbrootpasswd" $odd_dbname | docker exec -i mysql mysql -u root -p"$dbrootpasswd" $dbname
docker exec mysql mysql -u root -p"$dbrootpasswd" -e "DROP DATABASE $odd_dbname;"
local tables=$(docker exec mysql mysql -u root -p"$dbrootpasswd" -D $dbname -e "SHOW TABLES;" | awk '{ if (NR>1) print $1 }')
for table in $tables; do
columns=$(docker exec mysql mysql -u root -p"$dbrootpasswd" -D $dbname -e "SHOW COLUMNS FROM $table;" | awk '{ if (NR>1) print $1 }')
for column in $columns; do
docker exec mysql mysql -u root -p"$dbrootpasswd" -D $dbname -e "UPDATE $table SET $column = REPLACE($column, '$oddyuming', '$yuming') WHERE $column LIKE '%$oddyuming%';"
done
done
# Замена каталога веб -сайтов
mv /home/web/html/$oddyuming /home/web/html/$yuming
find /home/web/html/$yuming -type f -exec sed -i "s/$odd_dbname/$dbname/g" {} +
find /home/web/html/$yuming -type f -exec sed -i "s/$oddyuming/$yuming/g" {} +
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
rm /home/web/certs/${oddyuming}_key.pem
rm /home/web/certs/${oddyuming}_cert.pem
docker exec nginx nginx -s reload
;;
3)
web_cache
;;
4)
send_stats "Создать связанный сайт"
echo -e "Связывать новое доменное имя для существующего сайта для доступа"
read -e -p "Пожалуйста, введите существующее доменное имя:" oddyuming
read -e -p "Пожалуйста, введите новое доменное имя:" yuming
install_certbot
install_ssltls
certs_status
cp /home/web/conf.d/$oddyuming.conf /home/web/conf.d/$yuming.conf
sed -i "s|server_name $oddyuming|server_name $yuming|g" /home/web/conf.d/$yuming.conf
sed -i "s|/etc/nginx/certs/${oddyuming}_cert.pem|/etc/nginx/certs/${yuming}_cert.pem|g" /home/web/conf.d/$yuming.conf
sed -i "s|/etc/nginx/certs/${oddyuming}_key.pem|/etc/nginx/certs/${yuming}_key.pem|g" /home/web/conf.d/$yuming.conf
docker exec nginx nginx -s reload
;;
5)
send_stats "Просмотреть журнал доступа"
tail -n 200 /home/web/log/nginx/access.log
break_end
;;
6)
send_stats "Просмотреть журнал ошибок"
tail -n 200 /home/web/log/nginx/error.log
break_end
;;
7)
send_stats "Редактировать глобальную конфигурацию"
install nano
nano /home/web/nginx.conf
docker exec nginx nginx -s reload
;;
8)
send_stats "Редактировать конфигурацию сайта"
read -e -p "Чтобы отредактировать конфигурацию сайта, введите доменное имя, которое вы хотите отредактировать:" yuming
install nano
nano /home/web/conf.d/$yuming.conf
docker exec nginx nginx -s reload
;;
9)
phpmyadmin_upgrade
break_end
;;
10)
send_stats "Просмотреть данные сайта"
install goaccess
goaccess --log-format=COMBINED /home/web/log/nginx/access.log
;;
20)
web_del
docker run -it --rm -v /etc/letsencrypt/:/etc/letsencrypt certbot/certbot delete --cert-name "$yuming" -n 2>/dev/null
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
}
check_panel_app() {
if $lujing ; then
check_panel="${gl_lv}已安装${gl_bai}"
else
check_panel=""
fi
}
install_panel() {
send_stats "${panelname}управлять"
while true; do
clear
check_panel_app
echo -e "$panelname $check_panel"
echo "${panelname}В настоящее время это популярная и мощная панель управления операцией и обслуживанием."
echo "Официальное веб -сайт Введение:$panelurl "
echo ""
echo "------------------------"
echo "1. Установить 2. Управление 3. Удалить"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" choice
case $choice in
1)
check_disk_space 1
install wget
iptables_open
panel_app_install
send_stats "${panelname}Установить"
;;
2)
panel_app_manage
send_stats "${panelname}контроль"
;;
3)
panel_app_uninstall
send_stats "${panelname}удалить"
;;
*)
break
;;
esac
break_end
done
}
check_frp_app() {
if [ -d "/home/frp/" ]; then
check_frp="${gl_lv}已安装${gl_bai}"
else
check_frp="${gl_hui}未安装${gl_bai}"
fi
}
donlond_frp() {
mkdir -p /home/frp/ && cd /home/frp/
rm -rf /home/frp/frp_0.61.0_linux_amd64
arch=$(uname -m)
frp_v=$(curl -s https://api.github.com/repos/fatedier/frp/releases/latest | grep -oP '"tag_name": "v\K.*?(?=")')
if [[ "$arch" == "x86_64" ]]; then
curl -L ${gh_proxy}github.com/fatedier/frp/releases/download/v${frp_v}/frp_${frp_v}_linux_amd64.tar.gz -o frp_${frp_v}_linux_amd64.tar.gz
elif [[ "$arch" == "armv7l" || "$arch" == "aarch64" ]]; then
curl -L ${gh_proxy}github.com/fatedier/frp/releases/download/v${frp_v}/frp_${frp_v}_linux_arm.tar.gz -o frp_${frp_v}_linux_amd64.tar.gz
else
echo "Текущая архитектура процессора не поддерживается:$arch"
fi
# Найдите последний загруженный файл FRP
latest_file=$(ls -t /home/frp/frp_*.tar.gz | head -n 1)
# Разанипируйте файл
tar -zxvf "$latest_file"
# Получите имя декомпрессированной папки
dir_name=$(tar -tzf "$latest_file" | head -n 1 | cut -f 1 -d '/')
# Переименовать папку беззазамета в единое имя версии
mv "$dir_name" "frp_0.61.0_linux_amd64"
}
generate_frps_config() {
send_stats "Установите FRP -сервер"
# Генерировать случайные порты и учетные данные
local bind_port=8055
local dashboard_port=8056
local token=$(openssl rand -hex 16)
local dashboard_user="user_$(openssl rand -hex 4)"
local dashboard_pwd=$(openssl rand -hex 8)
donlond_frp
# Создайте файл frps.toml
cat <<EOF > /home/frp/frp_0.61.0_linux_amd64/frps.toml
[common]
bind_port = $bind_port
authentication_method = token
token = $token
dashboard_port = $dashboard_port
dashboard_user = $dashboard_user
dashboard_pwd = $dashboard_pwd
EOF
# Вывод сгенерированной информации
ip_address
echo "------------------------"
echo "Параметры, необходимые для развертывания клиента"
echo "Сервис IP:$ipv4_address"
echo "token: $token"
echo
echo "Информация о панели FRP"
echo "Адрес панели FRP: http: //$ipv4_address:$dashboard_port"
echo "Имя пользователя FRP панели:$dashboard_user"
echo "Пароль панели FRP:$dashboard_pwd"
echo
echo "------------------------"
install tmux
tmux kill-session -t frps >/dev/null 2>&1
tmux new -d -s "frps" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frps -c frps.toml"
check_crontab_installed
crontab -l | grep -v 'frps' | crontab - > /dev/null 2>&1
(crontab -l ; echo '@reboot tmux new -d -s "frps" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frps -c frps.toml"') | crontab - > /dev/null 2>&1
open_port 8055 8056
}
configure_frpc() {
send_stats "Установите клиент FRP"
read -e -p "Пожалуйста, введите внешнюю сеть стыковки стыковки:" server_addr
read -e -p "Пожалуйста, введите токен внешней сети стыковки:" token
echo
if command -v opkg >/dev/null 2>&1; then
opkg update
opkg install grep
fi
donlond_frp
cat <<EOF > /home/frp/frp_0.61.0_linux_amd64/frpc.toml
[common]
server_addr = ${server_addr}
server_port = 8055
token = ${token}
EOF
install tmux
tmux kill-session -t frpc >/dev/null 2>&1
tmux new -d -s "frpc" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frpc -c frpc.toml"
check_crontab_installed
crontab -l | grep -v 'frpc' | crontab - > /dev/null 2>&1
(crontab -l ; echo '@reboot tmux new -d -s "frpc" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frpc -c frpc.toml"') | crontab - > /dev/null 2>&1
open_port 8055
}
add_forwarding_service() {
send_stats "Добавить FRP Intranet Service"
# Позвольте пользователю ввести имя службы и информацию о пересылке
read -e -p "Пожалуйста, введите имя службы:" service_name
read -e -p "Пожалуйста, введите тип пересылки (TCP/UDP) [Enter Default TCP]:" service_type
local service_type=${service_type:-tcp}
read -e -p "Пожалуйста, введите интранет IP [Enter Default 127.0.0.1]:" local_ip
local local_ip=${local_ip:-127.0.0.1}
read -e -p "Пожалуйста, введите интранет -порт:" local_port
read -e -p "Пожалуйста, введите внешний сетевой порт:" remote_port
# Записать пользовательский ввод в файл конфигурации
cat <<EOF >> /home/frp/frp_0.61.0_linux_amd64/frpc.toml
[$service_name]
type = ${service_type}
local_ip = ${local_ip}
local_port = ${local_port}
remote_port = ${remote_port}
EOF
# Вывод сгенерированной информации
echo "Служить$service_nameУспешно добавлен в FRPC.Toml"
tmux kill-session -t frpc >/dev/null 2>&1
tmux new -d -s "frpc" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frpc -c frpc.toml"
open_port $local_port
}
delete_forwarding_service() {
send_stats "Удалить службу интрасети FRP"
# Предложите пользователю ввести имя службы, которое необходимо удалить
read -e -p "Пожалуйста, введите имя службы, которое необходимо удалить:" service_name
# Используйте SED, чтобы удалить службу и связанные с ним конфигурации
sed -i "/\[$service_name\]/,/^$/d" /home/frp/frp_0.61.0_linux_amd64/frpc.toml
echo "Служить$service_nameУспешно удален из FRPC.Toml"
tmux kill-session -t frpc >/dev/null 2>&1
tmux new -d -s "frpc" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frpc -c frpc.toml"
}
list_forwarding_services() {
local config_file="$1"
# Распечатайте заголовок
printf "%-20s %-25s %-30s %-10s\n" "服务名称" "内网地址" "外网地址" "协议"
awk '
BEGIN {
server_addr=""
server_port=""
current_service=""
}
/^server_addr = / {
gsub(/"|'"'"'/, "", $3)
server_addr=$3
}
/^server_port = / {
gsub(/"|'"'"'/, "", $3)
server_port=$3
}
/^\[.*\]/ {
# Если есть информация об обслуживании, распечатайте текущую службу перед обработкой новой службы
if (current_service != "" && current_service != "common" && local_ip != "" && local_port != "") {
printf "%-16s %-21s %-26s %-10s\n", \
current_service, \
local_ip ":" local_port, \
server_addr ":" remote_port, \
type
}
# Обновите текущее имя службы
if ($1 != "[common]") {
gsub(/[\[\]]/, "", $1)
current_service=$1
# Очистить предыдущее значение
local_ip=""
local_port=""
remote_port=""
type=""
}
}
/^local_ip = / {
gsub(/"|'"'"'/, "", $3)
local_ip=$3
}
/^local_port = / {
gsub(/"|'"'"'/, "", $3)
local_port=$3
}
/^remote_port = / {
gsub(/"|'"'"'/, "", $3)
remote_port=$3
}
/^type = / {
gsub(/"|'"'"'/, "", $3)
type=$3
}
END {
# Распечатайте информацию для последней службы
if (current_service != "" && current_service != "common" && local_ip != "" && local_port != "") {
printf "%-16s %-21s %-26s %-10s\n", \
current_service, \
local_ip ":" local_port, \
server_addr ":" remote_port, \
type
}
}' "$config_file"
}
# Получить порт сервера FRP
get_frp_ports() {
mapfile -t ports < <(ss -tulnape | grep frps | awk '{print $5}' | awk -F':' '{print $NF}' | sort -u)
}
# Генерировать адрес доступа
generate_access_urls() {
# Получите все порты в первую очередь
get_frp_ports
# Проверьте, есть ли порты, отличные от 8055/8056
local has_valid_ports=false
for port in "${ports[@]}"; do
if [[ $port != "8055" && $port != "8056" ]]; then
has_valid_ports=true
break
fi
done
# Показать заголовок и контент только тогда, когда есть действительный порт
if [ "$has_valid_ports" = true ]; then
echo "Служба FRP Внешний адрес доступа:"
# Процесс адреса IPv4
for port in "${ports[@]}"; do
if [[ $port != "8055" && $port != "8056" ]]; then
echo "http://${ipv4_address}:${port}"
fi
done
# Обработать адреса IPv6 (если присутствуют)
if [ -n "$ipv6_address" ]; then
for port in "${ports[@]}"; do
if [[ $port != "8055" && $port != "8056" ]]; then
echo "http://[${ipv6_address}]:${port}"
fi
done
fi
# Обработка конфигурации HTTPS
for port in "${ports[@]}"; do
if [[ $port != "8055" && $port != "8056" ]]; then
frps_search_pattern="${ipv4_address}:${port}"
for file in /home/web/conf.d/*.conf; do
if [ -f "$file" ]; then
if grep -q "$frps_search_pattern" "$file" 2>/dev/null; then
echo "https://$(basename "$file" .conf)"
fi
fi
done
fi
done
fi
}
frps_main_ports() {
ip_address
generate_access_urls
}
frps_panel() {
send_stats "FRP -сервер"
local docker_port=8056
while true; do
clear
check_frp_app
echo -e "FRP -сервер$check_frp"
echo "Создайте среду службы проникновения интрасети FR"
echo "Официальное веб -сайт Введение: https://github.com/fatedier/frp/"
echo "Обучение видео: https://www.bilibili.com/video/bv1ymw6e2ewl?t=124.0"
if [ -d "/home/frp/" ]; then
check_docker_app_ip
frps_main_ports
fi
echo ""
echo "------------------------"
echo "1. Установите 2. Обновление 3. Удалить"
echo "------------------------"
echo "5. Доступ к имени доменного имени для интранет -службы 6. Удалить доменное имя"
echo "------------------------"
echo "7. Разрешить IP+ Port Access 8. Block IP+ Access Access"
echo "------------------------"
echo "00. Статус обслуживания обновления 0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Введите свой выбор:" choice
case $choice in
1)
generate_frps_config
rm -rf /home/frp/*.tar.gz
echo "FRP -сервер был установлен"
;;
2)
cp -f /home/frp/frp_0.61.0_linux_amd64/frps.toml /home/frp/frps.toml
donlond_frp
cp -f /home/frp/frps.toml /home/frp/frp_0.61.0_linux_amd64/frps.toml
tmux kill-session -t frps >/dev/null 2>&1
tmux new -d -s "frps" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frps -c frps.toml"
crontab -l | grep -v 'frps' | crontab - > /dev/null 2>&1
(crontab -l ; echo '@reboot tmux new -d -s "frps" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frps -c frps.toml"') | crontab - > /dev/null 2>&1
rm -rf /home/frp/*.tar.gz
echo "Сервер FRP был обновлен"
;;
3)
crontab -l | grep -v 'frps' | crontab - > /dev/null 2>&1
tmux kill-session -t frps >/dev/null 2>&1
rm -rf /home/frp
close_port 8055 8056
echo "Приложение было удалено"
;;
5)
echo "Обратный интранет проникновение"
send_stats "Доступ к внешним доменным именам"
add_yuming
read -e -p "Пожалуйста, введите свой порт службы проникновения интрасети:" frps_port
ldnmp_Proxy ${yuming} ${ipv4_address} ${frps_port}
block_host_port "$frps_port" "$ipv4_address"
;;
6)
echo "Формат доменного имени example.com не поставляется с https: //"
web_del
;;
7)
send_stats "Разрешить IP -доступ"
read -e -p "Пожалуйста, введите порт, который будет выпущен:" frps_port
clear_host_port_rules "$frps_port" "$ipv4_address"
;;
8)
send_stats "Block IP Access"
echo "Если вы получили доступ к имени домена против поколения, вы можете использовать эту функцию для блокировки доступа к порту IP+, что является более безопасным."
read -e -p "Пожалуйста, введите порт, который вам нужно блокировать:" frps_port
block_host_port "$frps_port" "$ipv4_address"
;;
00)
send_stats "Обновить статус обслуживания FRP"
echo "Статус обслуживания FRP был обновлен"
;;
*)
break
;;
esac
break_end
done
}
frpc_panel() {
send_stats "FRP клиент"
local docker_port=8055
while true; do
clear
check_frp_app
echo -e "FRP клиент$check_frp"
echo "Натыкает с сервером, после стыковки вы можете создать службу проникновения интрасети в доступ к Интернету"
echo "Официальное веб -сайт Введение: https://github.com/fatedier/frp/"
echo "Обучение видео: https://www.bilibili.com/video/bv1ymw6e2ewl?t=173.9"
echo "------------------------"
if [ -d "/home/frp/" ]; then
list_forwarding_services "/home/frp/frp_0.61.0_linux_amd64/frpc.toml"
fi
echo ""
echo "------------------------"
echo "1. Установите 2. Обновление 3. Удалить"
echo "------------------------"
echo "4. Добавить внешние службы 5. Удалить внешние сервисы 6. Настроить сервисы вручную"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Введите свой выбор:" choice
case $choice in
1)
configure_frpc
rm -rf /home/frp/*.tar.gz
echo "Клиент FRP был установлен"
;;
2)
cp -f /home/frp/frp_0.61.0_linux_amd64/frpc.toml /home/frp/frpc.toml
donlond_frp
cp -f /home/frp/frpc.toml /home/frp/frp_0.61.0_linux_amd64/frpc.toml
tmux kill-session -t frpc >/dev/null 2>&1
tmux new -d -s "frpc" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frpc -c frpc.toml"
crontab -l | grep -v 'frpc' | crontab - > /dev/null 2>&1
(crontab -l ; echo '@reboot tmux new -d -s "frpc" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frpc -c frpc.toml"') | crontab - > /dev/null 2>&1
rm -rf /home/frp/*.tar.gz
echo "Клиент FRP был обновлен"
;;
3)
crontab -l | grep -v 'frpc' | crontab - > /dev/null 2>&1
tmux kill-session -t frpc >/dev/null 2>&1
rm -rf /home/frp
close_port 8055
echo "Приложение было удалено"
;;
4)
add_forwarding_service
;;
5)
delete_forwarding_service
;;
6)
install nano
nano /home/frp/frp_0.61.0_linux_amd64/frpc.toml
tmux kill-session -t frpc >/dev/null 2>&1
tmux new -d -s "frpc" "cd /home/frp/frp_0.61.0_linux_amd64 && ./frpc -c frpc.toml"
;;
*)
break
;;
esac
break_end
done
}
yt_menu_pro() {
local VIDEO_DIR="/home/yt-dlp"
local URL_FILE="$VIDEO_DIR/urls.txt"
local ARCHIVE_FILE="$VIDEO_DIR/archive.txt"
mkdir -p "$VIDEO_DIR"
while true; do
if [ -x "/usr/local/bin/yt-dlp" ]; then
local YTDLP_STATUS="${gl_lv}已安装${gl_bai}"
else
local YTDLP_STATUS="${gl_hui}未安装${gl_bai}"
fi
clear
send_stats "yt-dlp инструмент загрузки"
echo -e "yt-dlp $YTDLP_STATUS"
echo -e "YT-DLP-мощный инструмент для загрузки видео, который поддерживает тысячи сайтов, включая YouTube, Bilibili, Twitter и т. Д."
echo -e "Официальный адрес веб-сайта: https://github.com/yt-dlp/yt-dlp"
echo "-------------------------"
echo "Скачанный список видео:"
ls -td "$VIDEO_DIR"/*/ 2>/dev/null || echo "(Пока нет)"
echo "-------------------------"
echo "1. Установите 2. Обновление 3. Удалить"
echo "-------------------------"
echo "5. Скачать одно видео 6. Скачать пакетное видео 7. Скачать пользовательский параметр"
echo "8. Скачать как mp3 Audio 9. Удалить видео каталог 10. Управление cookie (в разрабатывании)"
echo "-------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "-------------------------"
read -e -p "Пожалуйста, введите номер опции:" choice
case $choice in
1)
send_stats "Установка YT-DLP ..."
echo "Установка YT-DLP ..."
install ffmpeg
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp
echo "Установка завершена. Нажмите любую клавишу, чтобы продолжить ..."
read ;;
2)
send_stats "Обновление YT-DLP ..."
echo "Обновление YT-DLP ..."
sudo yt-dlp -U
echo "Обновление завершено. Нажмите любую клавишу, чтобы продолжить ..."
read ;;
3)
send_stats "Удаление yt-dlp ..."
echo "Удаление yt-dlp ..."
sudo rm -f /usr/local/bin/yt-dlp
echo "Удаление завершено. Нажмите любую клавишу, чтобы продолжить ..."
read ;;
5)
send_stats "dange пакетное видео"
read -e -p "Пожалуйста, введите ссылку на видео:" url
yt-dlp -P "$VIDEO_DIR" -f "bv*+ba/b" --merge-output-format mp4 \
--write-subs --sub-langs all \
--write-thumbnail --embed-thumbnail \
--write-info-json \
-o "$VIDEO_DIR/%(title)s/%(title)s.%(ext)s" \
--no-overwrites --no-post-overwrites "$url"
read -e -p "После завершения загрузки нажмите любую клавишу, чтобы продолжить ..." ;;
6)
send_stats "Скачать пакетное видео"
install nano
if [ ! -f "$URL_FILE" ]; then
echo -e "# Введите несколько адресов ссылки на видео \ n# https://www.bilibili.com/bangumi/play/ep733316?spm_id_from=333.337.0.0&fom_spmid=666.25.episode.0" > "$URL_FILE"
fi
nano $URL_FILE
echo "Теперь начните партию скачать ..."
yt-dlp -P "$VIDEO_DIR" -f "bv*+ba/b" --merge-output-format mp4 \
--write-subs --sub-langs all \
--write-thumbnail --embed-thumbnail \
--write-info-json \
-a "$URL_FILE" \
-o "$VIDEO_DIR/%(title)s/%(title)s.%(ext)s" \
--no-overwrites --no-post-overwrites
read -e -p "Загрузка партии завершена, нажмите любую клавишу, чтобы продолжить ..." ;;
7)
send_stats "Пользовательский видео скачать"
read -e -p "Пожалуйста, введите полный параметр YT-DLP (без учета YT-DLP):" custom
yt-dlp -P "$VIDEO_DIR" $custom \
--write-subs --sub-langs all \
--write-thumbnail --embed-thumbnail \
--write-info-json \
-o "$VIDEO_DIR/%(title)s/%(title)s.%(ext)s" \
--no-overwrites --no-post-overwrites
read -e -p "После завершения выполнения нажмите любую клавишу, чтобы продолжить ..." ;;
8)
send_stats "Mp3 скачать"
read -e -p "Пожалуйста, введите ссылку на видео:" url
yt-dlp -P "$VIDEO_DIR" -x --audio-format mp3 \
--write-subs --sub-langs all \
--write-thumbnail --embed-thumbnail \
--write-info-json \
-o "$VIDEO_DIR/%(title)s/%(title)s.%(ext)s" \
--no-overwrites --no-post-overwrites "$url"
read -e -p "Загрузка звука завершена, нажмите любую клавишу, чтобы продолжить ..." ;;
9)
send_stats "Удалить видео"
read -e -p "Пожалуйста, введите имя видео Delete:" rmdir
rm -rf "$VIDEO_DIR/$rmdir"
;;
*)
break ;;
esac
done
}
current_timezone() {
if grep -q 'Alpine' /etc/issue; then
date +"%Z %z"
else
timedatectl | grep "Time zone" | awk '{print $3}'
fi
}
set_timedate() {
local 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
}
# Исправить проблему прерывания DPKG
fix_dpkg() {
pkill -9 -f 'apt|dpkg'
rm -f /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock
DEBIAN_FRONTEND=noninteractive dpkg --configure -a
}
linux_update() {
echo -e "${gl_huang}Обновление системы ...${gl_bai}"
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
fix_dpkg
DEBIAN_FRONTEND=noninteractive apt update -y
DEBIAN_FRONTEND=noninteractive apt full-upgrade -y
elif command -v apk &>/dev/null; then
apk update && apk upgrade
elif command -v pacman &>/dev/null; then
pacman -Syu --noconfirm
elif command -v zypper &>/dev/null; then
zypper refresh
zypper update
elif command -v opkg &>/dev/null; then
opkg update
else
echo "Неизвестный менеджер пакетов!"
return
fi
}
linux_clean() {
echo -e "${gl_huang}Очистка системы ...${gl_bai}"
if command -v dnf &>/dev/null; then
rpm --rebuilddb
dnf autoremove -y
dnf clean all
dnf makecache
journalctl --rotate
journalctl --vacuum-time=1s
journalctl --vacuum-size=500M
elif command -v yum &>/dev/null; then
rpm --rebuilddb
yum autoremove -y
yum clean all
yum makecache
journalctl --rotate
journalctl --vacuum-time=1s
journalctl --vacuum-size=500M
elif command -v apt &>/dev/null; then
fix_dpkg
apt autoremove --purge -y
apt clean -y
apt autoclean -y
journalctl --rotate
journalctl --vacuum-time=1s
journalctl --vacuum-size=500M
elif command -v apk &>/dev/null; then
echo "Очистите кеш менеджера пакетов ..."
apk cache clean
echo "Удалить системный журнал ..."
rm -rf /var/log/*
echo "Удалить кеш APK ..."
rm -rf /var/cache/apk/*
echo "Удалить временные файлы ..."
rm -rf /tmp/*
elif command -v pacman &>/dev/null; then
pacman -Rns $(pacman -Qdtq) --noconfirm
pacman -Scc --noconfirm
journalctl --rotate
journalctl --vacuum-time=1s
journalctl --vacuum-size=500M
elif command -v zypper &>/dev/null; then
zypper clean --all
zypper refresh
journalctl --rotate
journalctl --vacuum-time=1s
journalctl --vacuum-size=500M
elif command -v opkg &>/dev/null; then
echo "Удалить системный журнал ..."
rm -rf /var/log/*
echo "Удалить временные файлы ..."
rm -rf /tmp/*
elif command -v pkg &>/dev/null; then
echo "Очистите неиспользованные зависимости ..."
pkg autoremove -y
echo "Очистите кеш менеджера пакетов ..."
pkg clean -y
echo "Удалить системный журнал ..."
rm -rf /var/log/*
echo "Удалить временные файлы ..."
rm -rf /tmp/*
else
echo "Неизвестный менеджер пакетов!"
return
fi
return
}
bbr_on() {
cat > /etc/sysctl.conf << EOF
net.ipv4.tcp_congestion_control=bbr
EOF
sysctl -p
}
set_dns() {
ip_address
rm /etc/resolv.conf
touch /etc/resolv.conf
if [ -n "$ipv4_address" ]; then
echo "nameserver $dns1_ipv4" >> /etc/resolv.conf
echo "nameserver $dns2_ipv4" >> /etc/resolv.conf
fi
if [ -n "$ipv6_address" ]; then
echo "nameserver $dns1_ipv6" >> /etc/resolv.conf
echo "nameserver $dns2_ipv6" >> /etc/resolv.conf
fi
}
set_dns_ui() {
root_use
send_stats "Оптимизировать DNS"
while true; do
clear
echo "Оптимизировать адрес DNS"
echo "------------------------"
echo "Текущий адрес DNS"
cat /etc/resolv.conf
echo "------------------------"
echo ""
echo "1. Оптимизация иностранных DNS:"
echo " v4: 1.1.1.1 8.8.8.8"
echo " v6: 2606:4700:4700::1111 2001:4860:4860::8888"
echo "2. Оптимизация DNS DNS:"
echo " v4: 223.5.5.5 183.60.83.19"
echo " v6: 2400:3200::1 2400:da00::6666"
echo "3. Редактировать конфигурацию DNS вручную"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" Limiting
case "$Limiting" in
1)
local dns1_ipv4="1.1.1.1"
local dns2_ipv4="8.8.8.8"
local dns1_ipv6="2606:4700:4700::1111"
local dns2_ipv6="2001:4860:4860::8888"
set_dns
send_stats "Иностранная оптимизация DNS"
;;
2)
local dns1_ipv4="223.5.5.5"
local dns2_ipv4="183.60.83.19"
local dns1_ipv6="2400:3200::1"
local dns2_ipv6="2400:da00::6666"
set_dns
send_stats "Домашняя оптимизация DNS"
;;
3)
install nano
nano /etc/resolv.conf
send_stats "Редактировать конфигурацию DNS вручную"
;;
*)
break
;;
esac
done
}
restart_ssh() {
restart sshd ssh > /dev/null 2>&1
}
correct_ssh_config() {
local sshd_config="/etc/ssh/sshd_config"
# Если можно найти пароль, установите на да
if grep -Eq "^PasswordAuthentication\s+yes" "$sshd_config"; then
sed -i 's/^\s*#\?\s*PermitRootLogin.*/PermitRootLogin yes/g' "$sshd_config"
sed -i 's/^\s*#\?\s*PasswordAuthentication.*/PasswordAuthentication yes/g' "$sshd_config"
fi
# Если найдено PubkeyAuthentication, установлена ​​да
if grep -Eq "^PubkeyAuthentication\s+yes" "$sshd_config"; then
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/' "$sshd_config"
fi
# Если не совпадает с паролем, ни PubkeyAuthentication, установите значение по умолчанию по умолчанию
if ! grep -Eq "^PasswordAuthentication\s+yes" "$sshd_config" && ! grep -Eq "^PubkeyAuthentication\s+yes" "$sshd_config"; then
sed -i 's/^\s*#\?\s*PermitRootLogin.*/PermitRootLogin yes/g' "$sshd_config"
sed -i 's/^\s*#\?\s*PasswordAuthentication.*/PasswordAuthentication yes/g' "$sshd_config"
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
sed -i "s/Port [0-9]\+/Port $new_port/g" /etc/ssh/sshd_config
correct_ssh_config
rm -rf /etc/ssh/sshd_config.d/* /etc/ssh/ssh_config.d/*
restart_ssh
open_port $new_port
remove iptables-persistent ufw firewalld iptables-services > /dev/null 2>&1
echo "Порт SSH был изменен на:$new_port"
sleep 1
}
add_sshkey() {
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 "Информация о личном ключе была сгенерирована. Обязательно скопируйте и сохраните его.${gl_huang}${ipv4_address}_ssh.key${gl_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 "${gl_lv}Root закрытый ключ включен, вход в систему пароля был закрыт, повторное соединение вступит в силу${gl_bai}"
}
import_sshkey() {
read -e -p "Пожалуйста, введите содержание общедоступного ключа SSH (обычно начиная с «SSH-RSA» или «SSH-ED25519»):" public_key
if [[ -z "$public_key" ]]; then
echo -e "${gl_hong}Ошибка: контент открытого ключа не был введен.${gl_bai}"
return 1
fi
echo "$public_key" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
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 "${gl_lv}Общедоступный ключ был успешно импортирован, вход в root Private Keo${gl_bai}"
}
add_sshpasswd() {
echo "Установите пароль корня"
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 "${gl_lv}Корневой логин настроен!${gl_bai}"
}
root_use() {
clear
[ "$EUID" -ne 0 ] && echo -e "${gl_huang}намекать:${gl_bai}Эта функция требует, чтобы root -пользователь запустил!" && break_end && kejilion
}
dd_xitong() {
send_stats "Переустановить систему"
dd_xitong_MollyLau() {
wget --no-check-certificate -qO InstallNET.sh "${gh_proxy}raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh" && chmod a+x InstallNET.sh
}
dd_xitong_bin456789() {
curl -O ${gh_proxy}raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh
}
dd_xitong_1() {
echo -e "Первоначальное имя пользователя после переустановки:${gl_huang}root${gl_bai}Первоначальный пароль:${gl_huang}LeitboGi0ro${gl_bai}Первоначальный порт:${gl_huang}22${gl_bai}"
echo -e "Нажмите любую клавишу, чтобы продолжить ..."
read -n 1 -s -r -p ""
install wget
dd_xitong_MollyLau
}
dd_xitong_2() {
echo -e "Первоначальное имя пользователя после переустановки:${gl_huang}Administrator${gl_bai}Первоначальный пароль:${gl_huang}Teddysun.com${gl_bai}Первоначальный порт:${gl_huang}3389${gl_bai}"
echo -e "Нажмите любую клавишу, чтобы продолжить ..."
read -n 1 -s -r -p ""
install wget
dd_xitong_MollyLau
}
dd_xitong_3() {
echo -e "Первоначальное имя пользователя после переустановки:${gl_huang}root${gl_bai}Первоначальный пароль:${gl_huang}123@@@${gl_bai}Первоначальный порт:${gl_huang}22${gl_bai}"
echo -e "Нажмите любую клавишу, чтобы продолжить ..."
read -n 1 -s -r -p ""
dd_xitong_bin456789
}
dd_xitong_4() {
echo -e "Первоначальное имя пользователя после переустановки:${gl_huang}Administrator${gl_bai}Первоначальный пароль:${gl_huang}123@@@${gl_bai}Первоначальный порт:${gl_huang}3389${gl_bai}"
echo -e "Нажмите любую клавишу, чтобы продолжить ..."
read -n 1 -s -r -p ""
dd_xitong_bin456789
}
while true; do
root_use
echo "Переустановить систему"
echo "--------------------------------"
echo -e "${gl_hong}Уведомление:${gl_bai}Установка рискованно потерять контакт, и те, кто обеспокоен, должны использовать его с осторожностью. Ожидается, что переустановка займет 15 минут, пожалуйста, резервную копию данных заранее."
echo -e "${gl_hui}Спасибо Моллилау и BIN456789 за поддержку сценария!${gl_bai} "
echo "------------------------"
echo "1. Debian 12 2. Debian 11"
echo "3. Debian 10 4. Debian 9"
echo "------------------------"
echo "11. Ubuntu 24.04 12. Ubuntu 22.04"
echo "13. Ubuntu 20.04 14. Ubuntu 18.04"
echo "------------------------"
echo "21. Rocky Linux 9 22. Rocky Linux 8"
echo "23. Alma Linux 9 24. Alma Linux 8"
echo "25. oracle Linux 9 26. oracle Linux 8"
echo "27. Fedora Linux 41 28. Fedora Linux 40"
echo "29. CentOS 10 30. CentOS 9"
echo "------------------------"
echo "31. Alpine Linux 32. Arch Linux"
echo "33. Kali Linux 34. openEuler"
echo "35."
echo "------------------------"
echo "41. Windows 11 42. Windows 10"
echo "43. Windows 7 44. Windows Server 2022"
echo "45. Windows Server 2019 46. Windows Server 2016"
echo "47. Windows 11 ARM"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, выберите систему для переустановки:" sys_choice
case "$sys_choice" in
1)
send_stats "Переустановите Debian 12"
dd_xitong_1
bash InstallNET.sh -debian 12
reboot
exit
;;
2)
send_stats "Переустановить Debian 11"
dd_xitong_1
bash InstallNET.sh -debian 11
reboot
exit
;;
3)
send_stats "Переустановите Debian 10"
dd_xitong_1
bash InstallNET.sh -debian 10
reboot
exit
;;
4)
send_stats "Переустановите Debian 9"
dd_xitong_1
bash InstallNET.sh -debian 9
reboot
exit
;;
11)
send_stats "Переустановить Ubuntu 24.04"
dd_xitong_1
bash InstallNET.sh -ubuntu 24.04
reboot
exit
;;
12)
send_stats "Переустановить Ubuntu 22.04"
dd_xitong_1
bash InstallNET.sh -ubuntu 22.04
reboot
exit
;;
13)
send_stats "Переустановить Ubuntu 20.04"
dd_xitong_1
bash InstallNET.sh -ubuntu 20.04
reboot
exit
;;
14)
send_stats "Переустановите Ubuntu 18.04"
dd_xitong_1
bash InstallNET.sh -ubuntu 18.04
reboot
exit
;;
21)
send_stats "Переустановите Rockylinux9"
dd_xitong_3
bash reinstall.sh rocky
reboot
exit
;;
22)
send_stats "Переустановите Rockylinux8"
dd_xitong_3
bash reinstall.sh rocky 8
reboot
exit
;;
23)
send_stats "Переустановите Alma9"
dd_xitong_3
bash reinstall.sh almalinux
reboot
exit
;;
24)
send_stats "Переустановите Alma8"
dd_xitong_3
bash reinstall.sh almalinux 8
reboot
exit
;;
25)
send_stats "Переустановить Oracle9"
dd_xitong_3
bash reinstall.sh oracle
reboot
exit
;;
26)
send_stats "Переустановить Oracle8"
dd_xitong_3
bash reinstall.sh oracle 8
reboot
exit
;;
27)
send_stats "Переустановите Fedora41"
dd_xitong_3
bash reinstall.sh fedora
reboot
exit
;;
28)
send_stats "Переустановите Fedora40"
dd_xitong_3
bash reinstall.sh fedora 40
reboot
exit
;;
29)
send_stats "Переустановите CentOS10"
dd_xitong_3
bash reinstall.sh centos 10
reboot
exit
;;
30)
send_stats "Переустановите CentOS9"
dd_xitong_3
bash reinstall.sh centos 9
reboot
exit
;;
31)
send_stats "Переустановите альпийский"
dd_xitong_1
bash InstallNET.sh -alpine
reboot
exit
;;
32)
send_stats "Переустановить арку"
dd_xitong_3
bash reinstall.sh arch
reboot
exit
;;
33)
send_stats "Переустановить Кали"
dd_xitong_3
bash reinstall.sh kali
reboot
exit
;;
34)
send_stats "Переустановите открытый"
dd_xitong_3
bash reinstall.sh openeuler
reboot
exit
;;
35)
send_stats "Переустановка открывает"
dd_xitong_3
bash reinstall.sh opensuse
reboot
exit
;;
36)
send_stats "Перезагрузить летающую корову"
dd_xitong_3
bash reinstall.sh fnos
reboot
exit
;;
41)
send_stats "Переустановите Windows11"
dd_xitong_2
bash InstallNET.sh -windows 11 -lang "cn"
reboot
exit
;;
42)
dd_xitong_2
send_stats "Переустановите Windows 10"
bash InstallNET.sh -windows 10 -lang "cn"
reboot
exit
;;
43)
send_stats "Переустановите Windows 7"
dd_xitong_4
bash reinstall.sh windows --iso="https://drive.massgrave.dev/cn_windows_7_professional_with_sp1_x64_dvd_u_677031.iso" --image-name='Windows 7 PROFESSIONAL'
reboot
exit
;;
44)
send_stats "Переустановить Windows Server 22"
dd_xitong_2
bash InstallNET.sh -windows 2022 -lang "cn"
reboot
exit
;;
45)
send_stats "Переустановить Windows Server 19"
dd_xitong_2
bash InstallNET.sh -windows 2019 -lang "cn"
reboot
exit
;;
46)
send_stats "Переустановить Windows Server 16"
dd_xitong_2
bash InstallNET.sh -windows 2016 -lang "cn"
reboot
exit
;;
47)
send_stats "Переустановить Windows11 ARM"
dd_xitong_4
bash reinstall.sh dd --img https://r2.hotdog.eu.org/win11-arm-with-pagefile-15g.xz
reboot
exit
;;
*)
break
;;
esac
done
}
bbrv3() {
root_use
send_stats "BBRV3 Управление"
local cpu_arch=$(uname -m)
if [ "$cpu_arch" = "aarch64" ]; then
bash <(curl -sL jhb.ovh/jb/bbrv3arm.sh)
break_end
linux_Settings
fi
if dpkg -l | grep -q 'linux-xanmod'; then
while true; do
clear
local kernel_version=$(uname -r)
echo "Вы установили ядро BBRV3 Ксанмода"
echo "Текущая версия ядра:$kernel_version"
echo ""
echo "Управление ядрами"
echo "------------------------"
echo "1. Обновите ядро BBRV3. Установите ядро BBRV3"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -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 - ${gh_proxy}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+')
local version=$(wget -q ${gh_proxy}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 "Ядро ксанмода было обновлено. Вступить в силу после перезапуска"
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 "Ядро ксанмода удаляется. Вступить в силу после перезапуска"
server_reboot
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
else
clear
echo "Настройка ускорения BBR3"
echo "Введение видео: https://www.bilibili.com/video/bv14k421x7bs?t=0.1"
echo "------------------------------------------------"
echo "Только поддержка Debian/Ubuntu"
echo "Пожалуйста, создайте резервную копию данных и позволите BBR3 для обновления ядра Linux."
echo "VPS имеет 512 м память, пожалуйста, добавьте 1G виртуальную память заранее, чтобы предотвратить недостающий контакт из -за недостаточной памяти!"
echo "------------------------------------------------"
read -e -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_end
linux_Settings
fi
else
echo "Невозможно определить тип операционной системы"
break_end
linux_Settings
fi
check_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 - ${gh_proxy}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+')
local version=$(wget -q ${gh_proxy}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
bbr_on
echo "Ядро ксанмода установлено, и 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
}
elrepo_install() {
# Импорт Elrepo GPG Public Key
echo "Импортируйте открытый ключ Elrepo GPG ..."
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# Обнаружение версии системы
local os_version=$(rpm -q --qf "%{VERSION}" $(rpm -qf /etc/os-release) 2>/dev/null | awk -F '.' '{print $1}')
local os_name=$(awk -F= '/^NAME/{print $2}' /etc/os-release)
# Убедитесь, что мы работаем в поддерживаемой операционной системе
if [[ "$os_name" != *"Red Hat"* && "$os_name" != *"AlmaLinux"* && "$os_name" != *"Rocky"* && "$os_name" != *"Oracle"* && "$os_name" != *"CentOS"* ]]; then
echo "Неподдерживаемые операционные системы:$os_name"
break_end
linux_Settings
fi
# Печать обнаруженной информации о операционной системе
echo "Обнаружена операционная система:$os_name $os_version"
# Установите соответствующую конфигурацию склада Elrepo в соответствии с версией системы
if [[ "$os_version" == 8 ]]; then
echo "Установите конфигурацию репозитория Elrepo (версия 8) ..."
yum -y install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
elif [[ "$os_version" == 9 ]]; then
echo "Установите конфигурацию репозитория Elrepo (версия 9) ..."
yum -y install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
else
echo "Неподдерживаемые системные версии:$os_version"
break_end
linux_Settings
fi
# Включить репозиторий Elrepo ядра и установить последнее ядро ​​основного линии
echo "Включите репозиторий Elrepo ядра и установите новейшее ядро Mainline ..."
# yum -y --enablerepo=elrepo-kernel install kernel-ml
yum --nogpgcheck -y --enablerepo=elrepo-kernel install kernel-ml
echo "Конфигурация репозитория Elrepo установлена ​​и обновляется до последнего основного ядра."
server_reboot
}
elrepo() {
root_use
send_stats "Управление ядрами Red Hate"
if uname -r | grep -q 'elrepo'; then
while true; do
clear
kernel_version=$(uname -r)
echo "Вы установили ядро Elrepo"
echo "Текущая версия ядра:$kernel_version"
echo ""
echo "Управление ядрами"
echo "------------------------"
echo "1. Обновите ядро Elrepo 2. Удалить ядро ​​Эльрепо"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
dnf remove -y elrepo-release
rpm -qa | grep elrepo | grep kernel | xargs rpm -e --nodeps
elrepo_install
send_stats "Обновите ядро Red Hate"
server_reboot
;;
2)
dnf remove -y elrepo-release
rpm -qa | grep elrepo | grep kernel | xargs rpm -e --nodeps
echo "Эльрепо ядро ​​удалено. Вступить в силу после перезапуска"
send_stats "Удалить ядр красной хит"
server_reboot
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
else
clear
echo "Пожалуйста, скажите данные и обновите ядро Linux для вас"
echo "Введение видео: https://www.bilibili.com/video/bv1mh4y1w7qa?t=529.2"
echo "------------------------------------------------"
echo "Поддержка только распределения серии Red Hat Centos/Redhat/Alma/Rocky/Oracle"
echo "Обновление ядра Linux может улучшить производительность и безопасность системы. Рекомендуется попробовать это, если условия позволяют и обновлять производственную среду с осторожностью!"
echo "------------------------------------------------"
read -e -p "Вы обязательно продолжите? (Y/N):" choice
case "$choice" in
[Yy])
check_swap
elrepo_install
send_stats "Обновить ядро Red Hate"
server_reboot
;;
[Nn])
echo "Отменен"
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
fi
}
clamav_freshclam() {
echo -e "${gl_huang}Обновите базу данных вирусов ...${gl_bai}"
docker run --rm \
--name clamav \
--mount source=clam_db,target=/var/lib/clamav \
clamav/clamav-debian:latest \
freshclam
}
clamav_scan() {
if [ $# -eq 0 ]; then
echo "Пожалуйста, укажите каталог для сканирования."
return
fi
echo -e "${gl_huang}Сканирующий каталог $@...${gl_bai}"
# Построить параметры крепления
local MOUNT_PARAMS=""
for dir in "$@"; do
MOUNT_PARAMS+="--mount type=bind,source=${dir},target=/mnt/host${dir} "
done
# Построить параметры Clamsscan Command
local SCAN_PARAMS=""
for dir in "$@"; do
SCAN_PARAMS+="/mnt/host${dir} "
done
mkdir -p /home/docker/clamav/log/ > /dev/null 2>&1
> /home/docker/clamav/log/scan.log > /dev/null 2>&1
# Выполнить команды Docker
docker run -it --rm \
--name clamav \
--mount source=clam_db,target=/var/lib/clamav \
$MOUNT_PARAMS \
-v /home/docker/clamav/log/:/var/log/clamav/ \
clamav/clamav-debian:latest \
clamscan -r --log=/var/log/clamav/scan.log $SCAN_PARAMS
echo -e "${gl_lv}$@ Сканирование завершено, отчет о вирусе хранится${gl_huang}/home/docker/clamav/log/scan.log${gl_bai}"
echo -e "${gl_lv}Если есть вирус, пожалуйста${gl_huang}scan.log${gl_lv}Поиск найденного ключевого слова в файле, чтобы подтвердить местоположение вируса${gl_bai}"
}
clamav() {
root_use
send_stats "Управление вирусом"
while true; do
clear
echo "Инструмент сканирования вируса CLAMAV"
echo "Введение видео: https://www.bilibili.com/video/bv1tqvze4eqm?t=0.1"
echo "------------------------"
echo "Это антивирусный программный инструмент с открытым исходным кодом, который в основном используется для обнаружения и удаления различных типов вредоносных программ."
echo "Включая вирусы, троянских лошадей, шпионских программ, вредоносных сценариев и другого вредного программного обеспечения."
echo "------------------------"
echo -e "${gl_lv}1. Полное сканирование диска${gl_bai} ${gl_huang}2. Сканируйте важный каталог${gl_bai} ${gl_kjlan}3. Сканирование пользовательского каталога${gl_bai}"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
send_stats "Полное сканирование диска"
install_docker
docker volume create clam_db > /dev/null 2>&1
clamav_freshclam
clamav_scan /
break_end
;;
2)
send_stats "Важное сканирование каталогов"
install_docker
docker volume create clam_db > /dev/null 2>&1
clamav_freshclam
clamav_scan /etc /var /usr /home /root
break_end
;;
3)
send_stats "Сканирование пользовательского каталога"
read -e -p "Пожалуйста, введите каталог для сканирования, разделенный пространствами (например: /etc /var /usr /home /root):" directories
install_docker
clamav_freshclam
clamav_scan $directories
break_end
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
}
# Функция оптимизации высокопроизводительной режима
optimize_high_performance() {
echo -e "${gl_lv}Переключиться на${tiaoyou_moshi}...${gl_bai}"
echo -e "${gl_lv}Оптимизируйте дескрипторы файлов ...${gl_bai}"
ulimit -n 65535
echo -e "${gl_lv}Оптимизировать виртуальную память ...${gl_bai}"
sysctl -w vm.swappiness=10 2>/dev/null
sysctl -w vm.dirty_ratio=15 2>/dev/null
sysctl -w vm.dirty_background_ratio=5 2>/dev/null
sysctl -w vm.overcommit_memory=1 2>/dev/null
sysctl -w vm.min_free_kbytes=65536 2>/dev/null
echo -e "${gl_lv}Оптимизируйте настройки сети ...${gl_bai}"
sysctl -w net.core.rmem_max=16777216 2>/dev/null
sysctl -w net.core.wmem_max=16777216 2>/dev/null
sysctl -w net.core.netdev_max_backlog=250000 2>/dev/null
sysctl -w net.core.somaxconn=4096 2>/dev/null
sysctl -w net.ipv4.tcp_rmem='4096 87380 16777216' 2>/dev/null
sysctl -w net.ipv4.tcp_wmem='4096 65536 16777216' 2>/dev/null
sysctl -w net.ipv4.tcp_congestion_control=bbr 2>/dev/null
sysctl -w net.ipv4.tcp_max_syn_backlog=8192 2>/dev/null
sysctl -w net.ipv4.tcp_tw_reuse=1 2>/dev/null
sysctl -w net.ipv4.ip_local_port_range='1024 65535' 2>/dev/null
echo -e "${gl_lv}Оптимизируйте управление кэшем ...${gl_bai}"
sysctl -w vm.vfs_cache_pressure=50 2>/dev/null
echo -e "${gl_lv}Оптимизировать настройки процессора ...${gl_bai}"
sysctl -w kernel.sched_autogroup_enabled=0 2>/dev/null
echo -e "${gl_lv}Другие оптимизации ...${gl_bai}"
# Отключить большие прозрачные страницы, чтобы уменьшить задержку
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# Отключить балансировку NUMA
sysctl -w kernel.numa_balancing=0 2>/dev/null
}
# Функция оптимизации режима выравнивания
optimize_balanced() {
echo -e "${gl_lv}Переключитесь в режим выравнивания ...${gl_bai}"
echo -e "${gl_lv}Оптимизируйте дескрипторы файлов ...${gl_bai}"
ulimit -n 32768
echo -e "${gl_lv}Оптимизировать виртуальную память ...${gl_bai}"
sysctl -w vm.swappiness=30 2>/dev/null
sysctl -w vm.dirty_ratio=20 2>/dev/null
sysctl -w vm.dirty_background_ratio=10 2>/dev/null
sysctl -w vm.overcommit_memory=0 2>/dev/null
sysctl -w vm.min_free_kbytes=32768 2>/dev/null
echo -e "${gl_lv}Оптимизируйте настройки сети ...${gl_bai}"
sysctl -w net.core.rmem_max=8388608 2>/dev/null
sysctl -w net.core.wmem_max=8388608 2>/dev/null
sysctl -w net.core.netdev_max_backlog=125000 2>/dev/null
sysctl -w net.core.somaxconn=2048 2>/dev/null
sysctl -w net.ipv4.tcp_rmem='4096 87380 8388608' 2>/dev/null
sysctl -w net.ipv4.tcp_wmem='4096 32768 8388608' 2>/dev/null
sysctl -w net.ipv4.tcp_congestion_control=bbr 2>/dev/null
sysctl -w net.ipv4.tcp_max_syn_backlog=4096 2>/dev/null
sysctl -w net.ipv4.tcp_tw_reuse=1 2>/dev/null
sysctl -w net.ipv4.ip_local_port_range='1024 49151' 2>/dev/null
echo -e "${gl_lv}Оптимизируйте управление кэшем ...${gl_bai}"
sysctl -w vm.vfs_cache_pressure=75 2>/dev/null
echo -e "${gl_lv}Оптимизировать настройки процессора ...${gl_bai}"
sysctl -w kernel.sched_autogroup_enabled=1 2>/dev/null
echo -e "${gl_lv}Другие оптимизации ...${gl_bai}"
# Восстановите прозрачную страницу
echo always > /sys/kernel/mm/transparent_hugepage/enabled
# Восстановите балансировку NUMA
sysctl -w kernel.numa_balancing=1 2>/dev/null
}
# Восстановить функцию настроек по умолчанию
restore_defaults() {
echo -e "${gl_lv}Восстановите настройки по умолчанию ...${gl_bai}"
echo -e "${gl_lv}Восстановить дескриптор файла ...${gl_bai}"
ulimit -n 1024
echo -e "${gl_lv}Восстановите виртуальную память ...${gl_bai}"
sysctl -w vm.swappiness=60 2>/dev/null
sysctl -w vm.dirty_ratio=20 2>/dev/null
sysctl -w vm.dirty_background_ratio=10 2>/dev/null
sysctl -w vm.overcommit_memory=0 2>/dev/null
sysctl -w vm.min_free_kbytes=16384 2>/dev/null
echo -e "${gl_lv}Восстановить настройки сети ...${gl_bai}"
sysctl -w net.core.rmem_max=212992 2>/dev/null
sysctl -w net.core.wmem_max=212992 2>/dev/null
sysctl -w net.core.netdev_max_backlog=1000 2>/dev/null
sysctl -w net.core.somaxconn=128 2>/dev/null
sysctl -w net.ipv4.tcp_rmem='4096 87380 6291456' 2>/dev/null
sysctl -w net.ipv4.tcp_wmem='4096 16384 4194304' 2>/dev/null
sysctl -w net.ipv4.tcp_congestion_control=cubic 2>/dev/null
sysctl -w net.ipv4.tcp_max_syn_backlog=2048 2>/dev/null
sysctl -w net.ipv4.tcp_tw_reuse=0 2>/dev/null
sysctl -w net.ipv4.ip_local_port_range='32768 60999' 2>/dev/null
echo -e "${gl_lv}Восстановите управление кешем ...${gl_bai}"
sysctl -w vm.vfs_cache_pressure=100 2>/dev/null
echo -e "${gl_lv}Восстановите настройки процессора ...${gl_bai}"
sysctl -w kernel.sched_autogroup_enabled=1 2>/dev/null
echo -e "${gl_lv}Восстановить другие оптимизации ...${gl_bai}"
# Восстановите прозрачную страницу
echo always > /sys/kernel/mm/transparent_hugepage/enabled
# Восстановите балансировку NUMA
sysctl -w kernel.numa_balancing=1 2>/dev/null
}
# Функция оптимизации построения веб -сайта
optimize_web_server() {
echo -e "${gl_lv}Переключитесь на режим оптимизации построения веб -сайта ...${gl_bai}"
echo -e "${gl_lv}Оптимизируйте дескрипторы файлов ...${gl_bai}"
ulimit -n 65535
echo -e "${gl_lv}Оптимизировать виртуальную память ...${gl_bai}"
sysctl -w vm.swappiness=10 2>/dev/null
sysctl -w vm.dirty_ratio=20 2>/dev/null
sysctl -w vm.dirty_background_ratio=10 2>/dev/null
sysctl -w vm.overcommit_memory=1 2>/dev/null
sysctl -w vm.min_free_kbytes=65536 2>/dev/null
echo -e "${gl_lv}Оптимизируйте настройки сети ...${gl_bai}"
sysctl -w net.core.rmem_max=16777216 2>/dev/null
sysctl -w net.core.wmem_max=16777216 2>/dev/null
sysctl -w net.core.netdev_max_backlog=5000 2>/dev/null
sysctl -w net.core.somaxconn=4096 2>/dev/null
sysctl -w net.ipv4.tcp_rmem='4096 87380 16777216' 2>/dev/null
sysctl -w net.ipv4.tcp_wmem='4096 65536 16777216' 2>/dev/null
sysctl -w net.ipv4.tcp_congestion_control=bbr 2>/dev/null
sysctl -w net.ipv4.tcp_max_syn_backlog=8192 2>/dev/null
sysctl -w net.ipv4.tcp_tw_reuse=1 2>/dev/null
sysctl -w net.ipv4.ip_local_port_range='1024 65535' 2>/dev/null
echo -e "${gl_lv}Оптимизируйте управление кэшем ...${gl_bai}"
sysctl -w vm.vfs_cache_pressure=50 2>/dev/null
echo -e "${gl_lv}Оптимизировать настройки процессора ...${gl_bai}"
sysctl -w kernel.sched_autogroup_enabled=0 2>/dev/null
echo -e "${gl_lv}Другие оптимизации ...${gl_bai}"
# Отключить большие прозрачные страницы, чтобы уменьшить задержку
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# Отключить балансировку NUMA
sysctl -w kernel.numa_balancing=0 2>/dev/null
}
Kernel_optimize() {
root_use
while true; do
clear
send_stats "Управление настройкой ядра Linux"
echo "Оптимизация параметров ядра в системе Linux"
echo "Введение видео: https://www.bilibili.com/video/bv1kb421j7yg?t=0.1"
echo "------------------------------------------------"
echo "Представлены различные режимы настройки систем, и пользователи могут выбирать и переключаться в соответствии со своими сценариями использования."
echo -e "${gl_huang}намекать:${gl_bai}Пожалуйста, используйте его с осторожностью в производственной среде!"
echo "--------------------"
echo "1. Режим высокопроизводительной оптимизации: максимизировать производительность системы и оптимизировать дескрипторы файлов, виртуальную память, настройки сети, управление кэшем и настройки ЦП."
echo "2. Сбалансированный режим оптимизации: баланс между производительностью и потреблением ресурсов, подходит для ежедневного использования."
echo "3. Режим оптимизации веб -сайта: оптимизируйте для сервера веб -сайта для улучшения возможностей одновременной обработки соединений, скорости отклика и общей производительности."
echo "4."
echo "5. Режим оптимизации игрового сервера: оптимизируйте для игровых серверов для улучшения возможностей параллельной обработки и скорости отклика."
echo "6. Восстановите настройки по умолчанию: восстановить настройки системы в конфигурацию по умолчанию."
echo "--------------------"
echo "0. Вернитесь в предыдущее меню"
echo "--------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
cd ~
clear
local tiaoyou_moshi="高性能优化模式"
optimize_high_performance
send_stats "Оптимизация режима высокой производительности"
;;
2)
cd ~
clear
optimize_balanced
send_stats "Сбалансированная оптимизация режима"
;;
3)
cd ~
clear
optimize_web_server
send_stats "Модель оптимизации веб -сайта"
;;
4)
cd ~
clear
local tiaoyou_moshi="直播优化模式"
optimize_high_performance
send_stats "Живая потоковая оптимизация"
;;
5)
cd ~
clear
local tiaoyou_moshi="游戏服优化模式"
optimize_high_performance
send_stats "Оптимизация игрового сервера"
;;
6)
cd ~
clear
restore_defaults
send_stats "Восстановить настройки по умолчанию"
;;
*)
break
;;
esac
break_end
done
}
update_locale() {
local lang=$1
local locale_file=$2
if [ -f /etc/os-release ]; then
. /etc/os-release
case $ID in
debian|ubuntu|kali)
install locales
sed -i "s/^\s*#\?\s*${locale_file}/${locale_file}/" /etc/locale.gen
locale-gen
echo "LANG=${lang}" > /etc/default/locale
export LANG=${lang}
echo -e "${gl_lv}Язык системы был изменен на:$langВосстанавливающее соединение вступает в силу.${gl_bai}"
hash -r
break_end
;;
centos|rhel|almalinux|rocky|fedora)
install glibc-langpack-zh
localectl set-locale LANG=${lang}
echo "LANG=${lang}" | tee /etc/locale.conf
echo -e "${gl_lv}Язык системы был изменен на:$langВосстанавливающее соединение вступает в силу.${gl_bai}"
hash -r
break_end
;;
*)
echo "Неподдерживаемые системы:$ID"
break_end
;;
esac
else
echo "Неподдерживаемые системы, тип системы не может быть распознан."
break_end
fi
}
linux_language() {
root_use
send_stats "Переключение языка системы"
while true; do
clear
echo "Текущий язык системы:$LANG"
echo "------------------------"
echo "1. Английский 2. Упрощенный китайский 3. Традиционный китайский"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Введите свой выбор:" choice
case $choice in
1)
update_locale "en_US.UTF-8" "en_US.UTF-8"
send_stats "Переключиться на английский"
;;
2)
update_locale "zh_CN.UTF-8" "zh_CN.UTF-8"
send_stats "Переключиться на упрощенный китайский"
;;
3)
update_locale "zh_TW.UTF-8" "zh_TW.UTF-8"
send_stats "Переключиться на традиционный китайский"
;;
*)
break
;;
esac
done
}
shell_bianse_profile() {
if command -v dnf &>/dev/null || command -v yum &>/dev/null; then
sed -i '/^PS1=/d' ~/.bashrc
echo "${bianse}" >> ~/.bashrc
# source ~/.bashrc
else
sed -i '/^PS1=/d' ~/.profile
echo "${bianse}" >> ~/.profile
# source ~/.profile
fi
echo -e "${gl_lv}Изменение завершено. Воссоедините SSH, чтобы просмотреть изменения!${gl_bai}"
hash -r
break_end
}
shell_bianse() {
root_use
send_stats "Инструмент украшения командной строки"
while true; do
clear
echo "Инструмент украшения командной строки"
echo "------------------------"
echo -e "1. \033[1;32mroot \033[1;34mlocalhost \033[1;31m~ \033[0m${gl_bai}#"
echo -e "2. \033[1;35mroot \033[1;36mlocalhost \033[1;33m~ \033[0m${gl_bai}#"
echo -e "3. \033[1;31mroot \033[1;32mlocalhost \033[1;34m~ \033[0m${gl_bai}#"
echo -e "4. \033[1;36mroot \033[1;33mlocalhost \033[1;37m~ \033[0m${gl_bai}#"
echo -e "5. \033[1;37mroot \033[1;31mlocalhost \033[1;32m~ \033[0m${gl_bai}#"
echo -e "6. \033[1;33mroot \033[1;34mlocalhost \033[1;35m~ \033[0m${gl_bai}#"
echo -e "7. root localhost ~ #"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Введите свой выбор:" choice
case $choice in
1)
local bianse="PS1='\[\033[1;32m\]\u\[\033[0m\]@\[\033[1;34m\]\h\[\033[0m\] \[\033[1;31m\]\w\[\033[0m\] # '"
shell_bianse_profile
;;
2)
local bianse="PS1='\[\033[1;35m\]\u\[\033[0m\]@\[\033[1;36m\]\h\[\033[0m\] \[\033[1;33m\]\w\[\033[0m\] # '"
shell_bianse_profile
;;
3)
local bianse="PS1='\[\033[1;31m\]\u\[\033[0m\]@\[\033[1;32m\]\h\[\033[0m\] \[\033[1;34m\]\w\[\033[0m\] # '"
shell_bianse_profile
;;
4)
local bianse="PS1='\[\033[1;36m\]\u\[\033[0m\]@\[\033[1;33m\]\h\[\033[0m\] \[\033[1;37m\]\w\[\033[0m\] # '"
shell_bianse_profile
;;
5)
local bianse="PS1='\[\033[1;37m\]\u\[\033[0m\]@\[\033[1;31m\]\h\[\033[0m\] \[\033[1;32m\]\w\[\033[0m\] # '"
shell_bianse_profile
;;
6)
local bianse="PS1='\[\033[1;33m\]\u\[\033[0m\]@\[\033[1;34m\]\h\[\033[0m\] \[\033[1;35m\]\w\[\033[0m\] # '"
shell_bianse_profile
;;
7)
local bianse=""
shell_bianse_profile
;;
*)
break
;;
esac
done
}
linux_trash() {
root_use
send_stats "Станция по переработке системы"
local bashrc_profile="/root/.bashrc"
local TRASH_DIR="$HOME/.local/share/Trash/files"
while true; do
local trash_status
if ! grep -q "trash-put" "$bashrc_profile"; then
trash_status="${gl_hui}未启用${gl_bai}"
else
trash_status="${gl_lv}已启用${gl_bai}"
fi
clear
echo -e "Текущая корзина для переработки${trash_status}"
echo -e "После включения файлы, удаленные с помощью RM, сначала введены в корзин, чтобы предотвратить ошибочную удаление важных файлов!"
echo "------------------------------------------------"
ls -l --color=auto "$TRASH_DIR" 2>/dev/null || echo "Мусорная корзина пуста"
echo "------------------------"
echo "1. Включить корзин."
echo "3. Восстановить содержание 4. Очистить корзин"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Введите свой выбор:" choice
case $choice in
1)
install trash-cli
sed -i '/alias rm/d' "$bashrc_profile"
echo "alias rm='trash-put'" >> "$bashrc_profile"
source "$bashrc_profile"
echo "Корректная корзина включена, а удаленные файлы будут перемещены в корзину."
sleep 2
;;
2)
remove trash-cli
sed -i '/alias rm/d' "$bashrc_profile"
echo "alias rm='rm -i'" >> "$bashrc_profile"
source "$bashrc_profile"
echo "Утилизация переработки закрыта, и файл будет удален напрямую."
sleep 2
;;
3)
read -e -p "Введите имя файла, чтобы восстановить:" file_to_restore
if [ -e "$TRASH_DIR/$file_to_restore" ]; then
mv "$TRASH_DIR/$file_to_restore" "$HOME/"
echo "$file_to_restoreВосстановлен в домашнем каталоге."
else
echo "Файл не существует."
fi
;;
4)
read -e -p "Подтвердите, чтобы очистить корзинную корзину? [y/n]:" confirm
if [[ "$confirm" == "y" ]]; then
trash-empty
echo "Утильная корзина была очищена."
fi
;;
*)
break
;;
esac
done
}
# Создать резервную копию
create_backup() {
send_stats "Создать резервную копию"
local TIMESTAMP=$(date +"%Y%m%d%H%M%S")
# Позвольте пользователю ввести каталог резервного копирования
echo "Создайте пример резервного копирования:"
echo "- Резервное копирование одного каталога: /var /www"
echo "- Резервное копирование нескольких каталогов: /etc /home /var /log"
echo "- Direct Enter будет использовать каталог по умолчанию ( /etc /usr /home)"
read -r -p "Пожалуйста, введите каталог для резервного копирования (несколько каталогов разделены пространствами, и если вы входите напрямую, используйте каталог по умолчанию):" input
# Если пользователь не вводит каталог, используйте каталог по умолчанию
if [ -z "$input" ]; then
BACKUP_PATHS=(
"/etc" # 配置文件和软件包配置
"/usr" # 已安装的软件文件
"/home" # 用户数据
)
else
# Разделите каталог, введенный пользователем на массив по пространствам
IFS=' ' read -r -a BACKUP_PATHS <<< "$input"
fi
# Генерировать префикс файла резервного копирования
local PREFIX=""
for path in "${BACKUP_PATHS[@]}"; do
# Извлечь имя каталога и удалить черты
dir_name=$(basename "$path")
PREFIX+="${dir_name}_"
done
# Удалить последнее подчеркивание
local PREFIX=${PREFIX%_}
# Генерировать имя файла резервного копирования
local BACKUP_NAME="${PREFIX}_$TIMESTAMP.tar.gz"
# Распечатайте каталог, выбранный пользователем
echo "Выбранный вами каталог резервного копирования:"
for path in "${BACKUP_PATHS[@]}"; do
echo "- $path"
done
# Создать резервную копию
echo "Создание резервной копии$BACKUP_NAME..."
install tar
tar -czvf "$BACKUP_DIR/$BACKUP_NAME" "${BACKUP_PATHS[@]}"
# Проверьте, успешна ли команда
if [ $? -eq 0 ]; then
echo "Резервная копия была создана успешно:$BACKUP_DIR/$BACKUP_NAME"
else
echo "Резервное творение не удалось!"
exit 1
fi
}
# Восстановить резервную копию
restore_backup() {
send_stats "Восстановить резервную копию"
# Выберите резервную копию, которую хотите восстановить
read -e -p "Пожалуйста, введите имя файла резервного копирования, чтобы восстановить:" BACKUP_NAME
# Проверьте, существует ли файл резервного копирования
if [ ! -f "$BACKUP_DIR/$BACKUP_NAME" ]; then
echo "Файл резервного копирования не существует!"
exit 1
fi
echo "Восстановление резервного копирования$BACKUP_NAME..."
tar -xzvf "$BACKUP_DIR/$BACKUP_NAME" -C /
if [ $? -eq 0 ]; then
echo "Резервное копирование и восстановите успешно!"
else
echo "Резервное восстановление не удалось!"
exit 1
fi
}
# Список резервных копий
list_backups() {
echo "Доступные резервные копии:"
ls -1 "$BACKUP_DIR"
}
# Удалить резервную копию
delete_backup() {
send_stats "Удалить резервную копию"
read -e -p "Пожалуйста, введите имя файла резервного копирования, чтобы удалить:" BACKUP_NAME
# Проверьте, существует ли файл резервного копирования
if [ ! -f "$BACKUP_DIR/$BACKUP_NAME" ]; then
echo "Файл резервного копирования не существует!"
exit 1
fi
# Удалить резервную копию
rm -f "$BACKUP_DIR/$BACKUP_NAME"
if [ $? -eq 0 ]; then
echo "Резервное копирование была успешно удалена!"
else
echo "Удаление резервного копирования не удалось!"
exit 1
fi
}
# Резервное главное меню
linux_backup() {
BACKUP_DIR="/backups"
mkdir -p "$BACKUP_DIR"
while true; do
clear
send_stats "Функция резервного копирования системы"
echo "Функция резервного копирования системы"
echo "------------------------"
list_backups
echo "------------------------"
echo "1. Создайте резервную копию 2. Восстановите резервное копирование 3. Удалить резервную копию"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" choice
case $choice in
1) create_backup ;;
2) restore_backup ;;
3) delete_backup ;;
*) break ;;
esac
read -e -p "Нажмите Enter, чтобы продолжить ..."
done
}
# Показать список соединений
list_connections() {
echo "Сохраняемое соединение:"
echo "------------------------"
cat "$CONFIG_FILE" | awk -F'|' '{print NR " - " $1 " (" $2 ")"}'
echo "------------------------"
}
# Добавить новое соединение
add_connection() {
send_stats "Добавить новое соединение"
echo "Пример для создания нового соединения:"
echo "- Имя соединения: my_server"
echo "- IP -адрес: 192.168.1.100"
echo "- Имя пользователя: корень"
echo "- Порт: 22"
echo "------------------------"
read -e -p "Пожалуйста, введите имя подключения:" name
read -e -p "Пожалуйста, введите свой IP -адрес:" ip
read -e -p "Пожалуйста, введите имя пользователя (по умолчанию: root):" user
local user=${user:-root} # 如果用户未输入,则使用默认值 root
read -e -p "Пожалуйста, введите номер порта (по умолчанию: 22):" port
local port=${port:-22} # 如果用户未输入,则使用默认值 22
echo "Пожалуйста, выберите метод аутентификации:"
echo "1. Пароль"
echo "2. Ключ"
read -e -p "Пожалуйста, введите выбор (1/2):" auth_choice
case $auth_choice in
1)
read -s -p "Пожалуйста, введите свой пароль:" password_or_key
echo # 换行
;;
2)
echo "Пожалуйста, вставьте содержимое клавиши (нажмите Enter дважды после вставки):"
local password_or_key=""
while IFS= read -r line; do
# Если вход пуст, а содержимое ключа уже содержит начало, вход заканчивается
if [[ -z "$line" && "$password_or_key" == *"-----BEGIN"* ]]; then
break
fi
# Если это первая строка или контент ключа был введен, продолжайте добавлять
if [[ -n "$line" || "$password_or_key" == *"-----BEGIN"* ]]; then
local password_or_key+="${line}"$'\n'
fi
done
# Проверьте, является ли это контентом ключа
if [[ "$password_or_key" == *"-----BEGIN"* && "$password_or_key" == *"PRIVATE KEY-----"* ]]; then
local key_file="$KEY_DIR/$name.key"
echo -n "$password_or_key" > "$key_file"
chmod 600 "$key_file"
local password_or_key="$key_file"
fi
;;
*)
echo "Неверный выбор!"
return
;;
esac
echo "$name|$ip|$user|$port|$password_or_key" >> "$CONFIG_FILE"
echo "Соединение сохраняется!"
}
# Удалить соединение
delete_connection() {
send_stats "Удалить соединение"
read -e -p "Пожалуйста, введите номер подключения, чтобы удалить:" num
local connection=$(sed -n "${num}p" "$CONFIG_FILE")
if [[ -z "$connection" ]]; then
echo "Ошибка: соответствующее соединение не было найдено."
return
fi
IFS='|' read -r name ip user port password_or_key <<< "$connection"
# Если соединение использует файл ключа, удалите файл ключа
if [[ "$password_or_key" == "$KEY_DIR"* ]]; then
rm -f "$password_or_key"
fi
sed -i "${num}d" "$CONFIG_FILE"
echo "Соединение было удалено!"
}
# Используйте соединение
use_connection() {
send_stats "Используйте соединение"
read -e -p "Пожалуйста, введите номер подключения для использования:" num
local connection=$(sed -n "${num}p" "$CONFIG_FILE")
if [[ -z "$connection" ]]; then
echo "Ошибка: соответствующее соединение не было найдено."
return
fi
IFS='|' read -r name ip user port password_or_key <<< "$connection"
echo "Подключение к$name ($ip)..."
if [[ -f "$password_or_key" ]]; then
# Подключиться с ключом
ssh -o StrictHostKeyChecking=no -i "$password_or_key" -p "$port" "$user@$ip"
if [[ $? -ne 0 ]]; then
echo "Соединение не удалось! Пожалуйста, проверьте следующее:"
echo "1. Правильный ли путь к ключе?$password_or_key"
echo "2. Правильны ли разрешения ключа файла (должно быть 600)."
echo "3. Позволяет ли целевой сервер, используя ключ."
fi
else
# Подключиться с паролем
if ! command -v sshpass &> /dev/null; then
echo "Ошибка: SSHPASS не установлен, пожалуйста, сначала установите SSHPASS."
echo "Метод установки:"
echo " - Ubuntu/Debian: apt install sshpass"
echo " - CentOS/RHEL: yum install sshpass"
return
fi
sshpass -p "$password_or_key" ssh -o StrictHostKeyChecking=no -p "$port" "$user@$ip"
if [[ $? -ne 0 ]]; then
echo "Соединение не удалось! Пожалуйста, проверьте следующее:"
echo "1. Правильны ли имя пользователя и пароль."
echo "2. Позволяет ли целевой сервер входить в систему."
echo "3. Будь то служба SSH целевого сервера работает нормально."
fi
fi
}
ssh_manager() {
send_stats "инструмент удаленного подключения SSH"
CONFIG_FILE="$HOME/.ssh_connections"
KEY_DIR="$HOME/.ssh/ssh_manager_keys"
# Проверьте, существует ли файл конфигурации и каталог ключей, и если он не существует, создайте его
if [[ ! -f "$CONFIG_FILE" ]]; then
touch "$CONFIG_FILE"
fi
if [[ ! -d "$KEY_DIR" ]]; then
mkdir -p "$KEY_DIR"
chmod 700 "$KEY_DIR"
fi
while true; do
clear
echo "Инструмент удаленного подключения SSH"
echo "Может быть подключен к другим системам Linux через SSH"
echo "------------------------"
list_connections
echo "1. Создайте новое соединение 2. Используйте соединение 3. Удалить соединение"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" choice
case $choice in
1) add_connection ;;
2) use_connection ;;
3) delete_connection ;;
0) break ;;
*) echo "Неверный выбор, попробуйте еще раз." ;;
esac
done
}
# Список доступных перегородков жесткого диска
list_partitions() {
echo "Доступные перегородки с жестким диском:"
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT | grep -v "sr\|loop"
}
# Установите перегородку
mount_partition() {
send_stats "Установите перегородку"
read -e -p "Пожалуйста, введите имя разделения, которое будет установлено (например, SDA1):" PARTITION
# Проверьте, существует ли раздел
if ! lsblk -o NAME | grep -w "$PARTITION" > /dev/null; then
echo "Разделение не существует!"
return
fi
# Проверьте, уже установлен, раздел уже
if lsblk -o MOUNTPOINT | grep -w "$PARTITION" > /dev/null; then
echo "Разделение уже установлено!"
return
fi
# Создать точку крепления
MOUNT_POINT="/mnt/$PARTITION"
mkdir -p "$MOUNT_POINT"
# Установите перегородку
mount "/dev/$PARTITION" "$MOUNT_POINT"
if [ $? -eq 0 ]; then
echo "Перегородка успешно:$MOUNT_POINT"
else
echo "Маунт раздела не удалось!"
rmdir "$MOUNT_POINT"
fi
}
# Удалить раздел
unmount_partition() {
send_stats "Удалить раздел"
read -e -p "Пожалуйста, введите имя раздела (например, SDA1):" PARTITION
# Проверьте, уже установлен, раздел уже
MOUNT_POINT=$(lsblk -o MOUNTPOINT | grep -w "$PARTITION")
if [ -z "$MOUNT_POINT" ]; then
echo "Разделение не установлено!"
return
fi
# Удалить раздел
umount "/dev/$PARTITION"
if [ $? -eq 0 ]; then
echo "Перегородка удаляет успешно:$MOUNT_POINT"
rmdir "$MOUNT_POINT"
else
echo "Разделение удаление не удалось!"
fi
}
# Список монтированных разделов
list_mounted_partitions() {
echo "Установленная перегородка:"
df -h | grep -v "tmpfs\|udev\|overlay"
}
# Перегородка формата
format_partition() {
send_stats "Перегородка формата"
read -e -p "Пожалуйста, введите имя раздела в формате (например, SDA1):" PARTITION
# Проверьте, существует ли раздел
if ! lsblk -o NAME | grep -w "$PARTITION" > /dev/null; then
echo "Разделение не существует!"
return
fi
# Проверьте, уже установлен, раздел уже
if lsblk -o MOUNTPOINT | grep -w "$PARTITION" > /dev/null; then
echo "Разделение было установлено, пожалуйста, удалите его первым!"
return
fi
# Выберите тип файловой системы
echo "Пожалуйста, выберите тип файловой системы:"
echo "1. ext4"
echo "2. xfs"
echo "3. ntfs"
echo "4. vfat"
read -e -p "Пожалуйста, введите свой выбор:" FS_CHOICE
case $FS_CHOICE in
1) FS_TYPE="ext4" ;;
2) FS_TYPE="xfs" ;;
3) FS_TYPE="ntfs" ;;
4) FS_TYPE="vfat" ;;
*) echo "Неверный выбор!"; return ;;
esac
# Подтвердите форматирование
read -e -p "Подтвердите форматирование разделения /dev /$PARTITIONдля$FS_TYPEЭто? (Y/N):" CONFIRM
if [ "$CONFIRM" != "y" ]; then
echo "Операция была отменена."
return
fi
# Перегородка формата
echo "Форматирование разделения /dev /$PARTITIONдля$FS_TYPE ..."
mkfs.$FS_TYPE "/dev/$PARTITION"
if [ $? -eq 0 ]; then
echo "Формат разделения был успешным!"
else
echo "Форматирование разделения не удалось!"
fi
}
# Проверьте статус разделения
check_partition() {
send_stats "Проверьте статус разделения"
read -e -p "Пожалуйста, введите имя раздела, чтобы проверить (например, SDA1):" PARTITION
# Проверьте, существует ли раздел
if ! lsblk -o NAME | grep -w "$PARTITION" > /dev/null; then
echo "Разделение не существует!"
return
fi
# Проверьте статус разделения
echo "Проверьте раздел /dev /$PARTITIONСтатус:"
fsck "/dev/$PARTITION"
}
# Основное меню
disk_manager() {
send_stats "Функция управления жестким диском"
while true; do
clear
echo "Управление распределением жестких дисков"
echo -e "${gl_huang}Эта функция протестирована в проведении внутреннего испытания, пожалуйста, не используйте ее в производственной среде.${gl_bai}"
echo "------------------------"
list_partitions
echo "------------------------"
echo "1. Установите раздел 2. Удалить раздел 3. Посмотреть на установленное разделение"
echo "4. Форматируйте раздел 5. Проверьте статус разделения"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" choice
case $choice in
1) mount_partition ;;
2) unmount_partition ;;
3) list_mounted_partitions ;;
4) format_partition ;;
5) check_partition ;;
*) break ;;
esac
read -e -p "Нажмите Enter, чтобы продолжить ..."
done
}
# Показать список задач
list_tasks() {
echo "Сохраненные задачи синхронизации:"
echo "---------------------------------"
awk -F'|' '{print NR " - " $1 " ( " $2 " -> " $3":"$4 " )"}' "$CONFIG_FILE"
echo "---------------------------------"
}
# Добавить новую задачу
add_task() {
send_stats "Добавить новую задачу синхронизации"
echo "Создайте новую задачу синхронизации:"
echo "- Имя задачи: Backup_www"
echo "- локальный каталог: /var /www"
echo "- Удаленный адрес: user@192.168.1.100"
echo "- Удаленный каталог: /Backup /www"
echo "- номер порта (по умолчанию 22)"
echo "---------------------------------"
read -e -p "Пожалуйста, введите имя задачи:" name
read -e -p "Пожалуйста, введите местный каталог:" local_path
read -e -p "Пожалуйста, введите удаленный каталог:" remote_path
read -e -p "Пожалуйста, введите удаленный пользователь @ip:" remote
read -e -p "Пожалуйста, введите порт SSH (по умолчанию 22):" port
port=${port:-22}
echo "Пожалуйста, выберите метод аутентификации:"
echo "1. Пароль"
echo "2. Ключ"
read -e -p "Пожалуйста, выберите (1/2):" auth_choice
case $auth_choice in
1)
read -s -p "Пожалуйста, введите свой пароль:" password_or_key
echo # 换行
auth_method="password"
;;
2)
echo "Пожалуйста, вставьте содержимое клавиши (нажмите Enter дважды после вставки):"
local password_or_key=""
while IFS= read -r line; do
# Если вход пуст, а содержимое ключа уже содержит начало, вход заканчивается
if [[ -z "$line" && "$password_or_key" == *"-----BEGIN"* ]]; then
break
fi
# Если это первая строка или контент ключа был введен, продолжайте добавлять
if [[ -n "$line" || "$password_or_key" == *"-----BEGIN"* ]]; then
password_or_key+="${line}"$'\n'
fi
done
# Проверьте, является ли это контентом ключа
if [[ "$password_or_key" == *"-----BEGIN"* && "$password_or_key" == *"PRIVATE KEY-----"* ]]; then
local key_file="$KEY_DIR/${name}_sync.key"
echo -n "$password_or_key" > "$key_file"
chmod 600 "$key_file"
password_or_key="$key_file"
auth_method="key"
else
echo "Неверный контент ключа!"
return
fi
;;
*)
echo "Неверный выбор!"
return
;;
esac
echo "Пожалуйста, выберите режим синхронизации:"
echo "1. Стандартный режим (-AVZ)"
echo "2. Удалить целевой файл (-avz-delete)"
read -e -p "Пожалуйста, выберите (1/2):" mode
case $mode in
1) options="-avz" ;;
2) options="-avz --delete" ;;
*) echo "Неверный выбор, используйте по умолчанию -AVZ"; options="-avz" ;;
esac
echo "$name|$local_path|$remote|$remote_path|$port|$options|$auth_method|$password_or_key" >> "$CONFIG_FILE"
install rsync rsync
echo "Задача сохранена!"
}
# Удалить задачу
delete_task() {
send_stats "Удалить задачи синхронизации"
read -e -p "Пожалуйста, введите номер задачи, чтобы удалить:" num
local task=$(sed -n "${num}p" "$CONFIG_FILE")
if [[ -z "$task" ]]; then
echo "Ошибка: соответствующая задача не была найдена."
return
fi
IFS='|' read -r name local_path remote remote_path port options auth_method password_or_key <<< "$task"
# Если задача использует файл ключа, удалите файл ключа
if [[ "$auth_method" == "key" && "$password_or_key" == "$KEY_DIR"* ]]; then
rm -f "$password_or_key"
fi
sed -i "${num}d" "$CONFIG_FILE"
echo "Задача удалила!"
}
run_task() {
send_stats "Выполнять задачи синхронизации"
CONFIG_FILE="$HOME/.rsync_tasks"
CRON_FILE="$HOME/.rsync_cron"
# Анализировать параметры
local direction="push" # 默认是推送到远端
local num
if [[ "$1" == "push" || "$1" == "pull" ]]; then
direction="$1"
num="$2"
else
num="$1"
fi
# Если нет входящего номера задачи, предложите пользователю ввести
if [[ -z "$num" ]]; then
read -e -p "Пожалуйста, введите номер выполнения задачи:" num
fi
local task=$(sed -n "${num}p" "$CONFIG_FILE")
if [[ -z "$task" ]]; then
echo "Ошибка: задача не была найдена!"
return
fi
IFS='|' read -r name local_path remote remote_path port options auth_method password_or_key <<< "$task"
# Настроить источник и целевой путь в соответствии с направлением синхронизации
if [[ "$direction" == "pull" ]]; then
echo "Тянуть синхронизацию в локацию:$remote:$local_path -> $remote_path"
source="$remote:$local_path"
destination="$remote_path"
else
echo "Толчок синхронизации к удаленному концу:$local_path -> $remote:$remote_path"
source="$local_path"
destination="$remote:$remote_path"
fi
# Добавить общие параметры подключения SSH
local ssh_options="-p $port -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
if [[ "$auth_method" == "password" ]]; then
if ! command -v sshpass &> /dev/null; then
echo "Ошибка: SSHPASS не установлен, пожалуйста, сначала установите SSHPASS."
echo "Метод установки:"
echo " - Ubuntu/Debian: apt install sshpass"
echo " - CentOS/RHEL: yum install sshpass"
return
fi
sshpass -p "$password_or_key" rsync $options -e "ssh $ssh_options" "$source" "$destination"
else
# Проверьте, существует ли ключевой файл и правильные разрешения
if [[ ! -f "$password_or_key" ]]; then
echo "Ошибка: файл ключа не существует:$password_or_key"
return
fi
if [[ "$(stat -c %a "$password_or_key")" != "600" ]]; then
echo "ПРЕДУПРЕЖДЕНИЕ: Ключевые разрешения файла неверны и ремонтируются ..."
chmod 600 "$password_or_key"
fi
rsync $options -e "ssh -i $password_or_key $ssh_options" "$source" "$destination"
fi
if [[ $? -eq 0 ]]; then
echo "Синхронизация завершена!"
else
echo "Синхронизация не удалась! Пожалуйста, проверьте следующее:"
echo "1. Сетевое соединение нормальным?"
echo "2. Доступен ли удаленный хост?"
echo "3. правильная информация о аутентификации?"
echo "4. Имеют ли локальные и удаленные каталоги правильные разрешения на доступ"
fi
}
# Создать задачу
schedule_task() {
send_stats "Добавить задачи синхронизации"
read -e -p "Пожалуйста, введите номер задачи, чтобы регулярно синхронизировать:" num
if ! [[ "$num" =~ ^[0-9]+$ ]]; then
echo "Ошибка: введите действительный номер задачи!"
return
fi
echo "Пожалуйста, выберите временный интервал выполнения:"
echo "1) выполнять один раз в час"
echo "2) Выступать один раз в день"
echo "3) Выполнять один раз в неделю"
read -e -p "Пожалуйста, введите параметры (1/2/3):" interval
local random_minute=$(shuf -i 0-59 -n 1) # 生成 0-59 之间的随机分钟数
local cron_time=""
case "$interval" in
1) cron_time="$random_minute * * * *" ;; # 每小时,随机分钟执行
2) cron_time="$random_minute 0 * * *" ;; # 每天,随机分钟执行
3) cron_time="$random_minute 0 * * 1" ;; # 每周,随机分钟执行
*) echo "Ошибка: введите действительный вариант!" ; return ;;
esac
local cron_job="$cron_time k rsync_run $num"
local cron_job="$cron_time k rsync_run $num"
# Проверьте, существует ли та же задача
if crontab -l | grep -q "k rsync_run $num"; then
echo "Ошибка: синхронизация времени этой задачи уже существует!"
return
fi
# Создайте Crontab для пользователя
(crontab -l 2>/dev/null; echo "$cron_job") | crontab -
echo "Задача времени была создана:$cron_job"
}
# Посмотреть запланированные задачи
view_tasks() {
echo "Текущие задачи времени:"
echo "---------------------------------"
crontab -l | grep "k rsync_run"
echo "---------------------------------"
}
# Удалить временные задачи
delete_task_schedule() {
send_stats "Удалить задачи синхронизации"
read -e -p "Пожалуйста, введите номер задачи, чтобы удалить:" num
if ! [[ "$num" =~ ^[0-9]+$ ]]; then
echo "Ошибка: введите действительный номер задачи!"
return
fi
crontab -l | grep -v "k rsync_run $num" | crontab -
echo "Удаленный номер задачи$numВремя задач"
}
# Основное меню управления задачами
rsync_manager() {
CONFIG_FILE="$HOME/.rsync_tasks"
CRON_FILE="$HOME/.rsync_cron"
while true; do
clear
echo "Инструмент дистанционной синхронизации RSYNC"
echo "Синхронизация между удаленными каталогами поддерживает инкрементную синхронизацию, эффективную и стабильную."
echo "---------------------------------"
list_tasks
echo
view_tasks
echo
echo "1. Создайте новую задачу 2. Удалить задачу"
echo "3. Выполните локальную синхронизацию с удаленным конец 4. Выполните удаленную синхронизацию до локального конца"
echo "5. Создайте задачу времени 6. Удалить задачу времени"
echo "---------------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "---------------------------------"
read -e -p "Пожалуйста, введите свой выбор:" choice
case $choice in
1) add_task ;;
2) delete_task ;;
3) run_task push;;
4) run_task pull;;
5) schedule_task ;;
6) delete_task_schedule ;;
0) break ;;
*) echo "Неверный выбор, попробуйте еще раз." ;;
esac
read -e -p "Нажмите Enter, чтобы продолжить ..."
done
}
linux_ps() {
clear
send_stats "Информационный запрос системы"
ip_address
local cpu_info=$(lscpu | awk -F': +' '/Model name:/ {print $2; exit}')
local 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))
local cpu_cores=$(nproc)
local cpu_freq=$(cat /proc/cpuinfo | grep "MHz" | head -n 1 | awk '{printf "%.1f GHz\n", $4/1000}')
local mem_info=$(free -b | awk 'NR==2{printf "%.2f/%.2fM (%.2f%%)", $3/1024/1024, $2/1024/1024, $3*100/$2}')
local disk_info=$(df -h | awk '$NF=="/"{printf "%s/%s (%s)", $3, $2, $5}')
local ipinfo=$(curl -s ipinfo.io)
local country=$(echo "$ipinfo" | grep 'country' | awk -F': ' '{print $2}' | tr -d '",')
local city=$(echo "$ipinfo" | grep 'city' | awk -F': ' '{print $2}' | tr -d '",')
local isp_info=$(echo "$ipinfo" | grep 'org' | awk -F': ' '{print $2}' | tr -d '",')
local load=$(uptime | awk '{print $(NF-2), $(NF-1), $NF}')
local dns_addresses=$(awk '/^nameserver/{printf "%s ", $2} END {print ""}' /etc/resolv.conf)
local cpu_arch=$(uname -m)
local hostname=$(uname -n)
local kernel_version=$(uname -r)
local congestion_algorithm=$(sysctl -n net.ipv4.tcp_congestion_control)
local queue_algorithm=$(sysctl -n net.core.default_qdisc)
local os_info=$(grep PRETTY_NAME /etc/os-release | cut -d '=' -f2 | tr -d '"')
output_status
local current_time=$(date "+%Y-%m-%d %I:%M %p")
local swap_info=$(free -m | awk 'NR==3{used=$3; total=$2; if (total == 0) {percentage=0} else {percentage=used*100/total}; printf "%dM/%dM (%d%%)", used, total, percentage}')
local 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)}')
local timezone=$(current_timezone)
echo ""
echo -e "Информационный запрос системы"
echo -e "${gl_kjlan}-------------"
echo -e "${gl_kjlan}Имя хоста:${gl_bai}$hostname"
echo -e "${gl_kjlan}Системная версия:${gl_bai}$os_info"
echo -e "${gl_kjlan}Linux версия:${gl_bai}$kernel_version"
echo -e "${gl_kjlan}-------------"
echo -e "${gl_kjlan}Архитектура процессора:${gl_bai}$cpu_arch"
echo -e "${gl_kjlan}Модель процессора:${gl_bai}$cpu_info"
echo -e "${gl_kjlan}Количество ядер процессора:${gl_bai}$cpu_cores"
echo -e "${gl_kjlan}Частота процессора:${gl_bai}$cpu_freq"
echo -e "${gl_kjlan}-------------"
echo -e "${gl_kjlan}Занятость процессора:${gl_bai}$cpu_usage_percent%"
echo -e "${gl_kjlan}Системная нагрузка:${gl_bai}$load"
echo -e "${gl_kjlan}Физическая память:${gl_bai}$mem_info"
echo -e "${gl_kjlan}Виртуальная память:${gl_bai}$swap_info"
echo -e "${gl_kjlan}Занятие жесткого диска:${gl_bai}$disk_info"
echo -e "${gl_kjlan}-------------"
echo -e "${gl_kjlan}Всего получение:${gl_bai}$rx"
echo -e "${gl_kjlan}Всего отправить:${gl_bai}$tx"
echo -e "${gl_kjlan}-------------"
echo -e "${gl_kjlan}Сетевой алгоритм:${gl_bai}$congestion_algorithm $queue_algorithm"
echo -e "${gl_kjlan}-------------"
echo -e "${gl_kjlan}Оператор:${gl_bai}$isp_info"
if [ -n "$ipv4_address" ]; then
echo -e "${gl_kjlan}Адрес IPv4:${gl_bai}$ipv4_address"
fi
if [ -n "$ipv6_address" ]; then
echo -e "${gl_kjlan}Адрес IPv6:${gl_bai}$ipv6_address"
fi
echo -e "${gl_kjlan}Адрес DNS:${gl_bai}$dns_addresses"
echo -e "${gl_kjlan}Географическое расположение:${gl_bai}$country $city"
echo -e "${gl_kjlan}Системное время:${gl_bai}$timezone $current_time"
echo -e "${gl_kjlan}-------------"
echo -e "${gl_kjlan}Время выполнения:${gl_bai}$runtime"
echo
}
linux_tools() {
while true; do
clear
# send_stats "Основные инструменты"
echo -e "Основные инструменты"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}1. ${gl_bai}Керл загрузок инструмент${gl_huang}${gl_bai} ${gl_kjlan}2. ${gl_bai}Wget Download Tool${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}3. ${gl_bai}Инструмент разрешения Sudo Super Management${gl_kjlan}4. ${gl_bai}Инструмент соединения SOCAT Communication"
echo -e "${gl_kjlan}5. ${gl_bai}Инструмент мониторинга системы HTOP${gl_kjlan}6. ${gl_bai}Инструмент мониторинга сетевого трафика IFTOP"
echo -e "${gl_kjlan}7. ${gl_bai}Инструмент декомпрессии сжатия на молнии${gl_kjlan}8. ${gl_bai}инструмент декомпрессии сжатия TAR GZ"
echo -e "${gl_kjlan}9. ${gl_bai}Multi-Channel Founk Found${gl_kjlan}10. ${gl_bai}FFMPEG Video Codiing Live Streaming Tool"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}11. ${gl_bai}BTOP Modern Monitoring Tools${gl_huang}${gl_bai} ${gl_kjlan}12. ${gl_bai}Инструмент управления файлами диапазона"
echo -e "${gl_kjlan}13. ${gl_bai}инструмент просмотра диска NCDU${gl_kjlan}14. ${gl_bai}FZF Global Search Tool"
echo -e "${gl_kjlan}15. ${gl_bai}VIM Текстовый редактор${gl_kjlan}16. ${gl_bai}Нано текстовый редактор${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}17. ${gl_bai}система управления версией GIT"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}21. ${gl_bai}Гарантия экрана матрицы${gl_kjlan}22. ${gl_bai}Охрана экрана поезда"
echo -e "${gl_kjlan}26. ${gl_bai}Tetris игра${gl_kjlan}27. ${gl_bai}Игра змеи"
echo -e "${gl_kjlan}28. ${gl_bai}Space Invader Game"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}31. ${gl_bai}Установить все${gl_kjlan}32. ${gl_bai}Все инсталляции (за исключением экранов и игр)${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}33. ${gl_bai}Удалить все"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}41. ${gl_bai}Установите указанный инструмент${gl_kjlan}42. ${gl_bai}Удалить указанный инструмент"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}0. ${gl_bai}Вернуться в главное меню"
echo -e "${gl_kjlan}------------------------${gl_bai}"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
clear
install curl
clear
echo "Инструмент был установлен, и метод использования следующим образом:"
curl --help
send_stats "Установите Curl"
;;
2)
clear
install wget
clear
echo "Инструмент был установлен, и метод использования следующим образом:"
wget --help
send_stats "Установите wget"
;;
3)
clear
install sudo
clear
echo "Инструмент был установлен, и метод использования следующим образом:"
sudo --help
send_stats "Установите Sudo"
;;
4)
clear
install socat
clear
echo "Инструмент был установлен, и метод использования следующим образом:"
socat -h
send_stats "Установить Socat"
;;
5)
clear
install htop
clear
htop
send_stats "Установите HTOP"
;;
6)
clear
install iftop
clear
iftop
send_stats "Установите iftop"
;;
7)
clear
install unzip
clear
echo "Инструмент был установлен, и метод использования следующим образом:"
unzip
send_stats "Установите Unzip"
;;
8)
clear
install tar
clear
echo "Инструмент был установлен, и метод использования следующим образом:"
tar --help
send_stats "Установить смолу"
;;
9)
clear
install tmux
clear
echo "Инструмент был установлен, и метод использования следующим образом:"
tmux --help
send_stats "Установите TMUX"
;;
10)
clear
install ffmpeg
clear
echo "Инструмент был установлен, и метод использования следующим образом:"
ffmpeg --help
send_stats "Установите ffmpeg"
;;
11)
clear
install btop
clear
btop
send_stats "Установите BTOP"
;;
12)
clear
install ranger
cd /
clear
ranger
cd ~
send_stats "Установите Ranger"
;;
13)
clear
install ncdu
cd /
clear
ncdu
cd ~
send_stats "Установите NCDU"
;;
14)
clear
install fzf
cd /
clear
fzf
cd ~
send_stats "Установите FZF"
;;
15)
clear
install vim
cd /
clear
vim -h
cd ~
send_stats "Установите Vim"
;;
16)
clear
install nano
cd /
clear
nano -h
cd ~
send_stats "Установите Nano"
;;
17)
clear
install git
cd /
clear
git --help
cd ~
send_stats "Установить git"
;;
21)
clear
install cmatrix
clear
cmatrix
send_stats "Установите Cmatrix"
;;
22)
clear
install sl
clear
sl
send_stats "Установить Sl"
;;
26)
clear
install bastet
clear
bastet
send_stats "Установите Bastet"
;;
27)
clear
install nsnake
clear
nsnake
send_stats "Установите NSNake"
;;
28)
clear
install ninvaders
clear
ninvaders
send_stats "Установите Ninvaders"
;;
31)
clear
send_stats "Установить все"
install curl wget sudo socat htop iftop unzip tar tmux ffmpeg btop ranger ncdu fzf cmatrix sl bastet nsnake ninvaders vim nano git
;;
32)
clear
send_stats "Установите все (за исключением игр и экранов)"
install curl wget sudo socat htop iftop unzip tar tmux ffmpeg btop ranger ncdu fzf vim nano git
;;
33)
clear
send_stats "Удалить все"
remove htop iftop tmux ffmpeg btop ranger ncdu fzf cmatrix sl bastet nsnake ninvaders vim nano git
;;
41)
clear
read -e -p "Пожалуйста, введите установленное имя инструмента (Wget Curl Sudo HTOP):" installname
install $installname
send_stats "Установите указанное программное обеспечение"
;;
42)
clear
read -e -p "Пожалуйста, введите удаленное имя инструмента (HTOP UFW TMUX CMATRIX):" removename
remove $removename
send_stats "Удалить указанное программное обеспечение"
;;
0)
kejilion
;;
*)
echo "Неверный ввод!"
;;
esac
break_end
done
}
linux_bbr() {
clear
send_stats "Управление BBR"
if [ -f "/etc/alpine-release" ]; then
while true; do
clear
local congestion_algorithm=$(sysctl -n net.ipv4.tcp_congestion_control)
local 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 -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
bbr_on
send_stats "Альпийский включает BBR3"
;;
2)
sed -i '/net.ipv4.tcp_congestion_control=bbr/d' /etc/sysctl.conf
sysctl -p
server_reboot
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
else
install wget
wget --no-check-certificate -O tcpx.sh ${gh_proxy}raw.githubusercontent.com/ylx2016/Linux-NetSpeed/master/tcpx.sh
chmod +x tcpx.sh
./tcpx.sh
fi
}
linux_docker() {
while true; do
clear
# send_stats "Docker Management"
echo -e "Docker Management"
docker_tato
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}1. ${gl_bai}Установить и обновить среду Docker${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}2. ${gl_bai}Посмотреть глобальный статус Docker${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}3. ${gl_bai}Управление контейнерами Docker${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}4. ${gl_bai}Docker Management"
echo -e "${gl_kjlan}5. ${gl_bai}Docker Network Management"
echo -e "${gl_kjlan}6. ${gl_bai}Управление томом Docker"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}7. ${gl_bai}Очистите бесполезные контейнеры Docker и зеркальные сетевые объемы данных"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}8. ${gl_bai}Замените источник Docker"
echo -e "${gl_kjlan}9. ${gl_bai}Редактировать файл Daemon.json"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}11. ${gl_bai}Включить доступ Docker-IPV6"
echo -e "${gl_kjlan}12. ${gl_bai}Закрыть доступ к Docker-IPV6"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}20. ${gl_bai}Удалить окружающую среду Docker"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}0. ${gl_bai}Вернуться в главное меню"
echo -e "${gl_kjlan}------------------------${gl_bai}"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
clear
send_stats "Установите среду Docker"
install_add_docker
;;
2)
clear
local container_count=$(docker ps -a -q 2>/dev/null | wc -l)
local image_count=$(docker images -q 2>/dev/null | wc -l)
local network_count=$(docker network ls -q 2>/dev/null | wc -l)
local volume_count=$(docker volume ls -q 2>/dev/null | wc -l)
send_stats "Docker Global Status"
echo "Версия Docker"
docker -v
docker compose version
echo ""
echo -e "Docker Image:${gl_lv}$image_count${gl_bai} "
docker image ls
echo ""
echo -e "Контейнер Docker:${gl_lv}$container_count${gl_bai}"
docker ps -a
echo ""
echo -e "Том Docker:${gl_lv}$volume_count${gl_bai}"
docker volume ls
echo ""
echo -e "Docker Network:${gl_lv}$network_count${gl_bai}"
docker network ls
echo ""
;;
3)
docker_ps
;;
4)
docker_image
;;
5)
while true; do
clear
send_stats "Docker Network Management"
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
local container_info=$(docker inspect --format '{{ .Name }}{{ range $network, $config := .NetworkSettings.Networks }} {{ $network }} {{ $config.IPAddress }}{{ end }}' "$container_id")
local container_name=$(echo "$container_info" | awk '{print $1}')
local network_info=$(echo "$container_info" | cut -d' ' -f2-)
while IFS= read -r line; do
local network_name=$(echo "$line" | awk '{print $1}')
local 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 -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
send_stats "Создать сеть"
read -e -p "Установите новое имя сети:" dockernetwork
docker network create $dockernetwork
;;
2)
send_stats "Присоединяйтесь к Интернету"
read -e -p "Присоединяйтесь к названию сети:" dockernetwork
read -e -p "Эти контейнеры добавляются в сеть (несколько имен контейнеров разделены пространствами):" dockernames
for dockername in $dockernames; do
docker network connect $dockernetwork $dockername
done
;;
3)
send_stats "Присоединяйтесь к Интернету"
read -e -p "Имя сети выйти:" dockernetwork
read -e -p "Эти контейнеры выходят из сети (несколько имен контейнеров разделены пространствами):" dockernames
for dockername in $dockernames; do
docker network disconnect $dockernetwork $dockername
done
;;
4)
send_stats "Удалить сеть"
read -e -p "Пожалуйста, введите имя сети, чтобы удалить:" dockernetwork
docker network rm $dockernetwork
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
6)
while true; do
clear
send_stats "Управление томом Docker"
echo "Список томов Docker"
docker volume ls
echo ""
echo "Объем операций"
echo "------------------------"
echo "1. Создайте новый том"
echo "2. Удалить указанный объем"
echo "3. Удалить все объемы"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
send_stats "Создать новый том"
read -e -p "Установите новое имя тома:" dockerjuan
docker volume create $dockerjuan
;;
2)
read -e -p "Введите имя удаления тома (пожалуйста, разделяйте несколько имен томов с пробелами):" dockerjuans
for dockerjuan in $dockerjuans; do
docker volume rm $dockerjuan
done
;;
3)
send_stats "Удалить все объемы"
read -e -p "$(echo -e "${gl_hong}注意: ${gl_bai}确定删除所有未使用的卷吗?(Y/N): ")" choice
case "$choice" in
[Yy])
docker volume prune -f
;;
[Nn])
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
7)
clear
send_stats "Уборка докеров"
read -e -p "$(echo -e "${gl_huang}提示: ${gl_bai}将清理无用的镜像容器网络,包括停止的容器,确定清理吗?(Y/N): ")" choice
case "$choice" in
[Yy])
docker system prune -af --volumes
;;
[Nn])
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
8)
clear
send_stats "Docker Source"
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
;;
9)
clear
install nano
mkdir -p /etc/docker && nano /etc/docker/daemon.json
restart docker
;;
11)
clear
send_stats "Docker V6 Open"
docker_ipv6_on
;;
12)
clear
send_stats "Docker V6 Уровень"
docker_ipv6_off
;;
20)
clear
send_stats "Docker удаляет"
read -e -p "$(echo -e "${gl_hong}注意: ${gl_bai}确定卸载docker环境吗(Y/N): ")" choice
case "$choice" in
[Yy])
docker ps -a -q | xargs -r docker rm -f && docker images -q | xargs -r docker rmi && docker network prune -f && docker volume prune -f
remove docker docker-compose docker-ce docker-ce-cli containerd.io
rm -f /etc/docker/daemon.json
hash -r
;;
[Nn])
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
0)
kejilion
;;
*)
echo "Неверный ввод!"
;;
esac
break_end
done
}
linux_test() {
while true; do
clear
# send_stats "Коллекция тестовых скриптов"
echo -e "Коллекция тестовых скриптов"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}Обнаружение состояния IP и разблокировки"
echo -e "${gl_kjlan}1. ${gl_bai}Обнаружение статуса разблокировки CHATGPT"
echo -e "${gl_kjlan}2. ${gl_bai}Тест разблокировки потоковой передачи региона"
echo -e "${gl_kjlan}3. ${gl_bai}Да, обнаружение разблокировки потоковых медиа"
echo -e "${gl_kjlan}4. ${gl_bai}xykt ip Quality Examcamination Script${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}Измерение скорости сети"
echo -e "${gl_kjlan}11. ${gl_bai}BestTrace Three Network Backhaul задержка"
echo -e "${gl_kjlan}12. ${gl_bai}MTR_TRACE ТЕРЕ-НЕТКОВОЙ РАЗВИТНЫЙ ТЕСТ ЛИНИИ"
echo -e "${gl_kjlan}13. ${gl_bai}SuperSpeed ​​Трехсети измерение скорости"
echo -e "${gl_kjlan}14. ${gl_bai}NXTRACE Fast Backhaul Test Script"
echo -e "${gl_kjlan}15. ${gl_bai}nxtrace определяет тестовый скрипт IP -обратного анализа"
echo -e "${gl_kjlan}16. ${gl_bai}Тест на линии с тремя сетью Ludashi2020"
echo -e "${gl_kjlan}17. ${gl_bai}I-ABC Multifunction Speed Test Script"
echo -e "${gl_kjlan}18. ${gl_bai}Сценарий физического экзамена по сети NetQuality${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}Тестирование на производительность аппаратного обеспечения"
echo -e "${gl_kjlan}21. ${gl_bai}Ябс тестирование производительности"
echo -e "${gl_kjlan}22. ${gl_bai}Сценарий тестирования производительности процессора IICU/GB5"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}Комплексный тест"
echo -e "${gl_kjlan}31. ${gl_bai}Тест на производительность скамейки"
echo -e "${gl_kjlan}32. ${gl_bai}SpiritySdx Fusion Monster Review${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}0. ${gl_bai}Вернуться в главное меню"
echo -e "${gl_kjlan}------------------------${gl_bai}"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
clear
send_stats "Обнаружение статуса разблокировки CHATGPT"
bash <(curl -Ls https://cdn.jsdelivr.net/gh/missuo/OpenAI-Checker/openai.sh)
;;
2)
clear
send_stats "Тест разблокировки потоковой передачи региона"
bash <(curl -L -s check.unlock.media)
;;
3)
clear
send_stats "Да, обнаружение разблокировки потоковых медиа"
install wget
wget -qO- ${gh_proxy}github.com/yeahwu/check/raw/main/check.sh | bash
;;
4)
clear
send_stats "xykt_ip Quality Examimance Script"
bash <(curl -Ls IP.Check.Place)
;;
11)
clear
send_stats "BestTrace Three Network Backhaul задержка"
install wget
wget -qO- git.io/besttrace | bash
;;
12)
clear
send_stats "MTR_TRACE ТРЕЗАТЬ ТЕСТРЕЙТНЫ"
curl ${gh_proxy}raw.githubusercontent.com/zhucaidan/mtr_trace/main/mtr_trace.sh | bash
;;
13)
clear
send_stats "SuperSpeed ​​Трехсети измерение скорости"
bash <(curl -Lso- https://git.io/superspeed_uxh)
;;
14)
clear
send_stats "NXTRACE Fast Backhaul Test Script"
curl nxtrace.org/nt |bash
nexttrace --fast-trace --tcp
;;
15)
clear
send_stats "nxtrace определяет тестовый скрипт IP -обратного анализа"
echo "Список IPS, на который можно ссылаться"
echo "------------------------"
echo "Пекин Телеком: 219.141.136.12"
echo "Пекин Unicom: 202.106.50.1"
echo "Пекин Мобил: 221.179.155.161"
echo "Shanghai Telecom: 202.96.209.133"
echo "Shanghai Unicom: 210.22.97.1"
echo "Shanghai Mobile: 211.136.112.200"
echo "Guangzhou Telecom: 58.60.188.222"
echo "Guangzhou Unicom: 210.21.196.6"
echo "Guangzhou Mobile: 120.196.165.24"
echo "Чэнду телеком: 61.139.2.69"
echo "Чэнду Юником: 119,6.6.6"
echo "Чэнду Мобил: 211.137.96.205"
echo "Hunan Telecom: 36.111.200.100"
echo "ХУНАН УНИКОМ: 42.48.16.100"
echo "Hunan Mobile: 39.134.254.6"
echo "------------------------"
read -e -p "Введите указанный IP:" testip
curl nxtrace.org/nt |bash
nexttrace $testip
;;
16)
clear
send_stats "Тест на линии с тремя сетью Ludashi2020"
curl ${gh_proxy}raw.githubusercontent.com/ludashi2020/backtrace/main/install.sh -sSf | sh
;;
17)
clear
send_stats "I-ABC Multifunction Speed Test Script"
bash <(curl -sL ${gh_proxy}raw.githubusercontent.com/i-abc/Speedtest/main/speedtest.sh)
;;
18)
clear
send_stats "Сценарий тестирования качества сети"
bash <(curl -sL Net.Check.Place)
;;
21)
clear
send_stats "Ябс тестирование производительности"
check_swap
curl -sL yabs.sh | bash -s -- -i -5
;;
22)
clear
send_stats "Сценарий тестирования производительности процессора IICU/GB5"
check_swap
bash <(curl -sL bash.icu/gb5)
;;
31)
clear
send_stats "Тест на производительность скамейки"
curl -Lso- bench.sh | bash
;;
32)
send_stats "SpiritySdx Fusion Monster Review"
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
}
linux_Oracle() {
while true; do
clear
send_stats "Коллекция сценариев Oracle Cloud"
echo -e "Коллекция сценариев Oracle Cloud"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}1. ${gl_bai}Установите активный скрипт на холостом ходу"
echo -e "${gl_kjlan}2. ${gl_bai}Удалить активный скрипт на холостом ходу."
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}3. ${gl_bai}DD Revestall System Script"
echo -e "${gl_kjlan}4. ${gl_bai}Детектив R START SCRIPT"
echo -e "${gl_kjlan}5. ${gl_bai}Включите режим входа пароля корня"
echo -e "${gl_kjlan}6. ${gl_bai}Инструмент восстановления IPv6"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}0. ${gl_bai}Вернуться в главное меню"
echo -e "${gl_kjlan}------------------------${gl_bai}"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
clear
echo "Активный скрипт: ЦП занимает 10-20% памяти, занимает 20%"
read -e -p "Вы обязательно установите его? (Y/N):" choice
case "$choice" in
[Yy])
install_docker
# Установить значения по умолчанию
local DEFAULT_CPU_CORE=1
local DEFAULT_CPU_UTIL="10-20"
local DEFAULT_MEM_UTIL=20
local DEFAULT_SPEEDTEST_INTERVAL=120
# Помогайте пользователю ввести количество ядер ЦП и процент занятости, и, если введено, используйте значение по умолчанию.
read -e -p "Пожалуйста, введите количество ядер ЦП [по умолчанию:$DEFAULT_CPU_CORE]: " cpu_core
local cpu_core=${cpu_core:-$DEFAULT_CPU_CORE}
read -e -p "Пожалуйста, введите диапазон процентных процентов использования процессора (например, 10-20) [по умолчанию:$DEFAULT_CPU_UTIL]: " cpu_util
local cpu_util=${cpu_util:-$DEFAULT_CPU_UTIL}
read -e -p "Пожалуйста, введите процент использования памяти [по умолчанию:$DEFAULT_MEM_UTIL]: " mem_util
local mem_util=${mem_util:-$DEFAULT_MEM_UTIL}
read -e -p "Пожалуйста, введите время интервала SpeedTest (секунды) [по умолчанию:$DEFAULT_SPEEDTEST_INTERVAL]: " speedtest_interval
local speedtest_interval=${speedtest_interval:-$DEFAULT_SPEEDTEST_INTERVAL}
# Запустите контейнер Docker
docker run -itd --name=lookbusy --restart=always \
-e TZ=Asia/Shanghai \
-e CPU_UTIL="$cpu_util" \
-e CPU_CORE="$cpu_core" \
-e MEM_UTIL="$mem_util" \
-e SPEEDTEST_INTERVAL="$speedtest_interval" \
fogforest/lookbusy
send_stats "Active Script Oracle Cloud Installation"
;;
[Nn])
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
2)
clear
docker rm -f lookbusy
docker rmi fogforest/lookbusy
send_stats "Oracle Cloud удаляет активный скрипт"
;;
3)
clear
echo "Переустановить систему"
echo "--------------------------------"
echo -e "${gl_hong}Уведомление:${gl_bai}Установка рискованно потерять контакт, и те, кто обеспокоен, должны использовать его с осторожностью. Ожидается, что переустановка займет 15 минут, пожалуйста, резервную копию данных заранее."
read -e -p "Вы обязательно продолжите? (Y/N):" choice
case "$choice" in
[Yy])
while true; do
read -e -p "Пожалуйста, выберите систему для переустановки: 1. Debian12 | 2. Ubuntu20.04:" sys_choice
case "$sys_choice" in
1)
local xitong="-d 12"
break # 结束循环
;;
2)
local xitong="-u 20.04"
break # 结束循环
;;
*)
echo "Неверный выбор, пожалуйста, введите."
;;
esac
done
read -e -p "Пожалуйста, введите свой переустаженный пароль:" vpspasswd
install wget
bash <(wget --no-check-certificate -qO- "${gh_proxy}raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh") $xitong -v 64 -p $vpspasswd -port 22
send_stats "System System System Oracle Cloud"
;;
[Nn])
echo "Отменен"
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
4)
clear
echo "Эта функция находится на стадии разработки, так что следите за обновлениями!"
;;
5)
clear
add_sshpasswd
;;
6)
clear
bash <(curl -L -s jhb.ovh/jb/v6.sh)
echo "Эта функция предоставлена ​​мастером JHB, благодаря ему!"
send_stats "IPv6 исправление"
;;
0)
kejilion
;;
*)
echo "Неверный ввод!"
;;
esac
break_end
done
}
docker_tato() {
local container_count=$(docker ps -a -q 2>/dev/null | wc -l)
local image_count=$(docker images -q 2>/dev/null | wc -l)
local network_count=$(docker network ls -q 2>/dev/null | wc -l)
local volume_count=$(docker volume ls -q 2>/dev/null | wc -l)
if command -v docker &> /dev/null; then
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_lv}Среда была установлена${gl_bai}контейнер:${gl_lv}$container_count${gl_bai}Зеркало:${gl_lv}$image_count${gl_bai}сеть:${gl_lv}$network_count${gl_bai}рулон:${gl_lv}$volume_count${gl_bai}"
fi
}
ldnmp_tato() {
local cert_count=$(ls /home/web/certs/*_cert.pem 2>/dev/null | wc -l)
local output="站点: ${gl_lv}${cert_count}${gl_bai}"
local dbrootpasswd=$(grep -oP 'MYSQL_ROOT_PASSWORD:\s*\K.*' /home/web/docker-compose.yml 2>/dev/null | tr -d '[:space:]')
if [ -n "$dbrootpasswd" ]; then
local db_count=$(docker exec mysql mysql -u root -p"$dbrootpasswd" -e "SHOW DATABASES;" 2>/dev/null | grep -Ev "Database|information_schema|mysql|performance_schema|sys" | wc -l)
fi
local db_output="数据库: ${gl_lv}${db_count}${gl_bai}"
if command -v docker &>/dev/null; then
if docker ps --filter "name=nginx" --filter "status=running" | grep -q nginx; then
echo -e "${gl_huang}------------------------"
echo -e "${gl_lv}Среда установлена${gl_bai} $output $db_output"
fi
fi
}
fix_phpfpm_conf() {
local container_name=$1
docker exec "$container_name" sh -c "mkdir -p /run/$container_name && chmod 777 /run/$container_name"
docker exec "$container_name" sh -c "sed -i '1i [global]\\ndaemonize = no' /usr/local/etc/php-fpm.d/www.conf"
docker exec "$container_name" sh -c "sed -i '/^listen =/d' /usr/local/etc/php-fpm.d/www.conf"
docker exec "$container_name" sh -c "echo -e '\nlisten = /run/$container_name/php-fpm.sock\nlisten.owner = www-data\nlisten.group = www-data\nlisten.mode = 0777' >> /usr/local/etc/php-fpm.d/www.conf"
docker exec "$container_name" sh -c "rm -f /usr/local/etc/php-fpm.d/zz-docker.conf"
find /home/web/conf.d/ -type f -name "*.conf" -exec sed -i "s#fastcgi_pass ${container_name}:9000;#fastcgi_pass unix:/run/${container_name}/php-fpm.sock;#g" {} \;
}
linux_ldnmp() {
while true; do
clear
# send_stats "
echo -e "${gl_huang}LDNMP Сайт Построение"
ldnmp_tato
echo -e "${gl_huang}------------------------"
echo -e "${gl_huang}1. ${gl_bai}Установите среду LDNMP${gl_huang}${gl_bai} ${gl_huang}2. ${gl_bai}Установите WordPress${gl_huang}${gl_bai}"
echo -e "${gl_huang}3. ${gl_bai}Установите форум Discuz${gl_huang}4. ${gl_bai}Установите настольный столик Kadao Cloud"
echo -e "${gl_huang}5. ${gl_bai}Установите Apple CMS Film и Television Station${gl_huang}6. ${gl_bai}Установите сеть цифровых карт Unicorn"
echo -e "${gl_huang}7. ${gl_bai}Установите веб -сайт Flarum Forum${gl_huang}8. ${gl_bai}Установите сайт Loolweight Blog Typecho"
echo -e "${gl_huang}9. ${gl_bai}Установите платформу общей ссылки Linkstack${gl_huang}20. ${gl_bai}Настройте динамический сайт"
echo -e "${gl_huang}------------------------"
echo -e "${gl_huang}21. ${gl_bai}Установите только nginx${gl_huang}${gl_bai} ${gl_huang}22. ${gl_bai}Перенаправление сайта"
echo -e "${gl_huang}23. ${gl_bai}Сайт обратный прокси-IP+порт${gl_huang}${gl_bai} ${gl_huang}24. ${gl_bai}Обратный прокси -сайт сайта - доменное имя"
echo -e "${gl_huang}25. ${gl_bai}Установить платформу управления паролями Bitwarden${gl_huang}26. ${gl_bai}Установите сайт блога Halo"
echo -e "${gl_huang}27. ${gl_bai}Установите AI рисунок, генератор слов${gl_huang}28. ${gl_bai}Обратная прокси-нагрузка сайта"
echo -e "${gl_huang}30. ${gl_bai}Настройте статический сайт"
echo -e "${gl_huang}------------------------"
echo -e "${gl_huang}31. ${gl_bai}Управление данными сайта${gl_huang}${gl_bai} ${gl_huang}32. ${gl_bai}Резервное копирование всего сайта"
echo -e "${gl_huang}33. ${gl_bai}Временная удаленная резервная копия${gl_huang}34. ${gl_bai}Восстановить все данные сайта"
echo -e "${gl_huang}------------------------"
echo -e "${gl_huang}35. ${gl_bai}Защита среды LDNMP${gl_huang}36. ${gl_bai}Оптимизировать среду LDNMP"
echo -e "${gl_huang}37. ${gl_bai}Обновление среды LDNMP${gl_huang}38. ${gl_bai}Удаление среды LDNMP"
echo -e "${gl_huang}------------------------"
echo -e "${gl_huang}0. ${gl_bai}Вернуться в главное меню"
echo -e "${gl_huang}------------------------${gl_bai}"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
ldnmp_install_status_one
ldnmp_install_all
;;
2)
ldnmp_wp
;;
3)
clear
# Discuz Forum
webname="Discuz论坛"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
repeat_add_yuming
ldnmp_install_status
install_ssltls
certs_status
add_db
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/discuz.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
nginx_http_on
cd /home/web/html
mkdir $yuming
cd $yuming
wget -O latest.zip ${gh_proxy}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_"
;;
4)
clear
# Кедао облачный рабочий стол
webname="可道云桌面"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
repeat_add_yuming
ldnmp_install_status
install_ssltls
certs_status
add_db
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/kdy.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
nginx_http_on
cd /home/web/html
mkdir $yuming
cd $yuming
wget -O latest.zip ${gh_proxy}github.com/kalcaddle/kodbox/archive/refs/tags/1.50.02.zip
unzip -o latest.zip
rm latest.zip
mv /home/web/html/$yuming/kodbox* /home/web/html/$yuming/kodbox
restart_ldnmp
ldnmp_web_on
echo "Адрес базы данных: MySQL"
echo "имя пользователя:$dbuse"
echo "пароль:$dbusepasswd"
echo "Имя базы данных:$dbname"
echo "Ведущий Redis: Redis"
;;
5)
clear
# Apple CMS
webname="苹果CMS"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
repeat_add_yuming
ldnmp_install_status
install_ssltls
certs_status
add_db
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/maccms.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
nginx_http_on
cd /home/web/html
mkdir $yuming
cd $yuming
# wget ${gh_proxy}github.com/magicblack/maccms_down/raw/master/maccms10.zip && unzip maccms10.zip && rm maccms10.zip
wget ${gh_proxy}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 ${gh_proxy}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 ${gh_proxy}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"
;;
6)
clear
# Одноногие счетные карты
webname="独脚数卡"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
repeat_add_yuming
ldnmp_install_status
install_ssltls
certs_status
add_db
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/dujiaoka.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
nginx_http_on
cd /home/web/html
mkdir $yuming
cd $yuming
wget ${gh_proxy}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 "Фоновый путь входа в систему: /администратор"
echo "------------------------"
echo "Имя пользователя: администратор"
echo "Пароль: администратор"
echo "------------------------"
echo "Если Red Error0 появляется в правом верхнем углу при входе в систему, пожалуйста, используйте следующую команду:"
echo "Я также очень зол, что карта номеров единорога настолько неприятна, и будут такие проблемы!"
echo "sed -i 's/ADMIN_HTTPS=false/ADMIN_HTTPS=true/g' /home/web/html/$yuming/dujiaoka/.env"
;;
7)
clear
# Форум Flarum
webname="flarum论坛"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
repeat_add_yuming
ldnmp_install_status
install_ssltls
certs_status
add_db
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/flarum.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
nginx_http_on
docker exec php rm -f /usr/local/etc/php/conf.d/optimized_php.ini
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"
docker exec php sh -c "cd /var/www/html/$yuming && composer require fof/sitemap"
docker exec php sh -c "cd /var/www/html/$yuming && composer require fof/oauth"
docker exec php sh -c "cd /var/www/html/$yuming && composer require fof/best-answer:*"
docker exec php sh -c "cd /var/www/html/$yuming && composer require v17development/flarum-seo"
docker exec php sh -c "cd /var/www/html/$yuming && composer require clarkwinkelmann/flarum-ext-emojionearea"
restart_ldnmp
ldnmp_web_on
echo "Адрес базы данных: MySQL"
echo "Имя базы данных:$dbname"
echo "имя пользователя:$dbuse"
echo "пароль:$dbusepasswd"
echo "Префикс таблицы: Flarum_"
echo "Информация администратора установлена ​​самостоятельно"
;;
8)
clear
# typecho
webname="typecho"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
repeat_add_yuming
ldnmp_install_status
install_ssltls
certs_status
add_db
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/typecho.com.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
nginx_http_on
cd /home/web/html
mkdir $yuming
cd $yuming
wget -O latest.zip ${gh_proxy}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"
;;
9)
clear
# LinkStack
webname="LinkStack"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
repeat_add_yuming
ldnmp_install_status
install_ssltls
certs_status
add_db
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/refs/heads/main/index_php.conf
sed -i "s|/var/www/html/yuming.com/|/var/www/html/yuming.com/linkstack|g" /home/web/conf.d/$yuming.conf
sed -i "s|yuming.com|$yuming|g" /home/web/conf.d/$yuming.conf
nginx_http_on
cd /home/web/html
mkdir $yuming
cd $yuming
wget -O latest.zip ${gh_proxy}github.com/linkstackorg/linkstack/releases/latest/download/linkstack.zip
unzip latest.zip
rm latest.zip
restart_ldnmp
clear
ldnmp_web_on
echo "Адрес базы данных: MySQL"
echo "Порт базы данных: 3306"
echo "Имя базы данных:$dbname"
echo "имя пользователя:$dbuse"
echo "пароль:$dbusepasswd"
;;
20)
clear
webname="PHP动态站点"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
repeat_add_yuming
ldnmp_install_status
install_ssltls
certs_status
add_db
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/index_php.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
nginx_http_on
cd /home/web/html
mkdir $yuming
cd $yuming
clear
echo -e "[${gl_huang}1/6${gl_bai}] Загрузить исходный код PHP"
echo "-------------"
echo "В настоящее время разрешены только пакеты исходного кода в формате Zip. Пожалуйста, поместите пакеты исходного кода в/home/web/html/${yuming}В каталоге"
read -e -p "Вы также можете ввести ссылку загрузки, чтобы удаленно загрузить пакет исходного кода. Напрямую нажмите Enter, чтобы пропустить удаленную загрузку:" 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 "[${gl_huang}2/6${gl_bai}] Путь, в котором находится index.php"
echo "-------------"
# find "$(realpath .)" -name "index.php" -print
find "$(realpath .)" -name "index.php" -print | xargs -I {} dirname {}
read -e -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 "[${gl_huang}3/6${gl_bai}] Выберите версию PHP"
echo "-------------"
read -e -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
local PHP_Version="php"
;;
2)
sed -i "s#php:9000#php74:9000#g" /home/web/conf.d/$yuming.conf
local PHP_Version="php74"
;;
*)
echo "Неверный выбор, пожалуйста, введите."
;;
esac
clear
echo -e "[${gl_huang}4/6${gl_bai}] Установите указанное расширение"
echo "-------------"
echo "Установленные расширения"
docker exec php php -m
read -e -p "$(echo -e "输入需要安装的扩展名称,如 ${gl_huang}SourceGuardian imap ftp${gl_bai} 等等。直接回车将跳过安装 ")" php_extensions
if [ -n "$php_extensions" ]; then
docker exec $PHP_Version install-php-extensions $php_extensions
fi
clear
echo -e "[${gl_huang}5/6${gl_bai}] Редактировать конфигурацию сайта"
echo "-------------"
echo "Нажмите любую клавишу, чтобы продолжить, и вы можете подробно установить конфигурацию сайта, например, псевдо-статическое содержание и т. Д."
read -n 1 -s -r -p ""
install nano
nano /home/web/conf.d/$yuming.conf
clear
echo -e "[${gl_huang}6/6${gl_bai}] Управление базой данных"
echo "-------------"
read -e -p "1. Я строю новый сайт 2. Я строю старый сайт и имею резервную копию базы данных:" use_db
case $use_db in
1)
echo
;;
2)
echo "Резервное копирование базы данных должно быть сжатым пакетом. Пожалуйста, поместите его в/дом/каталог, чтобы поддержать импорт данных резервного копирования Pagoda/1panel."
read -e -p "Вы также можете ввести ссылку загрузки, чтобы удаленно загрузить данные резервного копирования. Напрямую нажмите Enter" 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
docker exec php rm -f /usr/local/etc/php/conf.d/optimized_php.ini
restart_ldnmp
ldnmp_web_on
prefix="web$(shuf -i 10-99 -n 1)_"
echo "Адрес базы данных: MySQL"
echo "Имя базы данных:$dbname"
echo "имя пользователя:$dbuse"
echo "пароль:$dbusepasswd"
echo "Префикс таблицы:$prefix"
echo "Информация администратора входа в систему установлена ​​самостоятельно"
;;
21)
ldnmp_install_status_one
nginx_install_all
;;
22)
clear
webname="站点重定向"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
read -e -p "Пожалуйста, введите имя домена Jump:" reverseproxy
nginx_install_status
install_ssltls
certs_status
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}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
nginx_http_on
docker exec nginx nginx -s reload
nginx_web_on
;;
23)
ldnmp_Proxy
;;
24)
clear
webname="反向代理-域名"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
echo -e "Формат доменного имени:${gl_huang}google.com${gl_bai}"
read -e -p "Пожалуйста, введите свое имя доменного антигенерации:" fandai_yuming
nginx_install_status
install_ssltls
certs_status
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}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
nginx_http_on
docker exec nginx nginx -s reload
nginx_web_on
;;
25)
clear
webname="Bitwarden"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
nginx_install_status
install_ssltls
certs_status
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
;;
26)
clear
webname="halo"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
nginx_install_status
install_ssltls
certs_status
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
;;
27)
clear
webname="AI绘画提示词生成器"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
nginx_install_status
install_ssltls
certs_status
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/html.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
nginx_http_on
cd /home/web/html
mkdir $yuming
cd $yuming
wget ${gh_proxy}github.com/kejilion/Website_source_code/raw/refs/heads/main/ai_prompt_generator.zip
unzip $(ls -t *.zip | head -n 1)
rm -f $(ls -t *.zip | head -n 1)
docker exec nginx chmod -R nginx:nginx /var/www/html
docker exec nginx nginx -s reload
nginx_web_on
;;
28)
ldnmp_Proxy_backend
;;
30)
clear
webname="静态站点"
send_stats "Установить$webname"
echo "Начните развертывание$webname"
add_yuming
repeat_add_yuming
nginx_install_status
install_ssltls
certs_status
wget -O /home/web/conf.d/$yuming.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/html.conf
sed -i "s/yuming.com/$yuming/g" /home/web/conf.d/$yuming.conf
nginx_http_on
cd /home/web/html
mkdir $yuming
cd $yuming
clear
echo -e "[${gl_huang}1/2${gl_bai}] Загрузить статический исходный код"
echo "-------------"
echo "В настоящее время разрешены только пакеты исходного кода в формате Zip. Пожалуйста, поместите пакеты исходного кода в/home/web/html/${yuming}В каталоге"
read -e -p "Вы также можете ввести ссылку загрузки, чтобы удаленно загрузить пакет исходного кода. Напрямую нажмите Enter, чтобы пропустить удаленную загрузку:" 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 "[${gl_huang}2/2${gl_bai}] Путь, в котором находится index.html"
echo "-------------"
# find "$(realpath .)" -name "index.html" -print
find "$(realpath .)" -name "index.html" -print | xargs -I {} dirname {}
read -e -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 nginx:nginx /var/www/html
docker exec nginx nginx -s reload
nginx_web_on
;;
31)
ldnmp_web_status
;;
32)
clear
send_stats "LDNMP Environment Backup"
local backup_filename="web_$(date +"%Y%m%d%H%M%S").tar.gz"
echo -e "${gl_huang}Резервное копирование$backup_filename ...${gl_bai}"
cd /home/ && tar czvf "$backup_filename" web
while true; do
clear
echo "Файл резервного копирования был создан: /home /$backup_filename"
read -e -p "Вы хотите перенести данные резервного копирования на удаленный сервер? (Y/N):" choice
case "$choice" in
[Yy])
read -e -p "Пожалуйста, введите IP удаленного сервера:" remote_ip
if [ -z "$remote_ip" ]; then
echo "Ошибка: введите IP удаленного сервера."
continue
fi
local 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 "Файл был перенесен в домашний каталог удаленного сервера."
else
echo "Файл, который должен быть передан, не был найден."
fi
break
;;
[Nn])
break
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
done
;;
33)
clear
send_stats "Временная удаленная резервная копия"
read -e -p "Введите IP удаленного сервера:" useip
read -e -p "Введите пароль удаленного сервера:" usepasswd
cd ~
wget -O ${useip}_beifen.sh ${gh_proxy}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 -e -p "Пожалуйста, введите свой выбор:" dingshi
case $dingshi in
1)
check_crontab_installed
read -e -p "Выберите день недели для вашего еженедельного резервного копирования (0-6, 0 представляет воскресенье):" weekday
(crontab -l ; echo "0 0 * * $weekday ./${useip}_beifen.sh") | crontab - > /dev/null 2>&1
;;
2)
check_crontab_installed
read -e -p "Выберите время для ежедневного резервного копирования (часы, 0-23):" hour
(crontab -l ; echo "0 $hour * * * ./${useip}_beifen.sh") | crontab - > /dev/null 2>&1
;;
*)
break # 跳出
;;
esac
install sshpass
;;
34)
root_use
send_stats "LDNMP Restoration"
echo "Доступные резервные копии сайта"
echo "-------------------------"
ls -lt /home/*.gz | awk '{print $NF}'
echo ""
read -e -p "Введите, чтобы восстановить последнюю резервную копию, введите имя файла резервной копии, чтобы восстановить указанное резервное копирование, введите 0, чтобы выйти:" filename
if [ "$filename" == "0" ]; then
break_end
linux_ldnmp
fi
# Если пользователь не вводит имя файла, используйте последний сжатый пакет
if [ -z "$filename" ]; then
local filename=$(ls -t /home/*.tar.gz | head -1)
fi
if [ -n "$filename" ]; then
cd /home/web/ > /dev/null 2>&1
docker compose down > /dev/null 2>&1
rm -rf /home/web > /dev/null 2>&1
echo -e "${gl_huang}Декомпрессия делается$filename ...${gl_bai}"
cd /home/ && tar -xzf "$filename"
check_port
install_dependency
install_docker
install_certbot
install_ldnmp
else
echo "Сжатие не было найдено."
fi
;;
35)
send_stats "LDNMP Environment Defense"
while true; do
check_waf_status
check_cf_mode
if [ -x "$(command -v fail2ban-client)" ] ; then
clear
remove fail2ban
rm -rf /etc/fail2ban
else
clear
docker_name="fail2ban"
check_docker_app
echo -e "Программа защиты веб -сайта сервера${check_docker}${gl_lv}${CFmessage}${waf_status}${gl_bai}"
echo "------------------------"
echo "1. Установите защитную программу"
echo "------------------------"
echo "5. Просмотреть запись перехвата SSH 6. Просмотреть запись перехвата веб -сайтов"
echo "7. Просмотреть список правил обороны 8. Просмотреть мониторинг журналов в реальном времени"
echo "------------------------"
echo "11. Настройка параметров перехвата 12. Очистить все заблокированные IPS"
echo "------------------------"
echo "21. Cloudflare Mode 22. Высокая нагрузка на 5 секунд щит"
echo "------------------------"
echo "31. Включите WAF 32. Выключите WAF"
echo "33. Включите DDOS Defense 34. Выключите защиту DDOS"
echo "------------------------"
echo "9. удалить программу обороны"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
f2b_install_sshd
cd /path/to/fail2ban/config/fail2ban/filter.d
curl -sS -O ${gh_proxy}raw.githubusercontent.com/kejilion/sh/main/fail2ban-nginx-cc.conf
cd /path/to/fail2ban/config/fail2ban/jail.d/
curl -sS -O ${gh_proxy}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
f2b_status
;;
5)
echo "------------------------"
f2b_sshd
echo "------------------------"
;;
6)
echo "------------------------"
local xxx="fail2ban-nginx-cc"
f2b_status_xxx
echo "------------------------"
local xxx="docker-nginx-418"
f2b_status_xxx
echo "------------------------"
local xxx="docker-nginx-bad-request"
f2b_status_xxx
echo "------------------------"
local xxx="docker-nginx-badbots"
f2b_status_xxx
echo "------------------------"
local xxx="docker-nginx-botsearch"
f2b_status_xxx
echo "------------------------"
local xxx="docker-nginx-deny"
f2b_status_xxx
echo "------------------------"
local xxx="docker-nginx-http-auth"
f2b_status_xxx
echo "------------------------"
local xxx="docker-nginx-unauthorized"
f2b_status_xxx
echo "------------------------"
local 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 была удалена"
;;
11)
install nano
nano /path/to/fail2ban/config/fail2ban/jail.d/nginx-docker-cc.conf
f2b_status
break
;;
12)
docker exec -it fail2ban fail2ban-client unban --all
;;
21)
send_stats "Режим CloudFlare"
echo "Перейдите в верхний правый угол фона CF, выберите жетон API слева и получите глобальный ключ API"
echo "https://dash.cloudflare.com/login"
read -e -p "Введите номер учетной записи CF:" cfuser
read -e -p "Введите глобальный ключ API для CF:" cftoken
wget -O /home/web/conf.d/default.conf ${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/default11.conf
docker exec nginx nginx -s reload
cd /path/to/fail2ban/config/fail2ban/jail.d/
curl -sS -O ${gh_proxy}raw.githubusercontent.com/kejilion/config/main/fail2ban/nginx-docker-cc.conf
cd /path/to/fail2ban/config/fail2ban/action.d
curl -sS -O ${gh_proxy}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, Site-Security-Events"
;;
22)
send_stats "Высокая нагрузка на 5 секунд щит"
echo -e "${gl_huang}Веб -сайт автоматически обнаруживается каждые 5 минут. Когда высокая нагрузка будет обнаружена, щит будет автоматически включен, а низкая нагрузка будет автоматически отключаться в течение 5 секунд.${gl_bai}"
echo "--------------"
echo "Получить параметры CF:"
echo -e "Перейдите в верхний правый угол фона CF, выберите жетон API слева и получите его${gl_huang}Global API Key${gl_bai}"
echo -e "Перейдите в правом нижнем углу страницы сводного имени доменного домена CF, чтобы получить${gl_huang}Идентификатор региона${gl_bai}"
echo "https://dash.cloudflare.com/login"
echo "--------------"
read -e -p "Введите номер учетной записи CF:" cfuser
read -e -p "Введите глобальный ключ API для CF:" cftoken
read -e -p "Введите идентификатор региона доменного имени в CF:" cfzonID
cd ~
install jq bc
check_crontab_installed
curl -sS -O ${gh_proxy}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
local cron_job="*/5 * * * * ~/CF-Under-Attack.sh"
local 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
;;
31)
nginx_waf on
echo "Сайт WAF включен"
send_stats "Сайт WAF включен"
;;
32)
nginx_waf off
echo "Сайт WAF был закрыт"
send_stats "Сайт WAF был закрыт"
;;
33)
enable_ddos_defense
;;
34)
disable_ddos_defense
;;
*)
break
;;
esac
fi
break_end
done
;;
36)
while true; do
clear
send_stats "Оптимизировать среду LDNMP"
echo "Оптимизировать среду LDNMP"
echo "------------------------"
echo "1. Стандартный режим 2. Высокий режим производительности (рекомендуется 2H2G или выше)"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
send_stats "Стандартный режим сайта"
# NGINX TUNing
sed -i 's/worker_connections.*/worker_connections 10240;/' /home/web/nginx.conf
sed -i 's/worker_processes.*/worker_processes 4;/' /home/web/nginx.conf
# PHP настройка
wget -O /home/optimized_php.ini ${gh_proxy}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 ${gh_proxy}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
fix_phpfpm_conf php
fix_phpfpm_conf php74
# mysql tuning
wget -O /home/custom_mysql_config.cnf ${gh_proxy}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
cd /home/web && docker compose restart
restart_redis
optimize_balanced
echo "Среда LDNMP была установлена ​​в стандартный режим"
;;
2)
send_stats "Режим высокой производительности сайта"
# NGINX TUNing
sed -i 's/worker_connections.*/worker_connections 20480;/' /home/web/nginx.conf
sed -i 's/worker_processes.*/worker_processes 8;/' /home/web/nginx.conf
# PHP настройка
wget -O /home/optimized_php.ini ${gh_proxy}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 ${gh_proxy}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
fix_phpfpm_conf php
fix_phpfpm_conf php74
# mysql tuning
wget -O /home/custom_mysql_config.cnf ${gh_proxy}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
cd /home/web && docker compose restart
restart_redis
optimize_web_server
echo "Среда LDNMP была установлена ​​на высокопроизводительный режим"
;;
*)
break
;;
esac
break_end
done
;;
37)
root_use
while true; do
clear
send_stats "Обновление среды LDNMP"
echo "Обновление среды LDNMP"
echo "------------------------"
ldnmp_v
echo "Откройте для себя новую версию компонентов"
echo "------------------------"
check_docker_image_update nginx
if [ -n "$update_status" ]; then
echo -e "${gl_huang}nginx $update_status${gl_bai}"
fi
check_docker_image_update php
if [ -n "$update_status" ]; then
echo -e "${gl_huang}php $update_status${gl_bai}"
fi
check_docker_image_update mysql
if [ -n "$update_status" ]; then
echo -e "${gl_huang}mysql $update_status${gl_bai}"
fi
check_docker_image_update redis
if [ -n "$update_status" ]; then
echo -e "${gl_huang}redis $update_status${gl_bai}"
fi
echo "------------------------"
echo
echo "1. Обновление nginx 2. Обновление MySQL 3. Обновление PHP 4. Обновление Redis"
echo "------------------------"
echo "5. Обновите полную среду"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
nginx_upgrade
;;
2)
local ldnmp_pods="mysql"
read -e -p "Пожалуйста, введите${ldnmp_pods}Номер версии (например: 8.0 8.3 8.4 9.0) (введите, чтобы получить последнюю версию):" version
local version=${version:-latest}
cd /home/web/
cp /home/web/docker-compose.yml /home/web/docker-compose1.yml
sed -i "s/image: mysql/image: mysql:${version}/" /home/web/docker-compose.yml
docker rm -f $ldnmp_pods
docker images --filter=reference="$ldnmp_pods*" -q | xargs docker rmi > /dev/null 2>&1
docker compose up -d --force-recreate $ldnmp_pods
docker restart $ldnmp_pods
cp /home/web/docker-compose1.yml /home/web/docker-compose.yml
send_stats "обновлять$ldnmp_pods"
echo "обновлять${ldnmp_pods}Заканчивать"
;;
3)
local ldnmp_pods="php"
read -e -p "Пожалуйста, введите${ldnmp_pods}Номер версии (например: 7.4 8.0 8.1 8.2 8.3) (введите, чтобы получить последнюю версию):" version
local version=${version:-8.3}
cd /home/web/
cp /home/web/docker-compose.yml /home/web/docker-compose1.yml
sed -i "s/kjlion\///g" /home/web/docker-compose.yml > /dev/null 2>&1
sed -i "s/image: php:fpm-alpine/image: php:${version}-fpm-alpine/" /home/web/docker-compose.yml
docker rm -f $ldnmp_pods
docker images --filter=reference="$ldnmp_pods*" -q | xargs docker rmi > /dev/null 2>&1
docker images --filter=reference="kjlion/${ldnmp_pods}*" -q | xargs docker rmi > /dev/null 2>&1
docker compose up -d --force-recreate $ldnmp_pods
docker exec php chown -R www-data:www-data /var/www/html
run_command docker exec php sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories > /dev/null 2>&1
docker exec php apk update
curl -sL ${gh_proxy}github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions -o /usr/local/bin/install-php-extensions
docker exec php mkdir -p /usr/local/bin/
docker cp /usr/local/bin/install-php-extensions php:/usr/local/bin/
docker exec php chmod +x /usr/local/bin/install-php-extensions
docker exec php install-php-extensions mysqli pdo_mysql gd intl zip exif bcmath opcache redis imagick
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
docker exec php sh -c 'echo "max_input_vars=5000" > /usr/local/etc/php/conf.d/max_input_vars.ini' > /dev/null 2>&1
fix_phpfpm_con $ldnmp_pods
docker restart $ldnmp_pods > /dev/null 2>&1
cp /home/web/docker-compose1.yml /home/web/docker-compose.yml
send_stats "обновлять$ldnmp_pods"
echo "обновлять${ldnmp_pods}Заканчивать"
;;
4)
local ldnmp_pods="redis"
cd /home/web/
docker rm -f $ldnmp_pods
docker images --filter=reference="$ldnmp_pods*" -q | xargs docker rmi > /dev/null 2>&1
docker compose up -d --force-recreate $ldnmp_pods
docker restart $ldnmp_pods > /dev/null 2>&1
restart_redis
send_stats "обновлять$ldnmp_pods"
echo "обновлять${ldnmp_pods}Заканчивать"
;;
5)
read -e -p "$(echo -e "${gl_huang}提示: ${gl_bai}长时间不更新环境的用户请慎重更新LDNMP环境会有数据库更新失败的风险。确定更新LDNMP环境吗(Y/N): ")" choice
case "$choice" in
[Yy])
send_stats "Полностью обновить среду LDNMP"
cd /home/web/
docker compose down --rmi all
check_port
install_dependency
install_docker
install_certbot
install_ldnmp
;;
*)
;;
esac
;;
*)
break
;;
esac
break_end
done
;;
38)
root_use
send_stats "Удаление среды LDNMP"
read -e -p "$(echo -e "${gl_hong}强烈建议:${gl_bai}先备份全部网站数据再卸载LDNMP环境。确定删除所有网站数据吗(Y/N): ")" choice
case "$choice" in
[Yy])
cd /home/web/
docker compose down --rmi all
docker compose -f docker-compose.phpmyadmin.yml down > /dev/null 2>&1
docker compose -f docker-compose.phpmyadmin.yml down --rmi all > /dev/null 2>&1
rm -rf /home/web
;;
[Nn])
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
0)
kejilion
;;
*)
echo "Неверный ввод!"
esac
break_end
done
}
linux_panel() {
while true; do
clear
# send_stats "Рынок приложений"
echo -e "Рынок приложений"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}1. ${gl_bai}Официальная версия панели Baota${gl_kjlan}2. ${gl_bai}Aapanel International Edition"
echo -e "${gl_kjlan}3. ${gl_bai}1Panel New Generation Panel${gl_kjlan}4. ${gl_bai}Nginxproxymanager Visual Panel"
echo -e "${gl_kjlan}5. ${gl_bai}Alist Multi Store File Sirece Sport${gl_kjlan}6. ${gl_bai}Ubuntu Remote Desktop Web Edition"
echo -e "${gl_kjlan}7. ${gl_bai}Панель мониторинга VPS -зонда Nezha${gl_kjlan}8. ${gl_bai}QB Offline BT Magnetic Download Panel"
echo -e "${gl_kjlan}9. ${gl_bai}Poste.io программа почтового сервера${gl_kjlan}10. ${gl_bai}Multiplayer Multiplayer онлайн -чат"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}11. ${gl_bai}Программное обеспечение для управления проектами Zendao${gl_kjlan}12. ${gl_bai}Платформа управления задачами на панели Qinglong"
echo -e "${gl_kjlan}13. ${gl_bai}Cloudreve Network Disk${gl_huang}${gl_bai} ${gl_kjlan}14. ${gl_bai}Простая программа управления картинками кровати"
echo -e "${gl_kjlan}15. ${gl_bai}Эмби мультимедийная система управления${gl_kjlan}16. ${gl_bai}Панель испытаний на скорость скорости"
echo -e "${gl_kjlan}17. ${gl_bai}Adguardhome Adware${gl_kjlan}18. ${gl_bai}OnlyOffice Online Office Office"
echo -e "${gl_kjlan}19. ${gl_bai}Громовой панель брандмауэра WAF WAF${gl_kjlan}20. ${gl_bai}панель управления контейнерами портайнмера"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}21. ${gl_bai}Веб -версия VSCODE${gl_kjlan}22. ${gl_bai}UPTIMEKUMA Мониторинг инструмент"
echo -e "${gl_kjlan}23. ${gl_bai}Записки для записи веб -страницы${gl_kjlan}24. ${gl_bai}Webtop удаленное настольное веб -издание${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}25. ${gl_bai}NextCloud Network Disk${gl_kjlan}26. ${gl_bai}QD-тодайская структура управления задачами"
echo -e "${gl_kjlan}27. ${gl_bai}Панель управления стеком контейнеров в док -контейнерах${gl_kjlan}28. ${gl_bai}Инструмент тестирования скорости"
echo -e "${gl_kjlan}29. ${gl_bai}сайт поиска агрегации Searxng${gl_huang}${gl_bai} ${gl_kjlan}30. ${gl_bai}Система частных альбомов PhotoPrism"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}31. ${gl_bai}Сборник инструментов StirlingPDF${gl_kjlan}32. ${gl_bai}Бесплатное программное обеспечение для онлайн -диаграммы Drawio${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}33. ${gl_bai}Навигационная панель Солнца${gl_kjlan}34. ${gl_bai}Платформа обмена файлами pingvin-share"
echo -e "${gl_kjlan}35. ${gl_bai}Минималистский круг друзей${gl_kjlan}36. ${gl_bai}Сайт агрегирования чата LobeChatai"
echo -e "${gl_kjlan}37. ${gl_bai}Myip Toolbox${gl_huang}${gl_bai} ${gl_kjlan}38. ${gl_bai}Семейное ведро Xiaoya alist"
echo -e "${gl_kjlan}39. ${gl_bai}Bililive Live Live Toolsing инструмент записи трансляции${gl_kjlan}40. ${gl_bai}Webssh Web Version SSH Инструмент подключения"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}41. ${gl_bai}Панель управления мыши${gl_kjlan}42. ${gl_bai}Инструмент удаленного подключения Nexte"
echo -e "${gl_kjlan}43. ${gl_bai}Rustdesk Remote Desk (сервер)${gl_huang}${gl_bai} ${gl_kjlan}44. ${gl_bai}Rustdesk Remote Dest (Relay)${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}45. ${gl_bai}Станция ускорения Docker${gl_kjlan}46. ${gl_bai}Станция ускорения GitHub${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}47. ${gl_bai}Прометей мониторинг${gl_kjlan}48. ${gl_bai}Прометей (мониторинг хоста)"
echo -e "${gl_kjlan}49. ${gl_bai}Prometheus (мониторинг контейнеров)${gl_kjlan}50. ${gl_bai}Инструмент мониторинга пополнения"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}51. ${gl_bai}PVE куриная панель${gl_kjlan}52. ${gl_bai}DPANEL Container Panels"
echo -e "${gl_kjlan}53. ${gl_bai}Llama3 чат модель AI${gl_kjlan}54. ${gl_bai}AMH Host Host Websity Панель управления строительством"
echo -e "${gl_kjlan}55. ${gl_bai}FRP Intranet Purnation (сторона сервера)${gl_huang}${gl_bai} ${gl_kjlan}56. ${gl_bai}FRP Intranet Purnation (клиент)${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}57. ${gl_bai}DeepSeek Chat Ai Big Model${gl_kjlan}58. ${gl_bai}Dify Big Model Base Base${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}59. ${gl_bai}Newapi Big Model Asset Management${gl_kjlan}60. ${gl_bai}Jumpserver с открытым исходным кодом"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}61. ${gl_bai}Онлайн -сервер перевода${gl_kjlan}62. ${gl_bai}Ragflow Big Model Base Base"
echo -e "${gl_kjlan}63. ${gl_bai}OpenWebui самостоятельно отправленная платформой ИИ${gl_huang}${gl_bai} ${gl_kjlan}64. ${gl_bai}IT-инструмент Tools"
echo -e "${gl_kjlan}65. ${gl_bai}платформа рабочего процесса автоматизации N8N${gl_huang}${gl_bai} ${gl_kjlan}66. ${gl_bai}инструмент загрузки видео YT-DLP"
echo -e "${gl_kjlan}67. ${gl_bai}DDNS-GO Dynamic DNS-инструмент управления DNS${gl_huang}${gl_bai} ${gl_kjlan}68. ${gl_bai}Платформа управления сертификатами allinssl"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}0. ${gl_bai}Вернуться в главное меню"
echo -e "${gl_kjlan}------------------------${gl_bai}"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
local lujing="[ -d "/www/server/panel" ]"
local panelname="宝塔面板"
local panelurl="https://www.bt.cn/new/index.html"
panel_app_install() {
if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec
}
panel_app_manage() {
bt
}
panel_app_uninstall() {
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
chmod +x bt-uninstall.sh
./bt-uninstall.sh
}
install_panel
;;
2)
local lujing="[ -d "/www/server/panel" ]"
local panelname="aapanel"
local panelurl="https://www.aapanel.com/new/index.html"
panel_app_install() {
URL=https://www.aapanel.com/script/install_7.0_en.sh && if [ -f /usr/bin/curl ];then curl -ksSO "$URL" ;else wget --no-check-certificate -O install_7.0_en.sh "$URL";fi;bash install_7.0_en.sh aapanel
}
panel_app_manage() {
bt
}
panel_app_uninstall() {
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
chmod +x bt-uninstall.sh
./bt-uninstall.sh
}
install_panel
;;
3)
local lujing="command -v 1pctl > /dev/null 2>&1"
local panelname="1Panel"
local panelurl="https://1panel.cn/"
panel_app_install() {
install bash
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && bash quick_start.sh
}
panel_app_manage() {
1pctl user-info
1pctl update password
}
panel_app_uninstall() {
1pctl uninstall
}
install_panel
;;
4)
local docker_name="npm"
local docker_img="jc21/nginx-proxy-manager:latest"
local docker_port=81
docker_rum() {
docker run -d \
--name=$docker_name \
-p ${docker_port}:81 \
-p 80:80 \
-p 443:443 \
-v /home/docker/npm/data:/data \
-v /home/docker/npm/letsencrypt:/etc/letsencrypt \
--restart=always \
$docker_img
}
local docker_describe="如果您已经安装了其他面板或者LDNMP建站环境建议先卸载再安装npm"
local docker_url="官网介绍: https://nginxproxymanager.com/"
local docker_use="echo \"初始用户名: admin@example.com\""
local docker_passwd="echo \"初始密码: changeme\""
local app_size="1"
docker_app
;;
5)
local docker_name="alist"
local docker_img="xhofe/alist-aria2:latest"
local docker_port=5244
docker_rum() {
docker run -d \
--restart=always \
-v /home/docker/alist:/opt/alist/data \
-p ${docker_port}:5244 \
-e PUID=0 \
-e PGID=0 \
-e UMASK=022 \
--name="alist" \
xhofe/alist-aria2:latest
}
local docker_describe="一个支持多种存储,支持网页浏览和 WebDAV 的文件列表程序,由 gin 和 Solidjs 驱动"
local docker_url="官网介绍: https://alist.nn.ci/zh/"
local docker_use="docker exec -it alist ./alist admin random"
local docker_passwd=""
local app_size="1"
docker_app
;;
6)
local docker_name="webtop-ubuntu"
local docker_img="lscr.io/linuxserver/webtop:ubuntu-kde"
local docker_port=3006
docker_rum() {
docker run -d \
--name=webtop-ubuntu \
--security-opt seccomp=unconfined \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e SUBFOLDER=/ \
-e TITLE=Webtop \
-p ${docker_port}: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:ubuntu-kde
}
local docker_describe="webtop基于Ubuntu的容器包含官方支持的完整桌面环境可通过任何现代 Web 浏览器访问"
local docker_url="官网介绍: https://docs.linuxserver.io/images/docker-webtop/"
local docker_use=""
local docker_passwd=""
local app_size="2"
docker_app
;;
7)
clear
send_stats "Построить Неза"
local docker_name="nezha-dashboard"
local docker_port=8008
while true; do
check_docker_app
check_docker_image_update $docker_name
clear
echo -e "Nezha Monitoring$check_docker $update_status"
echo "С открытым исходным кодом, легкий и простой в использовании инструменты мониторинга и эксплуатации и обслуживания сервера"
echo "Введение видео: https://www.bilibili.com/video/bv1wv421c71t?t=0.1"
if docker inspect "$docker_name" &>/dev/null; then
local docker_port=$(docker port $docker_name | awk -F'[:]' '/->/ {print $NF}' | uniq)
check_docker_app_ip
fi
echo ""
echo "------------------------"
echo "1. Используйте"
echo "------------------------"
echo "5. Добавьте доменное имя доступа 6. Удалить домен и имя домена"
echo "7. Разрешить IP+ Port Access 8. Block IP+ Access Access"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Введите свой выбор:" choice
case $choice in
1)
check_disk_space 1
install unzip jq
install_docker
curl -sL ${gh_proxy}raw.githubusercontent.com/nezhahq/scripts/refs/heads/main/install.sh -o nezha.sh && chmod +x nezha.sh && ./nezha.sh
local docker_port=$(docker port $docker_name | awk -F'[:]' '/->/ {print $NF}' | uniq)
check_docker_app_ip
;;
5)
echo "${docker_name}Настройки домена домена"
send_stats "${docker_name}Настройки домена домена"
add_yuming
ldnmp_Proxy ${yuming} ${ipv4_address} ${docker_port}
block_container_port "$docker_name" "$ipv4_address"
;;
6)
echo "Формат доменного имени example.com не поставляется с https: //"
web_del
;;
7)
send_stats "Разрешить IP -доступ${docker_name}"
clear_container_rules "$docker_name" "$ipv4_address"
;;
8)
send_stats "Block IP Access${docker_name}"
block_container_port "$docker_name" "$ipv4_address"
;;
*)
break
;;
esac
break_end
done
;;
8)
local docker_name="qbittorrent"
local docker_img="lscr.io/linuxserver/qbittorrent:latest"
local docker_port=8081
docker_rum() {
docker run -d \
--name=qbittorrent \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e WEBUI_PORT=${docker_port} \
-e TORRENTING_PORT=56881 \
-p ${docker_port}:${docker_port} \
-p 56881:56881 \
-p 56881:56881/udp \
-v /home/docker/qbittorrent/config:/config \
-v /home/docker/qbittorrent/downloads:/downloads \
--restart unless-stopped \
lscr.io/linuxserver/qbittorrent:latest
}
local docker_describe="qbittorrent离线BT磁力下载服务"
local docker_url="官网介绍: https://hub.docker.com/r/linuxserver/qbittorrent"
local docker_use="sleep 3"
local docker_passwd="docker logs qbittorrent"
local app_size="1"
docker_app
;;
9)
send_stats "Построить почтовое отделение"
clear
install telnet
local docker_name=“mailserver”
while true; do
check_docker_app
check_docker_image_update $docker_name
clear
echo -e "Почтовые услуги$check_docker $update_status"
echo "poste.io - это решение для сервера почтового сервера с открытым исходным кодом."
echo "Введение видео: https://www.bilibili.com/video/bv1wv421c71t?t=0.1"
echo ""
echo "Обнаружение порта"
port=25
timeout=3
if echo "quit" | timeout $timeout telnet smtp.qq.com $port | grep 'Connected'; then
echo -e "${gl_lv}порт$portВ настоящее время доступно${gl_bai}"
else
echo -e "${gl_hong}порт$portВ настоящее время не доступно${gl_bai}"
fi
echo ""
if docker inspect "$docker_name" &>/dev/null; then
yuming=$(cat /home/docker/mail.txt)
echo "Адрес доступа:"
echo "https://$yuming"
fi
echo "------------------------"
echo "1. Установите 2. Обновление 3. Удалить"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Введите свой выбор:" choice
case $choice in
1)
check_disk_space 2
read -e -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 jq
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 ""
;;
2)
docker rm -f mailserver
docker rmi -f analogic/poste.i
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.i
clear
echo "poste.io был установлен"
echo "------------------------"
echo "Вы можете получить доступ к poste.io, используя следующий адрес:"
echo "https://$yuming"
echo ""
;;
3)
docker rm -f mailserver
docker rmi -f analogic/poste.io
rm /home/docker/mail.txt
rm -rf /home/docker/mail
echo "Приложение было удалено"
;;
*)
break
;;
esac
break_end
done
;;
10)
local app_name="Rocket.Chat聊天系统"
local app_text="Rocket.Chat 是一个开源的团队通讯平台,支持实时聊天、音视频通话、文件共享等多种功能,"
local app_url="官方介绍: https://www.rocket.chat/"
local docker_name="rocketchat"
local docker_port="3897"
local app_size="2"
docker_app_install() {
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 ${docker_port}:3000 --link db --env ROOT_URL=http://localhost --env MONGO_OPLOG_URL=mongodb://db:27017/rs5 -d rocket.chat
clear
ip_address
echo "Установлен"
check_docker_app_ip
}
docker_app_update() {
docker rm -f rocketchat
docker rmi -f rocket.chat:latest
docker run --name rocketchat --restart=always -p ${docker_port}: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 был установлен"
check_docker_app_ip
}
docker_app_uninstall() {
docker rm -f rocketchat
docker rmi -f rocket.chat
docker rm -f db
docker rmi -f mongo:latest
rm -rf /home/docker/mongo
echo "Приложение было удалено"
}
docker_app_plus
;;
11)
local docker_name="zentao-server"
local docker_img="idoop/zentao:latest"
local docker_port=82
docker_rum() {
docker run -d -p ${docker_port}:80 \
-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
}
local docker_describe="禅道是通用的项目管理软件"
local docker_url="官网介绍: https://www.zentao.net/"
local docker_use="echo \"初始用户名: admin\""
local docker_passwd="echo \"初始密码: 123456\""
local app_size="2"
docker_app
;;
12)
local docker_name="qinglong"
local docker_img="whyour/qinglong:latest"
local docker_port=5700
docker_rum() {
docker run -d \
-v /home/docker/qinglong/data:/ql/data \
-p ${docker_port}:5700 \
--name qinglong \
--hostname qinglong \
--restart unless-stopped \
whyour/qinglong:latest
}
local docker_describe="青龙面板是一个定时任务管理平台"
local docker_url="官网介绍: ${gh_proxy}github.com/whyour/qinglong"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
13)
local app_name="cloudreve网盘"
local app_text="cloudreve是一个支持多家云存储的网盘系统"
local app_url="视频介绍: https://www.bilibili.com/video/BV13F4m1c7h7?t=0.1"
local docker_name="cloudreve"
local docker_port="5212"
local app_size="2"
docker_app_install() {
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 ${gh_proxy}raw.githubusercontent.com/kejilion/docker/main/cloudreve-docker-compose.yml
sed -i "s/5212:5212/${docker_port}:5212/g" /home/docker/cloud/docker-compose.yml
cd /home/docker/cloud/
docker compose up -d
clear
echo "Установлен"
check_docker_app_ip
}
docker_app_update() {
cd /home/docker/cloud/ && docker compose down --rmi all
cd /home/docker/cloud/ && docker compose up -d
}
docker_app_uninstall() {
cd /home/docker/cloud/ && docker compose down --rmi all
rm -rf /home/docker/cloud
echo "Приложение было удалено"
}
docker_app_plus
;;
14)
local docker_name="easyimage"
local docker_img="ddsderek/easyimage:latest"
local docker_port=85
docker_rum() {
docker run -d \
--name easyimage \
-p ${docker_port}: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
}
local docker_describe="简单图床是一个简单的图床程序"
local docker_url="官网介绍: ${gh_proxy}github.com/icret/EasyImages2.0"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
15)
local docker_name="emby"
local docker_img="linuxserver/emby:latest"
local docker_port=8096
docker_rum() {
docker run -d --name=emby --restart=always \
-v /home/docker/emby/config:/config \
-v /home/docker/emby/share1:/mnt/share1 \
-v /home/docker/emby/share2:/mnt/share2 \
-v /mnt/notify:/mnt/notify \
-p ${docker_port}:8096 \
-e UID=1000 -e GID=100 -e GIDLIST=100 \
linuxserver/emby:latest
}
local docker_describe="emby是一个主从式架构的媒体服务器软件可以用来整理服务器上的视频和音频并将音频和视频流式传输到客户端设备"
local docker_url="官网介绍: https://emby.media/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
16)
local docker_name="looking-glass"
local docker_img="wikihostinc/looking-glass-server"
local docker_port=89
docker_rum() {
docker run -d --name looking-glass --restart always -p ${docker_port}:80 wikihostinc/looking-glass-server
}
local docker_describe="Speedtest测速面板是一个VPS网速测试工具多项测试功能还可以实时监控VPS进出站流量"
local docker_url="官网介绍: ${gh_proxy}github.com/wikihost-opensource/als"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
17)
local docker_name="adguardhome"
local docker_img="adguard/adguardhome"
local 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 ${docker_port}:3000/tcp \
--restart always \
adguard/adguardhome
}
local docker_describe="AdGuardHome是一款全网广告拦截与反跟踪软件未来将不止是一个DNS服务器。"
local docker_url="官网介绍: https://hub.docker.com/r/adguard/adguardhome"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
18)
local docker_name="onlyoffice"
local docker_img="onlyoffice/documentserver"
local docker_port=8082
docker_rum() {
docker run -d -p ${docker_port}: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
}
local docker_describe="onlyoffice是一款开源的在线office工具太强大了"
local docker_url="官网介绍: https://www.onlyoffice.com/"
local docker_use=""
local docker_passwd=""
local app_size="2"
docker_app
;;
19)
send_stats "Построить гром"
local docker_name=safeline-mgt
local docker_port=9443
while true; do
check_docker_app
clear
echo -e "Громовой сервис пула$check_docker"
echo "Lei Chi - это панель программы брандмауэра на сайте WAF, разработанная технологией Changting Technology, которая может отменить сайт агентства для автоматизированной защиты."
echo "Введение видео: https://www.bilibili.com/video/bv1mz421t74c?t=0.1"
if docker inspect "$docker_name" &>/dev/null; then
check_docker_app_ip
fi
echo ""
echo "------------------------"
echo "1. Установите 2. Обновление 3. Сброс пароля 4. Удалить"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Введите свой выбор:" choice
case $choice in
1)
install_docker
check_disk_space 5
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
clear
echo "Панель WAF бассейна Thunder"
check_docker_app_ip
docker exec safeline-mgt resetadmin
;;
2)
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/upgrade.sh)"
docker rmi $(docker images | grep "safeline" | grep "none" | awk '{print $3}')
echo ""
clear
echo "Громовой пул панель WAF была обновлена"
check_docker_app_ip
;;
3)
docker exec safeline-mgt resetadmin
;;
4)
cd /data/safeline
docker compose down --rmi all
echo "Если вы являетесь каталогом установки по умолчанию, проект теперь удален. Если вы настраиваете каталог установки, вам нужно перейти в каталог установки, чтобы выполнить его самостоятельно:"
echo "docker compose down && docker compose down --rmi all"
;;
*)
break
;;
esac
break_end
done
;;
20)
local docker_name="portainer"
local docker_img="portainer/portainer"
local docker_port=9050
docker_rum() {
docker run -d \
--name portainer \
-p ${docker_port}:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/docker/portainer:/data \
--restart always \
portainer/portainer
}
local docker_describe="portainer是一个轻量级的docker容器管理面板"
local docker_url="官网介绍: https://www.portainer.io/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
21)
local docker_name="vscode-web"
local docker_img="codercom/code-server"
local docker_port=8180
docker_rum() {
docker run -d -p ${docker_port}:8080 -v /home/docker/vscode-web:/home/coder/.local/share/code-server --name vscode-web --restart always codercom/code-server
}
local docker_describe="VScode是一款强大的在线代码编写工具"
local docker_url="官网介绍: ${gh_proxy}github.com/coder/code-server"
local docker_use="sleep 3"
local docker_passwd="docker exec vscode-web cat /home/coder/.config/code-server/config.yaml"
local app_size="1"
docker_app
;;
22)
local docker_name="uptime-kuma"
local docker_img="louislam/uptime-kuma:latest"
local docker_port=3003
docker_rum() {
docker run -d \
--name=uptime-kuma \
-p ${docker_port}:3001 \
-v /home/docker/uptime-kuma/uptime-kuma-data:/app/data \
--restart=always \
louislam/uptime-kuma:latest
}
local docker_describe="Uptime Kuma 易于使用的自托管监控工具"
local docker_url="官网介绍: ${gh_proxy}github.com/louislam/uptime-kuma"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
23)
local docker_name="memos"
local docker_img="ghcr.io/usememos/memos:latest"
local docker_port=5230
docker_rum() {
docker run -d --name memos -p ${docker_port}:5230 -v /home/docker/memos:/var/opt/memos --restart always ghcr.io/usememos/memos:latest
}
local docker_describe="Memos是一款轻量级、自托管的备忘录中心"
local docker_url="官网介绍: ${gh_proxy}github.com/usememos/memos"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
24)
local docker_name="webtop"
local docker_img="lscr.io/linuxserver/webtop:latest"
local 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 ${docker_port}: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
}
local docker_describe="webtop基于 Alpine、Ubuntu、Fedora 和 Arch 的容器,包含官方支持的完整桌面环境,可通过任何现代 Web 浏览器访问"
local docker_url="官网介绍: https://docs.linuxserver.io/images/docker-webtop/"
local docker_use=""
local docker_passwd=""
local app_size="2"
docker_app
;;
25)
local docker_name="nextcloud"
local docker_img="nextcloud:latest"
local docker_port=8989
local rootpasswd=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c16)
docker_rum() {
docker run -d --name nextcloud --restart=always -p ${docker_port}:80 -v /home/docker/nextcloud:/var/www/html -e NEXTCLOUD_ADMIN_USER=nextcloud -e NEXTCLOUD_ADMIN_PASSWORD=$rootpasswd nextcloud
}
local docker_describe="Nextcloud拥有超过 400,000 个部署,是您可以下载的最受欢迎的本地内容协作平台"
local docker_url="官网介绍: https://nextcloud.com/"
local docker_use="echo \"账号: nextcloud 密码: $rootpasswd\""
local docker_passwd=""
local app_size="3"
docker_app
;;
26)
local docker_name="qd"
local docker_img="qdtoday/qd:latest"
local docker_port=8923
docker_rum() {
docker run -d --name qd -p ${docker_port}:80 -v /home/docker/qd/config:/usr/src/app/config qdtoday/qd
}
local docker_describe="QD-Today是一个HTTP请求定时任务自动执行框架"
local docker_url="官网介绍: https://qd-today.github.io/qd/zh_CN/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
27)
local docker_name="dockge"
local docker_img="louislam/dockge:latest"
local docker_port=5003
docker_rum() {
docker run -d --name dockge --restart unless-stopped -p ${docker_port}: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
}
local docker_describe="dockge是一个可视化的docker-compose容器管理面板"
local docker_url="官网介绍: ${gh_proxy}github.com/louislam/dockge"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
28)
local docker_name="speedtest"
local docker_img="ghcr.io/librespeed/speedtest"
local docker_port=8028
docker_rum() {
docker run -d -p ${docker_port}:8080 --name speedtest --restart always ghcr.io/librespeed/speedtest
}
local docker_describe="librespeed是用Javascript实现的轻量级速度测试工具即开即用"
local docker_url="官网介绍: ${gh_proxy}github.com/librespeed/speedtest"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
29)
local docker_name="searxng"
local docker_img="alandoyle/searxng:latest"
local 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 ${docker_port}:8080/tcp \
alandoyle/searxng:latest
}
local docker_describe="searxng是一个私有且隐私的搜索引擎站点"
local docker_url="官网介绍: https://hub.docker.com/r/alandoyle/searxng"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
30)
local docker_name="photoprism"
local docker_img="photoprism/photoprism:latest"
local docker_port=2342
local 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 ${docker_port}: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
}
local docker_describe="photoprism非常强大的私有相册系统"
local docker_url="官网介绍: https://www.photoprism.app/"
local docker_use="echo \"账号: admin 密码: $rootpasswd\""
local docker_passwd=""
local app_size="1"
docker_app
;;
31)
local docker_name="s-pdf"
local docker_img="frooodle/s-pdf:latest"
local docker_port=8020
docker_rum() {
docker run -d \
--name s-pdf \
--restart=always \
-p ${docker_port}: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
}
local docker_describe="这是一个强大的本地托管基于 Web 的 PDF 操作工具,使用 docker允许您对 PDF 文件执行各种操作,例如拆分合并、转换、重新组织、添加图像、旋转、压缩等。"
local docker_url="官网介绍: ${gh_proxy}github.com/Stirling-Tools/Stirling-PDF"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
32)
local docker_name="drawio"
local docker_img="jgraph/drawio"
local docker_port=7080
docker_rum() {
docker run -d --restart=always --name drawio -p ${docker_port}:8080 -v /home/docker/drawio:/var/lib/drawio jgraph/drawio
}
local docker_describe="这是一个强大图表绘制软件。思维导图,拓扑图,流程图,都能画"
local docker_url="官网介绍: https://www.drawio.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
33)
local docker_name="sun-panel"
local docker_img="hslr/sun-panel"
local docker_port=3009
docker_rum() {
docker run -d --restart=always -p ${docker_port}: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
}
local docker_describe="Sun-Panel服务器、NAS导航面板、Homepage、浏览器首页"
local docker_url="官网介绍: https://doc.sun-panel.top/zh_cn/"
local docker_use="echo \"账号: admin@sun.cc 密码: 12345678\""
local docker_passwd=""
local app_size="1"
docker_app
;;
34)
local docker_name="pingvin-share"
local docker_img="stonith404/pingvin-share"
local docker_port=3060
docker_rum() {
docker run -d \
--name pingvin-share \
--restart always \
-p ${docker_port}:3000 \
-v /home/docker/pingvin-share/data:/opt/app/backend/data \
stonith404/pingvin-share
}
local docker_describe="Pingvin Share 是一个可自建的文件分享平台,是 WeTransfer 的一个替代品"
local docker_url="官网介绍: ${gh_proxy}github.com/stonith404/pingvin-share"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
35)
local docker_name="moments"
local docker_img="kingwrcy/moments:latest"
local docker_port=8035
docker_rum() {
docker run -d --restart unless-stopped \
-p ${docker_port}: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
}
local docker_describe="极简朋友圈,高仿微信朋友圈,记录你的美好生活"
local docker_url="Официальное веб -сайт Введение:${gh_proxy}github.com/kingwrcy/moments?tab=readme-ov-file"
local docker_use="echo \"账号: admin 密码: a123456\""
local docker_passwd=""
local app_size="1"
docker_app
;;
36)
local docker_name="lobe-chat"
local docker_img="lobehub/lobe-chat:latest"
local docker_port=8036
docker_rum() {
docker run -d -p ${docker_port}:3210 \
--name lobe-chat \
--restart=always \
lobehub/lobe-chat
}
local docker_describe="LobeChat聚合市面上主流的AI大模型ChatGPT/Claude/Gemini/Groq/Ollama"
local docker_url="官网介绍: ${gh_proxy}github.com/lobehub/lobe-chat"
local docker_use=""
local docker_passwd=""
local app_size="2"
docker_app
;;
37)
local docker_name="myip"
local docker_img="jason5ng32/myip:latest"
local docker_port=8037
docker_rum() {
docker run -d -p ${docker_port}:18966 --name myip jason5ng32/myip:latest
}
local docker_describe="是一个多功能IP工具箱可以查看自己IP信息及连通性用网页面板呈现"
local docker_url="官网介绍: ${gh_proxy}github.com/jason5ng32/MyIP/blob/main/README_ZH.md"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
38)
send_stats "Семейное ведро Сяоя"
clear
install_docker
check_disk_space 1
bash -c "$(curl --insecure -fsSL https://ddsrem.com/xiaoya_install.sh)"
;;
39)
if [ ! -d /home/docker/bililive-go/ ]; then
mkdir -p /home/docker/bililive-go/ > /dev/null 2>&1
wget -O /home/docker/bililive-go/config.yml ${gh_proxy}raw.githubusercontent.com/hr3lxphr6j/bililive-go/master/config.yml > /dev/null 2>&1
fi
local docker_name="bililive-go"
local docker_img="chigusa/bililive-go"
local docker_port=8039
docker_rum() {
docker run --restart=always --name bililive-go -v /home/docker/bililive-go/config.yml:/etc/bililive-go/config.yml -v /home/docker/bililive-go/Videos:/srv/bililive -p ${docker_port}:8080 -d chigusa/bililive-go
}
local docker_describe="Bililive-go是一个支持多种直播平台的直播录制工具"
local docker_url="官网介绍: ${gh_proxy}github.com/hr3lxphr6j/bililive-go"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
40)
local docker_name="webssh"
local docker_img="jrohy/webssh"
local docker_port=8040
docker_rum() {
docker run -d -p ${docker_port}:5032 --restart always --name webssh -e TZ=Asia/Shanghai jrohy/webssh
}
local docker_describe="简易在线ssh连接工具和sftp工具"
local docker_url="官网介绍: ${gh_proxy}github.com/Jrohy/webssh"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
41)
local lujing="[ -d "/www/server/panel" ]"
local panelname="耗子面板"
local panelurl="官方地址: ${gh_proxy}github.com/TheTNB/panel"
panel_app_install() {
mkdir -p ~/haozi && cd ~/haozi && curl -fsLm 10 -o install.sh https://dl.cdn.haozi.net/panel/install.sh && bash install.sh
cd ~
}
panel_app_manage() {
panel-cli
}
panel_app_uninstall() {
mkdir -p ~/haozi && cd ~/haozi && curl -fsLm 10 -o uninstall.sh https://dl.cdn.haozi.net/panel/uninstall.sh && bash uninstall.sh
cd ~
}
install_panel
;;
42)
local docker_name="nexterm"
local docker_img="germannewsmaker/nexterm:latest"
local docker_port=8042
docker_rum() {
docker run -d \
--name nexterm \
-p ${docker_port}:6989 \
-v /home/docker/nexterm:/app/data \
--restart unless-stopped \
germannewsmaker/nexterm:latest
}
local docker_describe="nexterm是一款强大的在线SSH/VNC/RDP连接工具。"
local docker_url="官网介绍: ${gh_proxy}github.com/gnmyt/Nexterm"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
43)
local docker_name="hbbs"
local docker_img="rustdesk/rustdesk-server"
local docker_port=0000
docker_rum() {
docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbs
}
local docker_describe="rustdesk开源的远程桌面(服务端),类似自己的向日葵私服。"
local docker_url="官网介绍: https://rustdesk.com/zh-cn/"
local docker_use="docker logs hbbs"
local docker_passwd="echo \"把你的IP和key记录下会在远程桌面客户端中用到。去44选项装中继端吧\""
local app_size="1"
docker_app
;;
44)
local docker_name="hbbr"
local docker_img="rustdesk/rustdesk-server"
local docker_port=0000
docker_rum() {
docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbr
}
local docker_describe="rustdesk开源的远程桌面(中继端),类似自己的向日葵私服。"
local docker_url="官网介绍: https://rustdesk.com/zh-cn/"
local docker_use="echo \"前往官网下载远程桌面的客户端: https://rustdesk.com/zh-cn/\""
local docker_passwd=""
local app_size="1"
docker_app
;;
45)
local docker_name="registry"
local docker_img="registry:2"
local docker_port=8045
docker_rum() {
docker run -d \
-p ${docker_port}:5000 \
--name registry \
-v /home/docker/registry:/var/lib/registry \
-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
--restart always \
registry:2
}
local docker_describe="Docker Registry 是一个用于存储和分发 Docker 镜像的服务。"
local docker_url="官网介绍: https://hub.docker.com/_/registry"
local docker_use=""
local docker_passwd=""
local app_size="2"
docker_app
;;
46)
local docker_name="ghproxy"
local docker_img="wjqserver/ghproxy:latest"
local docker_port=8046
docker_rum() {
docker run -d --name ghproxy --restart always -p ${docker_port}:8080 wjqserver/ghproxy:latest
}
local docker_describe="使用Go实现的GHProxy用于加速部分地区Github仓库的拉取。"
local docker_url="官网介绍: https://github.com/WJQSERVER-STUDIO/ghproxy"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
47)
local app_name="普罗米修斯监控"
local app_text="Prometheus+Grafana企业级监控系统"
local app_url="官网介绍: https://prometheus.io"
local docker_name="grafana"
local docker_port="8047"
local app_size="2"
docker_app_install() {
prometheus_install
clear
ip_address
echo "Установлен"
check_docker_app_ip
echo "Первоначальное имя пользователя и пароль: администратор"
}
docker_app_update() {
docker rm -f node-exporter prometheus grafana
docker rmi -f prom/node-exporter
docker rmi -f prom/prometheus:latest
docker rmi -f grafana/grafana:latest
docker_app_install
}
docker_app_uninstall() {
docker rm -f node-exporter prometheus grafana
docker rmi -f prom/node-exporter
docker rmi -f prom/prometheus:latest
docker rmi -f grafana/grafana:latest
rm -rf /home/docker/monitoring
echo "Приложение было удалено"
}
docker_app_plus
;;
48)
local docker_name="node-exporter"
local docker_img="prom/node-exporter"
local docker_port=8048
docker_rum() {
docker run -d \
--name=node-exporter \
-p ${docker_port}:9100 \
--restart unless-stopped \
prom/node-exporter
}
local docker_describe="这是一个普罗米修斯的主机数据采集组件,请部署在被监控主机上。"
local docker_url="官网介绍: https://github.com/prometheus/node_exporter"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
49)
local docker_name="cadvisor"
local docker_img="gcr.io/cadvisor/cadvisor:latest"
local docker_port=8049
docker_rum() {
docker run -d \
--name=cadvisor \
--restart unless-stopped \
-p ${docker_port}:8080 \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
gcr.io/cadvisor/cadvisor:latest \
-housekeeping_interval=10s \
-docker_only=true
}
local docker_describe="这是一个普罗米修斯的容器数据采集组件,请部署在被监控主机上。"
local docker_url="官网介绍: https://github.com/google/cadvisor"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
50)
local docker_name="changedetection"
local docker_img="dgtlmoon/changedetection.io:latest"
local docker_port=8050
docker_rum() {
docker run -d --restart always -p ${docker_port}:5000 \
-v /home/docker/datastore:/datastore \
--name changedetection dgtlmoon/changedetection.io:latest
}
local docker_describe="这是一款网站变化检测、补货监控和通知的小工具"
local docker_url="官网介绍: https://github.com/dgtlmoon/changedetection.io"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
51)
clear
send_stats "PVE курица"
check_disk_space 1
curl -L ${gh_proxy}raw.githubusercontent.com/oneclickvirt/pve/main/scripts/install_pve.sh -o install_pve.sh && chmod +x install_pve.sh && bash install_pve.sh
;;
52)
local docker_name="dpanel"
local docker_img="dpanel/dpanel:lite"
local docker_port=8052
docker_rum() {
docker run -it -d --name dpanel --restart=always \
-p ${docker_port}:8080 -e APP_NAME=dpanel \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/docker/dpanel:/dpanel \
dpanel/dpanel:lite
}
local docker_describe="Docker可视化面板系统提供完善的docker管理功能。"
local docker_url="官网介绍: https://github.com/donknap/dpanel"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
53)
local docker_name="ollama"
local docker_img="ghcr.io/open-webui/open-webui:ollama"
local docker_port=8053
docker_rum() {
docker run -d -p ${docker_port}:8080 -v /home/docker/ollama:/root/.ollama -v /home/docker/ollama/open-webui:/app/backend/data --name ollama --restart always ghcr.io/open-webui/open-webui:ollama
}
local docker_describe="OpenWebUI一款大语言模型网页框架接入全新的llama3大语言模型"
local docker_url="官网介绍: https://github.com/open-webui/open-webui"
local docker_use="docker exec ollama ollama run llama3.2:1b"
local docker_passwd=""
local app_size="5"
docker_app
;;
54)
local lujing="[ -d "/www/server/panel" ]"
local panelname="AMH面板"
local panelurl="官方地址: https://amh.sh/index.htm?amh"
panel_app_install() {
cd ~
wget https://dl.amh.sh/amh.sh && bash amh.sh
}
panel_app_manage() {
panel_app_install
}
panel_app_uninstall() {
panel_app_install
}
install_panel
;;
55)
frps_panel
;;
56)
frpc_panel
;;
57)
local docker_name="ollama"
local docker_img="ghcr.io/open-webui/open-webui:ollama"
local docker_port=8053
docker_rum() {
docker run -d -p ${docker_port}:8080 -v /home/docker/ollama:/root/.ollama -v /home/docker/ollama/open-webui:/app/backend/data --name ollama --restart always ghcr.io/open-webui/open-webui:ollama
}
local docker_describe="OpenWebUI一款大语言模型网页框架接入全新的DeepSeek R1大语言模型"
local docker_url="官网介绍: https://github.com/open-webui/open-webui"
local docker_use="docker exec ollama ollama run deepseek-r1:1.5b"
local docker_passwd=""
local app_size="5"
docker_app
;;
58)
local app_name="Dify知识库"
local app_text="是一款开源的大语言模型(LLM) 应用开发平台。自托管训练数据用于AI生成"
local app_url="官方网站: https://docs.dify.ai/zh-hans"
local docker_name="docker-nginx-1"
local docker_port="8058"
local app_size="3"
docker_app_install() {
install git
mkdir -p /home/docker/ && cd /home/docker/ && git clone ${gh_proxy}github.com/langgenius/dify.git && cd dify/docker && cp .env.example .env
# sed -i 's/^EXPOSE_NGINX_PORT=.*/EXPOSE_NGINX_PORT=${docker_port}/; s/^EXPOSE_NGINX_SSL_PORT=.*/EXPOSE_NGINX_SSL_PORT=8858/' /home/docker/dify/docker/.env
sed -i "s/^EXPOSE_NGINX_PORT=.*/EXPOSE_NGINX_PORT=${docker_port}/; s/^EXPOSE_NGINX_SSL_PORT=.*/EXPOSE_NGINX_SSL_PORT=8858/" /home/docker/dify/docker/.env
docker compose up -d
clear
echo "Установлен"
check_docker_app_ip
}
docker_app_update() {
cd /home/docker/dify/docker/ && docker compose down --rmi all
cd /home/docker/dify/
git pull origin main
sed -i 's/^EXPOSE_NGINX_PORT=.*/EXPOSE_NGINX_PORT=8058/; s/^EXPOSE_NGINX_SSL_PORT=.*/EXPOSE_NGINX_SSL_PORT=8858/' /home/docker/dify/docker/.env
cd /home/docker/dify/docker/ && docker compose up -d
}
docker_app_uninstall() {
cd /home/docker/dify/docker/ && docker compose down --rmi all
rm -rf /home/docker/dify
echo "Приложение было удалено"
}
docker_app_plus
;;
59)
local app_name="New API"
local app_text="新一代大模型网关与AI资产管理系统"
local app_url="官方网站: https://github.com/Calcium-Ion/new-api"
local docker_name="new-api"
local docker_port="8059"
local app_size="3"
docker_app_install() {
install git
mkdir -p /home/docker/ && cd /home/docker/ && git clone ${gh_proxy}github.com/Calcium-Ion/new-api.git && cd new-api
sed -i -e "s/- \"3000:3000\"/- \"${docker_port}:3000\"/g" \
-e 's/container_name: redis/container_name: redis-new-api/g' \
-e 's/container_name: mysql/container_name: mysql-new-api/g' \
docker-compose.yml
docker compose up -d
clear
echo "Установлен"
check_docker_app_ip
}
docker_app_update() {
cd /home/docker/new-api/ && docker compose down --rmi all
cd /home/docker/new-api/
git pull origin main
sed -i -e "s/- \"3000:3000\"/- \"${docker_port}:3000\"/g" \
-e 's/container_name: redis/container_name: redis-new-api/g' \
-e 's/container_name: mysql/container_name: mysql-new-api/g' \
docker-compose.yml
docker compose up -d
clear
echo "Установлен"
check_docker_app_ip
}
docker_app_uninstall() {
cd /home/docker/new-api/ && docker compose down --rmi all
rm -rf /home/docker/new-api
echo "Приложение было удалено"
}
docker_app_plus
;;
60)
local app_name="JumpServer开源堡垒机"
local app_text="是一个开源的特权访问管理 (PAM) 工具该程序占用80端口不支持添加域名访问了"
local app_url="官方介绍: https://github.com/jumpserver/jumpserver"
local docker_name="jms_web"
local docker_port="80"
local app_size="2"
docker_app_install() {
curl -sSL ${gh_proxy}github.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash
clear
echo "Установлен"
check_docker_app_ip
echo "Первоначальное имя пользователя: администратор"
echo "Первоначальный пароль: Changeme"
}
docker_app_update() {
cd /opt/jumpserver-installer*/
./jmsctl.sh upgrade
echo "Приложение было обновлено"
}
docker_app_uninstall() {
cd /opt/jumpserver-installer*/
./jmsctl.sh uninstall
cd /opt
rm -rf jumpserver-installer*/
rm -rf jumpserver
echo "Приложение было удалено"
}
docker_app_plus
;;
61)
local docker_name="libretranslate"
local docker_img="libretranslate/libretranslate:latest"
local docker_port=8061
docker_rum() {
docker run -d \
-p ${docker_port}:5000 \
--name libretranslate \
libretranslate/libretranslate \
--load-only ko,zt,zh,en,ja,pt,es,fr,de,ru
}
local docker_describe="免费开源机器翻译 API完全自托管它的翻译引擎由开源Argos Translate库提供支持。"
local docker_url="官网介绍: https://github.com/LibreTranslate/LibreTranslate"
local docker_use=""
local docker_passwd=""
local app_size="5"
docker_app
;;
62)
local app_name="RAGFlow知识库"
local app_text="基于深度文档理解的开源 RAG检索增强生成引擎"
local app_url="官方网站: https://github.com/infiniflow/ragflow"
local docker_name="ragflow-server"
local docker_port="8062"
local app_size="8"
docker_app_install() {
install git
mkdir -p /home/docker/ && cd /home/docker/ && git clone ${gh_proxy}github.com/infiniflow/ragflow.git && cd ragflow/docker
sed -i "s/- 80:80/- ${docker_port}:80/; /- 443:443/d" docker-compose.yml
docker compose up -d
clear
echo "Установлен"
check_docker_app_ip
}
docker_app_update() {
cd /home/docker/ragflow/docker/ && docker compose down --rmi all
cd /home/docker/ragflow/
git pull origin main
cd /home/docker/ragflow/docker/
sed -i "s/- 80:80/- ${docker_port}:80/; /- 443:443/d" docker-compose.yml
docker compose up -d
}
docker_app_uninstall() {
cd /home/docker/ragflow/docker/ && docker compose down --rmi all
rm -rf /home/docker/ragflow
echo "Приложение было удалено"
}
docker_app_plus
;;
63)
local docker_name="open-webui"
local docker_img="ghcr.io/open-webui/open-webui:main"
local docker_port=8063
docker_rum() {
docker run -d -p ${docker_port}:8080 -v /home/docker/open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
}
local docker_describe="OpenWebUI一款大语言模型网页框架官方精简版本支持各大模型API接入"
local docker_url="官网介绍: https://github.com/open-webui/open-webui"
local docker_use=""
local docker_passwd=""
local app_size="3"
docker_app
;;
64)
local docker_name="it-tools"
local docker_img="corentinth/it-tools:latest"
local docker_port=8064
docker_rum() {
docker run -d --name it-tools --restart unless-stopped -p ${docker_port}:80 corentinth/it-tools:latest
}
local docker_describe="对开发人员和 IT 工作者来说非常有用的工具"
local docker_url="官网介绍: https://github.com/CorentinTh/it-tools"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
65)
local docker_name="n8n"
local docker_img="docker.n8n.io/n8nio/n8n"
local docker_port=8065
docker_rum() {
add_yuming
mkdir -p /home/docker/n8n
chmod -R 777 /home/docker/n8n
docker run -d --name n8n \
--restart always \
-p ${docker_port}:5678 \
-v /home/docker/n8n:/home/node/.n8n \
-e N8N_HOST=${yuming} \
-e N8N_PORT=5678 \
-e N8N_PROTOCOL=https \
-e N8N_WEBHOOK_URL=https://${yuming}/ \
docker.n8n.io/n8nio/n8n
ldnmp_Proxy ${yuming} ${ipv4_address} ${docker_port}
block_container_port "$docker_name" "$ipv4_address"
}
local docker_describe="是一款功能强大的自动化工作流平台"
local docker_url="官网介绍: https://github.com/n8n-io/n8n"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
66)
yt_menu_pro
;;
67)
local docker_name="ddns-go"
local docker_img="jeessy/ddns-go"
local docker_port=9876
docker_rum() {
docker run -d \
--name ddns-go \
--restart=always \
-p ${docker_port}:9876 \
-v /home/docker/ddns-go:/root \
jeessy/ddns-go
}
local docker_describe="自动将你的公网 IPIPv4/IPv6实时更新到各大 DNS 服务商,实现动态域名解析。"
local docker_url="官网介绍: https://github.com/CorentinTh/it-tools"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app
;;
68)
local docker_name="allinssl"
local docker_img="allinssl/allinssl:latest"
local docker_port=7979
docker_rum() {
docker run -itd --name allinssl -p ${docker_port}:8888 -v /home/docker/allinssl/data:/www/allinssl/data -e ALLINSSL_USER=allinssl -e ALLINSSL_PWD=allinssldocker -e ALLINSSL_URL=allinssl allinssl/allinssl:latest
}
local docker_describe="开源免费的 SSL 证书自动化管理平台"
local docker_url="官网介绍: https://allinssl.com"
local docker_use="echo \"初始用户名: allinssl\""
local docker_passwd="echo \"初始密码: allinssldocker\""
local app_size="1"
docker_app
;;
0)
kejilion
;;
*)
echo "Неверный ввод!"
;;
esac
break_end
done
}
linux_work() {
while true; do
clear
send_stats "Мое рабочее пространство"
echo -e "Мое рабочее пространство"
echo -e "Система предоставит вам рабочее пространство, которое можно запустить на бэкэнд, которую вы можете использовать для выполнения долгосрочных задач."
echo -e "Даже если вы отключите SSH, задачи в рабочем пространстве не будут прерваны, а задачи на заднем плане будут резидентами."
echo -e "${gl_huang}намекать:${gl_bai}После входа в рабочую область используйте Ctrl+B и нажмите D в одиночку, чтобы выйти из рабочего пространства!"
echo -e "${gl_kjlan}------------------------"
echo "Список существующих рабочих пространств в настоящее время"
echo -e "${gl_kjlan}------------------------"
tmux list-sessions
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}1. ${gl_bai}Рабочая область № 1"
echo -e "${gl_kjlan}2. ${gl_bai}Рабочая область № 2"
echo -e "${gl_kjlan}3. ${gl_bai}Рабочая область № 3"
echo -e "${gl_kjlan}4. ${gl_bai}Рабочая область № 4"
echo -e "${gl_kjlan}5. ${gl_bai}Рабочая область № 5"
echo -e "${gl_kjlan}6. ${gl_bai}Рабочая область № 6"
echo -e "${gl_kjlan}7. ${gl_bai}Рабочая область № 7"
echo -e "${gl_kjlan}8. ${gl_bai}Рабочая область № 8"
echo -e "${gl_kjlan}9. ${gl_bai}Рабочая область № 9"
echo -e "${gl_kjlan}10. ${gl_bai}Рабочая область № 10"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}21. ${gl_bai}Режим резидента SSH${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}22. ${gl_bai}Создать/введите рабочую область"
echo -e "${gl_kjlan}23. ${gl_bai}Введите команды в фоновое рабочее пространство"
echo -e "${gl_kjlan}24. ${gl_bai}Удалить указанное рабочее пространство"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}0. ${gl_bai}Вернуться в главное меню"
echo -e "${gl_kjlan}------------------------${gl_bai}"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
clear
install tmux
local SESSION_NAME="work1"
send_stats "Начните рабочее пространство$SESSION_NAME"
tmux_run
;;
2)
clear
install tmux
local SESSION_NAME="work2"
send_stats "Начните рабочее пространство$SESSION_NAME"
tmux_run
;;
3)
clear
install tmux
local SESSION_NAME="work3"
send_stats "Начните рабочее пространство$SESSION_NAME"
tmux_run
;;
4)
clear
install tmux
local SESSION_NAME="work4"
send_stats "Начните рабочее пространство$SESSION_NAME"
tmux_run
;;
5)
clear
install tmux
local SESSION_NAME="work5"
send_stats "Начните рабочее пространство$SESSION_NAME"
tmux_run
;;
6)
clear
install tmux
local SESSION_NAME="work6"
send_stats "Начните рабочее пространство$SESSION_NAME"
tmux_run
;;
7)
clear
install tmux
local SESSION_NAME="work7"
send_stats "Начните рабочее пространство$SESSION_NAME"
tmux_run
;;
8)
clear
install tmux
local SESSION_NAME="work8"
send_stats "Начните рабочее пространство$SESSION_NAME"
tmux_run
;;
9)
clear
install tmux
local SESSION_NAME="work9"
send_stats "Начните рабочее пространство$SESSION_NAME"
tmux_run
;;
10)
clear
install tmux
local SESSION_NAME="work10"
send_stats "Начните рабочее пространство$SESSION_NAME"
tmux_run
;;
21)
while true; do
clear
if grep -q 'tmux attach-session -t sshd || tmux new-session -s sshd' ~/.bashrc; then
local tmux_sshd_status="${gl_lv}开启${gl_bai}"
else
local tmux_sshd_status="${gl_hui}关闭${gl_bai}"
fi
send_stats "Режим резидента SSH"
echo -e "Режим резидента SSH${tmux_sshd_status}"
echo "После того, как соединение SSH будет включено, оно напрямую введет режим резидента и вернется в предыдущее рабочее состояние."
echo "------------------------"
echo "1. Включите 2. Выключите"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" gongzuoqu_del
case "$gongzuoqu_del" in
1)
install tmux
local SESSION_NAME="sshd"
send_stats "Начните рабочее пространство$SESSION_NAME"
grep -q "tmux attach-session -t sshd" ~/.bashrc || echo -e "\ n# автоматически введите сеанс TMUX \ nif [[-Z \"\$TMUX\" ]]; then\n tmux attach-session -t sshd || tmux new-session -s sshd\nfi" >> ~/.bashrc
source ~/.bashrc
tmux_run
;;
2)
sed -i '/# 自动进入 tmux 会话/,+4d' ~/.bashrc
tmux kill-window -t sshd
;;
*)
break
;;
esac
done
;;
22)
read -e -p "Пожалуйста, введите имя созданного или введенного рабочего пространства, например, 1001 KJ001 Work1:" SESSION_NAME
tmux_run
send_stats "Пользовательская рабочая область"
;;
23)
read -e -p "Пожалуйста, введите команду, которую хотите выполнить в фоновом режиме, например: curl -fssl https://get.docker.com | SH:" tmuxd
tmux_run_d
send_stats "Введите команды в фоновое рабочее пространство"
;;
24)
read -e -p "Пожалуйста, введите имя рабочего пространства, которое вы хотите удалить:" gongzuoqu_name
tmux kill-window -t $gongzuoqu_name
send_stats "Удалить рабочее пространство"
;;
0)
kejilion
;;
*)
echo "Неверный ввод!"
;;
esac
break_end
done
}
linux_Settings() {
while true; do
clear
# send_stats "системные инструменты"
echo -e "Системные инструменты"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}1. ${gl_bai}Установить ярлычные клавиши запуска скрипта${gl_kjlan}2. ${gl_bai}Измените пароль входа в систему"
echo -e "${gl_kjlan}3. ${gl_bai}Режим регистрации пароля корня${gl_kjlan}4. ${gl_bai}Установите указанную версию Python"
echo -e "${gl_kjlan}5. ${gl_bai}Откройте все порты${gl_kjlan}6. ${gl_bai}Изменить порт соединения SSH"
echo -e "${gl_kjlan}7. ${gl_bai}Оптимизировать адрес DNS${gl_kjlan}8. ${gl_bai}Система повторной установки в один клик${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}9. ${gl_bai}Отключить корневую учетную запись для создания новой учетной записи${gl_kjlan}10. ${gl_bai}Переключить приоритет IPv4/IPv6"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}11. ${gl_bai}Проверьте статус оккупации порта${gl_kjlan}12. ${gl_bai}Изменить размер виртуальной памяти"
echo -e "${gl_kjlan}13. ${gl_bai}Управление пользователями${gl_kjlan}14. ${gl_bai}Пользователь/генератор пароля"
echo -e "${gl_kjlan}15. ${gl_bai}Системная регулировка часового пояса${gl_kjlan}16. ${gl_bai}Настройка ускорения BBR3"
echo -e "${gl_kjlan}17. ${gl_bai}Брандмауэр продвинутый менеджер${gl_kjlan}18. ${gl_bai}Измените имя хоста"
echo -e "${gl_kjlan}19. ${gl_bai}Источник обновления системы переключения${gl_kjlan}20. ${gl_bai}Управление задачами времени"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}21. ${gl_bai}Расположение местного хозяина${gl_kjlan}22. ${gl_bai}SSH защитная программа"
echo -e "${gl_kjlan}23. ${gl_bai}Автоматическое отключение тока ограничения${gl_kjlan}24. ${gl_bai}Режим входа в лоб"
echo -e "${gl_kjlan}25. ${gl_bai}Мониторинг системы TG-Bot и раннее предупреждение${gl_kjlan}26. ${gl_bai}Исправление уязвимостей с высоким риском Opensh (Xiuyuan)"
echo -e "${gl_kjlan}27. ${gl_bai}Red Hat Hat Linux Upgrade${gl_kjlan}28. ${gl_bai}Оптимизация параметров ядра в системе Linux${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}29. ${gl_bai}Инструмент сканирования вируса${gl_huang}${gl_bai} ${gl_kjlan}30. ${gl_bai}Файловый менеджер"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}31. ${gl_bai}Переключение языка системы${gl_kjlan}32. ${gl_bai}Инструмент украшения командной строки${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}33. ${gl_bai}Установите мусорное ведро для переработки системы${gl_kjlan}34. ${gl_bai}Резервное копирование системы и восстановление"
echo -e "${gl_kjlan}35. ${gl_bai}инструмент удаленного подключения SSH${gl_kjlan}36. ${gl_bai}Инструмент управления распределением жесткого диска"
echo -e "${gl_kjlan}37. ${gl_bai}История командной строки${gl_kjlan}38. ${gl_bai}инструмент дистанционной синхронизации RSYNC"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}41. ${gl_bai}Доска объявлений${gl_kjlan}66. ${gl_bai}Оптимизация системы универсальной системы${gl_huang}${gl_bai}"
echo -e "${gl_kjlan}99. ${gl_bai}Перезагрузите сервер${gl_kjlan}100. ${gl_bai}Конфиденциальность и безопасность"
echo -e "${gl_kjlan}101. ${gl_bai}Усовершенствованное использование команды K${gl_huang}${gl_bai} ${gl_kjlan}102. ${gl_bai}Сценарий удаления технического льва"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}0. ${gl_bai}Вернуться в главное меню"
echo -e "${gl_kjlan}------------------------${gl_bai}"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
while true; do
clear
read -e -p "Пожалуйста, введите свой клавиша сочетания (введите 0 для выхода):" kuaijiejian
if [ "$kuaijiejian" == "0" ]; then
break_end
linux_Settings
fi
find /usr/local/bin/ -type l -exec bash -c 'test "$(readlink -f {})" = "/usr/local/bin/k" && rm -f {}' \;
ln -s /usr/local/bin/k /usr/local/bin/$kuaijiejian
echo "Клавиши для сочетания установлены"
send_stats "Клавиши для сценария были установлены"
break_end
linux_Settings
done
;;
2)
clear
send_stats "Установите пароль для входа в систему"
echo "Установите пароль для входа в систему"
passwd
;;
3)
root_use
send_stats "Режим пароля корня"
add_sshpasswd
;;
4)
root_use
send_stats "Управление версией PY"
echo "Управление версией Python"
echo "Введение видео: https://www.bilibili.com/video/bv1pm42157ck?t=0.1"
echo "---------------------------------------"
echo "Эта функция плавно устанавливает любую версию, официально поддерживаемую Python!"
local VERSION=$(python3 -V 2>&1 | awk '{print $2}')
echo -e "Текущий номер версии Python:${gl_huang}$VERSION${gl_bai}"
echo "------------"
echo "Рекомендуемая версия: 3.12 3.11 3.10 3.9 3.8 2,7"
echo "Запрос больше версий: https://www.python.org/downloads/"
echo "------------"
read -e -p "Введите номер версии Python, который вы хотите установить (введите 0 для выхода):" py_new_v
if [[ "$py_new_v" == "0" ]]; then
send_stats "Скрипт PY Management"
break_end
linux_Settings
fi
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
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/*
local VERSION=$(python -V 2>&1 | awk '{print $2}')
echo -e "Текущий номер версии Python:${gl_huang}$VERSION${gl_bai}"
send_stats "Переключить скрипт py версия"
;;
5)
root_use
send_stats "Открытый порт"
iptables_open
remove iptables-persistent ufw firewalld iptables-services > /dev/null 2>&1
echo "Все порты открыты"
;;
6)
root_use
send_stats "Изменить порт SSH"
while true; do
clear
sed -i 's/#Port/Port/' /etc/ssh/sshd_config
# Прочитайте текущий номер порта SSH
local current_port=$(grep -E '^ *Port [0-9]+' /etc/ssh/sshd_config | awk '{print $2}')
# Распечатайте текущий номер порта SSH
echo -e "Текущий номер порта SSH:${gl_huang}$current_port ${gl_bai}"
echo "------------------------"
echo "Номера с номерами портов в диапазоне от 1 до 65535. (Введите 0, чтобы выходить)"
# Предложите пользователю ввести новый номер порта SSH
read -e -p "Пожалуйста, введите новый номер порта SSH:" new_port
# Определите, находится ли номер порта в пределах достоверного диапазона
if [[ $new_port =~ ^[0-9]+$ ]]; then # 检查输入是否为数字
if [[ $new_port -ge 1 && $new_port -le 65535 ]]; then
send_stats "Порт SSH был изменен"
new_ssh_port
elif [[ $new_port -eq 0 ]]; then
send_stats "Выход модификации порта SSH"
break
else
echo "Номер порта недействителен, введите число от 1 до 65535."
send_stats "Неверный ввод порта SSH"
break_end
fi
else
echo "Ввод недействителен, введите номер."
send_stats "Неверный ввод порта SSH"
break_end
fi
done
;;
7)
set_dns_ui
;;
8)
dd_xitong
;;
9)
root_use
send_stats "Новые пользователи отключают root"
read -e -p "Пожалуйста, введите новое имя пользователя (введите 0 для выхода):" new_username
if [ "$new_username" == "0" ]; then
break_end
linux_Settings
fi
useradd -m -s /bin/bash "$new_username"
passwd "$new_username"
echo "$new_username ALL=(ALL:ALL) ALL" | tee -a /etc/sudoers
passwd -l root
echo "Операция была завершена."
;;
10)
root_use
send_stats "Установите приоритет V4/V6"
while true; do
clear
echo "Установите приоритет V4/V6"
echo "------------------------"
local ipv6_disabled=$(sysctl -n net.ipv6.conf.all.disable_ipv6)
if [ "$ipv6_disabled" -eq 1 ]; then
echo -e "Текущие настройки приоритета сети:${gl_huang}IPv4${gl_bai}приоритет"
else
echo -e "Текущие настройки приоритета сети:${gl_huang}IPv6${gl_bai}приоритет"
fi
echo ""
echo "------------------------"
echo "1. Приоритет IPv4 2. Приоритет IPv6 3. Инструмент ремонта IPv6"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Выберите предпочтительную сеть:" choice
case $choice in
1)
sysctl -w net.ipv6.conf.all.disable_ipv6=1 > /dev/null 2>&1
echo "Переключен на приоритет IPv4"
send_stats "Переключен на приоритет IPv4"
;;
2)
sysctl -w net.ipv6.conf.all.disable_ipv6=0 > /dev/null 2>&1
echo "Переключен на приоритет IPv6"
send_stats "Переключен на приоритет IPv6"
;;
3)
clear
bash <(curl -L -s jhb.ovh/jb/v6.sh)
echo "Эта функция предоставлена ​​мастером JHB, благодаря ему!"
send_stats "IPv6 исправление"
;;
*)
break
;;
esac
done
;;
11)
clear
ss -tulnape
;;
12)
root_use
send_stats "Настройка виртуальной памяти"
while true; do
clear
echo "Настройка виртуальной памяти"
local swap_used=$(free -m | awk 'NR==3{print $3}')
local swap_total=$(free -m | awk 'NR==3{print $2}')
local swap_info=$(free -m | awk 'NR==3{used=$3; total=$2; if (total == 0) {percentage=0} else {percentage=used*100/total}; printf "%dM/%dM (%d%%)", used, total, percentage}')
echo -e "Текущая виртуальная память:${gl_huang}$swap_info${gl_bai}"
echo "------------------------"
echo "1. Назначить 1024m 2. Назначить 2048m 3. Назначить 4096m 4. Пользовательский размер"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" choice
case "$choice" in
1)
send_stats "1G виртуальная память была установлена"
add_swap 1024
;;
2)
send_stats "2G виртуальная память была установлена"
add_swap 2048
;;
3)
send_stats "4G виртуальная память была установлена"
add_swap 4096
;;
4)
read -e -p "Пожалуйста, введите размер виртуальной памяти (блок M):" new_swap
add_swap "$new_swap"
send_stats "Пользовательская виртуальная память была установлена"
;;
*)
break
;;
esac
done
;;
13)
while true; do
root_use
send_stats "Управление пользователями"
echo "Список пользователей"
echo "----------------------------------------------------------------------------"
printf "%-24s %-34s %-20s %-10s\n" "用户名" "用户权限" "用户组" "sudo权限"
while IFS=: read -r username _ userid groupid _ _ homedir shell; do
local groups=$(groups "$username" | cut -d : -f 2)
local 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 -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
# Позвольте пользователю ввести новое имя пользователя
read -e -p "Пожалуйста, введите новое имя пользователя:" new_username
# Создайте нового пользователя и установите пароль
useradd -m -s /bin/bash "$new_username"
passwd "$new_username"
echo "Операция была завершена."
;;
2)
# Позвольте пользователю ввести новое имя пользователя
read -e -p "Пожалуйста, введите новое имя пользователя:" new_username
# Создайте нового пользователя и установите пароль
useradd -m -s /bin/bash "$new_username"
passwd "$new_username"
# Предоставить новым пользователям разрешения Sudo
echo "$new_username ALL=(ALL:ALL) ALL" | tee -a /etc/sudoers
echo "Операция была завершена."
;;
3)
read -e -p "Пожалуйста, введите свое имя пользователя:" username
# Предоставить новым пользователям разрешения Sudo
echo "$username ALL=(ALL:ALL) ALL" | tee -a /etc/sudoers
;;
4)
read -e -p "Пожалуйста, введите свое имя пользователя:" username
# Удалить разрешения SUDO пользователя из файла Sudoers
sed -i "/^$username\sALL=(ALL:ALL)\sALL/d" /etc/sudoers
;;
5)
read -e -p "Пожалуйста, введите имя пользователя, чтобы удалить:" username
# Удалить пользователя и его домашний каталог
userdel -r "$username"
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
14)
clear
send_stats "Пользовательский генератор"
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 "------------------------"
local first_names=("John" "Jane" "Michael" "Emily" "David" "Sophia" "William" "Olivia" "James" "Emma" "Ava" "Liam" "Mia" "Noah" "Isabella")
local last_names=("Smith" "Johnson" "Brown" "Davis" "Wilson" "Miller" "Jones" "Garcia" "Martinez" "Williams" "Lee" "Gonzalez" "Rodriguez" "Hernandez")
# Сгенерировать 5 случайных имен пользователей
for i in {1..5}; do
local first_name_index=$((RANDOM % ${#first_names[@]}))
local last_name_index=$((RANDOM % ${#last_names[@]}))
local 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
local 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
local password=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c32)
echo "Случайный пароль$i: $password"
done
echo ""
;;
15)
root_use
send_stats "Смену часовой пояс"
while true; do
clear
echo "Информация о системном времени"
# Получите текущий часовой пояс системы
local timezone=$(current_timezone)
# Получите текущее системное время
local current_time=$(date +"%Y-%m-%d %H:%M:%S")
# Показать часовой пояс и время
echo "Текущий системный часовой пояс:$timezone"
echo "Текущее системное время:$current_time"
echo ""
echo "Переключение часового пояса"
echo "------------------------"
echo "Азия"
echo "1. Шанхайский время в Китае 2. Гонконгский время в Китае"
echo "3. Tokyo Time в Японии 4. Время в Сеуле в Южной Корее"
echo "5. Сингапурское время 6. Калькутта Время в Индии"
echo "7. Dubai Time в ОАЭ 8. Сиднейское время в Австралии"
echo "9. Время в Бангкоке, Таиланд"
echo "------------------------"
echo "Европа"
echo "11. Лондонское время в Великобритании 12. Парижское время во Франции"
echo "13. Берлинское время, Германия 14. Москва время, Россия"
echo "15. Utrecht Time в Нидерландах 16. Мадридское время в Испании"
echo "------------------------"
echo "Америка"
echo "21. Западное время 22. Восточное время"
echo "23. Канадское время 24. Мексиканское время"
echo "25. Бразилия 26. Аргентина времени"
echo "------------------------"
echo "31. UTC Global Standard Time"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -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 ;;
9) set_timedate Asia/Bangkok ;;
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 ;;
31) set_timedate UTC ;;
*) break ;;
esac
done
;;
16)
bbrv3
;;
17)
iptables_panel
;;
18)
root_use
send_stats "Измените имя хоста"
while true; do
clear
local current_hostname=$(uname -n)
echo -e "Текущее имя хоста:${gl_huang}$current_hostname${gl_bai}"
echo "------------------------"
read -e -p "Пожалуйста, введите новое имя хоста (введите 0 для выхода):" new_hostname
if [ -n "$new_hostname" ] && [ "$new_hostname" != "0" ]; 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
if grep -q "127.0.0.1" /etc/hosts; then
sed -i "s/127.0.0.1 .*/127.0.0.1 $new_hostname localhost localhost.localdomain/g" /etc/hosts
else
echo "127.0.0.1 $new_hostname localhost localhost.localdomain" >> /etc/hosts
fi
if grep -q "^::1" /etc/hosts; then
sed -i "s/^::1 .*/::1 $new_hostname localhost localhost.localdomain ipv6-localhost ipv6-loopback/g" /etc/hosts
else
echo "::1 $new_hostname localhost localhost.localdomain ipv6-localhost ipv6-loopback" >> /etc/hosts
fi
echo "Имя хоста было изменено на:$new_hostname"
send_stats "Имя хоста было изменено"
sleep 1
else
echo "Выйдет, имя хоста не изменилось."
break
fi
done
;;
19)
root_use
send_stats "Измените источник обновления системы"
clear
echo "Выберите область источника обновления"
echo "Подключитесь к Linuxmirrors, чтобы переключить источник обновления системы"
echo "------------------------"
echo "1. МАЙСКАЛЬНЫЙ Китай [DEFAULT] 2. МАЙКЛИЧЕСКИЙ КИТАЙС"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Введите свой выбор:" choice
case $choice in
1)
send_stats "Источник по умолчанию в материковом Китае"
bash <(curl -sSL https://linuxmirrors.cn/main.sh)
;;
2)
send_stats "Источник образования в материковом Китае"
bash <(curl -sSL https://linuxmirrors.cn/main.sh) --edu
;;
3)
send_stats "Зарубежное происхождение"
bash <(curl -sSL https://linuxmirrors.cn/main.sh) --abroad
;;
*)
echo "Отменен"
;;
esac
;;
20)
send_stats "Управление задачами времени"
while true; do
clear
check_crontab_installed
clear
echo "Временный список задач"
crontab -l
echo ""
echo "работать"
echo "------------------------"
echo "1. Добавить задачи времени 2. Удалить задачи времени 3. Редактировать задачи по времени"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
read -e -p "Пожалуйста, введите команду выполнения для новой задачи:" newquest
echo "------------------------"
echo "1. Ежемесячные задачи 2. Еженедельные задачи"
echo "3. Ежедневные задачи 4. Почасовые задачи"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" dingshi
case $dingshi in
1)
read -e -p "Выберите, какой день каждого месяца для выполнения задач? (1-30):" day
(crontab -l ; echo "0 0 $day * * $newquest") | crontab - > /dev/null 2>&1
;;
2)
read -e -p "Выберите, какую неделю выполнить задачу? (0-6, 0 представляет воскресенье):" weekday
(crontab -l ; echo "0 0 * * $weekday $newquest") | crontab - > /dev/null 2>&1
;;
3)
read -e -p "Выберите, в какое время выполнять задачи каждый день? (Часы, 0-23):" hour
(crontab -l ; echo "0 $hour * * * $newquest") | crontab - > /dev/null 2>&1
;;
4)
read -e -p "Введите в какую минуту часа выполнить задачу? (МИНС, 0-60):" minute
(crontab -l ; echo "$minute * * * * $newquest") | crontab - > /dev/null 2>&1
;;
*)
break # 跳出
;;
esac
send_stats "Добавить временные задачи"
;;
2)
read -e -p "Пожалуйста, введите ключевые слова, которые необходимо удалить:" kquest
crontab -l | grep -v "$kquest" | crontab -
send_stats "Удалить временные задачи"
;;
3)
crontab -e
send_stats "Редактировать задачи времени"
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
21)
root_use
send_stats "Расположение местного хозяина"
while true; do
clear
echo "Список анализа нативного хоста"
echo "Если вы добавите здесь сопоставления Parse, динамический анализ больше не будет использоваться"
cat /etc/hosts
echo ""
echo "работать"
echo "------------------------"
echo "1. Добавьте новый анализ 2. Удалить адресачрекающий адрес"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" host_dns
case $host_dns in
1)
read -e -p "Пожалуйста, введите новый формат записи анализа: 110.25.5.33 kejilion.pro:" addhost
echo "$addhost" >> /etc/hosts
send_stats "Спонирование местного хозяина было добавлено"
;;
2)
read -e -p "Пожалуйста, введите ключевые слова анализа контента, которые необходимо удалить:" delhost
sed -i "/$delhost/d" /etc/hosts
send_stats "Распокация и удаление местного хозяина"
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
22)
root_use
send_stats "SSH защита"
while true; do
if [ -x "$(command -v fail2ban-client)" ] ; then
clear
remove fail2ban
rm -rf /etc/fail2ban
else
clear
docker_name="fail2ban"
check_docker_app
echo -e "SSH защитная программа$check_docker"
echo "Fail2ban - это инструмент SSH для предотвращения грубой силы"
echo "Официальное веб -сайт Введение:${gh_proxy}github.com/fail2ban/fail2ban"
echo "------------------------"
echo "1. Установите защитную программу"
echo "------------------------"
echo "2. Просмотреть записи об перехвате SSH"
echo "3. Мониторинг журналов в реальном времени"
echo "------------------------"
echo "9. удалить программу обороны"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
install_docker
f2b_install_sshd
cd ~
f2b_status
break_end
;;
2)
echo "------------------------"
f2b_sshd
echo "------------------------"
break_end
;;
3)
tail -f /path/to/fail2ban/config/log/fail2ban/fail2ban.log
break
;;
9)
docker rm -f fail2ban
rm -rf /path/to/fail2ban
echo "Программа защиты Fail2ban была удалена"
;;
*)
break
;;
esac
fi
done
;;
23)
root_use
send_stats "Функция отключения лимита тока"
while true; do
clear
echo "Функция отключения лимита тока"
echo "Введение видео: https://www.bilibili.com/video/bv1mc411j7qd?t=0.1"
echo "------------------------------------------------"
echo "Текущее использование трафика, перезапуск расчета трафика сервера будет очищено!"
output_status
echo -e "${gl_kjlan}Всего получение:${gl_bai}$rx"
echo -e "${gl_kjlan}Всего отправить:${gl_bai}$tx"
# Проверьте, существует ли файл Limiting_shut_down.sh
if [ -f ~/Limiting_Shut_down.sh ]; then
# Получите значение threshold_gb
local rx_threshold_gb=$(grep -oP 'rx_threshold_gb=\K\d+' ~/Limiting_Shut_down.sh)
local tx_threshold_gb=$(grep -oP 'tx_threshold_gb=\K\d+' ~/Limiting_Shut_down.sh)
echo -e "${gl_lv}Текущий установление ограничения тока входной станции вступительно:${gl_huang}${rx_threshold_gb}${gl_lv}G${gl_bai}"
echo -e "${gl_lv}Текущий предел исходящего тока.${gl_huang}${tx_threshold_gb}${gl_lv}GB${gl_bai}"
else
echo -e "${gl_hui}Функция отключения лимита тока не включена${gl_bai}"
fi
echo
echo "------------------------------------------------"
echo "Система обнаружит, достигнет ли фактический трафик по порогу каждую минуту, и сервер будет автоматически выключаться после его прибытия!"
echo "------------------------"
echo "1. Включите функцию отключения лимита тока 2. Деактивировать функцию отключения предела тока"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" Limiting
case "$Limiting" in
1)
# Введите новый размер виртуальной памяти
echo "Если фактический сервер имеет 100G трафик, порог может быть установлен на 95G и заранее отключить питание, чтобы избежать ошибок трафика или переполнения."
read -e -p "Пожалуйста, введите порог входящего трафика (единица g, по умолчанию 100 г):" rx_threshold_gb
rx_threshold_gb=${rx_threshold_gb:-100}
read -e -p "Пожалуйста, введите порог исходящего трафика (единица g, по умолчанию 100 г):" tx_threshold_gb
tx_threshold_gb=${tx_threshold_gb:-100}
read -e -p "Пожалуйста, введите дату сброса трафика (сброс по умолчанию 1 -го числа каждого месяца):" cz_day
cz_day=${cz_day:-1}
cd ~
curl -Ss -o ~/Limiting_Shut_down.sh ${gh_proxy}raw.githubusercontent.com/kejilion/sh/main/Limiting_Shut_down1.sh
chmod +x ~/Limiting_Shut_down.sh
sed -i "s/110/$rx_threshold_gb/g" ~/Limiting_Shut_down.sh
sed -i "s/120/$tx_threshold_gb/g" ~/Limiting_Shut_down.sh
check_crontab_installed
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 $cz_day * * reboot") | crontab - > /dev/null 2>&1
echo "Отключение лимита тока было установлено"
send_stats "Отключение лимита тока было установлено"
;;
2)
check_crontab_installed
crontab -l | grep -v '~/Limiting_Shut_down.sh' | crontab -
crontab -l | grep -v 'reboot' | crontab -
rm ~/Limiting_Shut_down.sh
echo "Функция отключения лимита тока была отключена"
;;
*)
break
;;
esac
done
;;
24)
root_use
send_stats "Вход в личный ключ"
while true; do
clear
echo "Режим входа в лоб"
echo "Введение видео: https://www.bilibili.com/video/bv1q4421x78n?t=209.4"
echo "------------------------------------------------"
echo "Будет сгенерирована пара ключей, более безопасный способ входа в SSH"
echo "------------------------"
echo "1. Сгенерируйте новую клавишу 2. Импортируйте существующую клавишу 3. Просмотреть собственную клавишу"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" host_dns
case $host_dns in
1)
send_stats "Генерировать новый ключ"
add_sshkey
break_end
;;
2)
send_stats "Импортировать существующий открытый ключ"
import_sshkey
break_end
;;
3)
send_stats "Посмотреть местный секретный ключ"
echo "------------------------"
echo "Информация об открытом ключе"
cat ~/.ssh/authorized_keys
echo "------------------------"
echo "Информация о частном ключе"
cat ~/.ssh/sshkey
echo "------------------------"
break_end
;;
*)
break # 跳出循环,退出菜单
;;
esac
done
;;
25)
root_use
send_stats "Телеграмма предупреждение"
echo "Мониторинг TG-BOT и раннее предупреждение"
echo "Введение видео: https://youtu.be/vll-eb3z_ty"
echo "------------------------------------------------"
echo "Вам необходимо настроить API TG Robot и идентификатор пользователя для получения ранних предупреждений, чтобы реализовать мониторинг в реальном времени и раннее предупреждение нативного процессора, памяти, жесткого диска, трафика и входа в систему SSH"
echo "После достижения порога пользователь будет отправлен пользователю"
echo -e "${gl_hui}- Что касается трафика, перезапуск сервера пересчитает-${gl_bai}"
read -e -p "Вы обязательно продолжите? (Y/N):" choice
case "$choice" in
[Yy])
send_stats "Предупреждение телеграммы включено"
cd ~
install nano tmux bc jq
check_crontab_installed
if [ -f ~/TG-check-notify.sh ]; then
chmod +x ~/TG-check-notify.sh
nano ~/TG-check-notify.sh
else
curl -sS -O ${gh_proxy}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 ${gh_proxy}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
if command -v dnf &>/dev/null || command -v yum &>/dev/null; then
echo 'source ~/.profile' >> ~/.bashrc
fi
fi
source ~/.profile
clear
echo "Система раннего предупреждения TG-Bot началась"
echo -e "${gl_hui}Вы также можете поместить файл предупреждения tg-notify.sh в корневом каталоге на других машинах и использовать его напрямую!${gl_bai}"
;;
[Nn])
echo "Отменен"
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
26)
root_use
send_stats "Исправить уязвимости высокого риска в SSH"
cd ~
curl -sS -O ${gh_proxy}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
;;
27)
elrepo
;;
28)
Kernel_optimize
;;
29)
clamav
;;
30)
linux_file
;;
31)
linux_language
;;
32)
shell_bianse
;;
33)
linux_trash
;;
34)
linux_backup
;;
35)
ssh_manager
;;
36)
disk_manager
;;
37)
clear
send_stats "История командной строки"
get_history_file() {
for file in "$HOME"/.bash_history "$HOME"/.ash_history "$HOME"/.zsh_history "$HOME"/.local/share/fish/fish_history; do
[ -f "$file" ] && { echo "$file"; return; }
done
return 1
}
history_file=$(get_history_file) && cat -n "$history_file"
;;
38)
rsync_manager
;;
41)
clear
send_stats "Доска объявлений"
echo "Доска объявлений Technology Lion была перенесена в официальное сообщество! Пожалуйста, оставьте сообщение в официальном сообществе!"
echo "https://bbs.kejilion.pro/"
;;
66)
root_use
send_stats "Огнетающая настройка"
echo "Оптимизация системы универсальной системы"
echo "------------------------------------------------"
echo "Следующее будет управлять и оптимизировано"
echo "1. Обновите систему до последнего"
echo "2. Очистка системных мусорных файлов"
echo -e "3. Настройка виртуальной памяти${gl_huang}1G${gl_bai}"
echo -e "4. Установите номер порта SSH на${gl_huang}5522${gl_bai}"
echo -e "5. Откройте все порты"
echo -e "6. включите${gl_huang}BBR${gl_bai}ускорить"
echo -e "7. Установите часовой пояс на${gl_huang}Шанхай${gl_bai}"
echo -e "8. Автоматически оптимизировать адрес DNS${gl_huang}За рубежом: 1.1.1.1 8.8.8.8.${gl_bai}"
echo -e "9. Установите основные инструменты${gl_huang}docker wget sudo tar unzip socat btop nano vim${gl_bai}"
echo -e "10. Переключитесь на оптимизацию параметров ядра в системе Linux${gl_huang}Сбалансированный режим оптимизации${gl_bai}"
echo "------------------------------------------------"
read -e -p "Вы уверены, что у вас будет обслуживание на один клик? (Y/N):" choice
case "$choice" in
[Yy])
clear
send_stats "Начальник настройки универсал"
echo "------------------------------------------------"
linux_update
echo -e "[${gl_lv}OK${gl_bai}] 1/10. Обновить систему до последнего"
echo "------------------------------------------------"
linux_clean
echo -e "[${gl_lv}OK${gl_bai}] 2/10. Очистить системные мусорные файлы"
echo "------------------------------------------------"
add_swap 1024
echo -e "[${gl_lv}OK${gl_bai}] 3/10. Настройка виртуальной памяти${gl_huang}1G${gl_bai}"
echo "------------------------------------------------"
local new_port=5522
new_ssh_port
echo -e "[${gl_lv}OK${gl_bai}] 4/10. Установить номер порта SSH на${gl_huang}5522${gl_bai}"
echo "------------------------------------------------"
echo -e "[${gl_lv}OK${gl_bai}] 5/10. Откройте все порты"
echo "------------------------------------------------"
bbr_on
echo -e "[${gl_lv}OK${gl_bai}] 6/10. Открыть${gl_huang}BBR${gl_bai}ускорить"
echo "------------------------------------------------"
set_timedate Asia/Shanghai
echo -e "[${gl_lv}OK${gl_bai}] 7/10. Установить часовой пояс на${gl_huang}Шанхай${gl_bai}"
echo "------------------------------------------------"
local country=$(curl -s ipinfo.io/country)
if [ "$country" = "CN" ]; then
local dns1_ipv4="223.5.5.5"
local dns2_ipv4="183.60.83.19"
local dns1_ipv6="2400:3200::1"
local dns2_ipv6="2400:da00::6666"
else
local dns1_ipv4="1.1.1.1"
local dns2_ipv4="8.8.8.8"
local dns1_ipv6="2606:4700:4700::1111"
local dns2_ipv6="2001:4860:4860::8888"
fi
set_dns
echo -e "[${gl_lv}OK${gl_bai}] 8/10. Автоматически оптимизировать адрес DNS${gl_huang}${gl_bai}"
echo "------------------------------------------------"
install_docker
install wget sudo tar unzip socat btop nano vim
echo -e "[${gl_lv}OK${gl_bai}] 9/10. Установите основные инструменты${gl_huang}docker wget sudo tar unzip socat btop nano vim${gl_bai}"
echo "------------------------------------------------"
echo "------------------------------------------------"
optimize_balanced
echo -e "[${gl_lv}OK${gl_bai}] 10/10. Оптимизация параметров ядра для системы Linux"
echo -e "${gl_lv}Однопопная система настройки системы была завершена${gl_bai}"
;;
[Nn])
echo "Отменен"
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
99)
clear
send_stats "Перезагрузить систему"
server_reboot
;;
100)
root_use
while true; do
clear
if grep -q '^ENABLE_STATS="true"' /usr/local/bin/k > /dev/null 2>&1; then
local status_message="${gl_lv}正在采集数据${gl_bai}"
elif grep -q '^ENABLE_STATS="false"' /usr/local/bin/k > /dev/null 2>&1; then
local status_message="${gl_hui}采集已关闭${gl_bai}"
else
local status_message="无法确定的状态"
fi
echo "Конфиденциальность и безопасность"
echo "Скрипт будет собирать данные по пользовательским функциям, оптимизировать опыт сценария и создавать больше забавных и полезных функций."
echo "Создаст номер версии сценария, время использования, версию системы, архитектура процессора, страна машины и название используемой функции,"
echo "------------------------------------------------"
echo -e "Текущий статус:$status_message"
echo "--------------------"
echo "1. Включите коллекцию"
echo "2. Закройте коллекцию"
echo "--------------------"
echo "0. Вернитесь в предыдущее меню"
echo "--------------------"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
cd ~
sed -i 's/^ENABLE_STATS="false"/ENABLE_STATS="true"/' /usr/local/bin/k
sed -i 's/^ENABLE_STATS="false"/ENABLE_STATS="true"/' ~/kejilion.sh
echo "Коллекция была включена"
send_stats "Конфиденциальность и сбор безопасности были включены"
;;
2)
cd ~
sed -i 's/^ENABLE_STATS="true"/ENABLE_STATS="false"/' /usr/local/bin/k
sed -i 's/^ENABLE_STATS="true"/ENABLE_STATS="false"/' ~/kejilion.sh
echo "Коллекция закрыта"
send_stats "Конфиденциальность и безопасность были закрыты для сбора"
;;
*)
break
;;
esac
done
;;
101)
clear
k_info
;;
102)
clear
send_stats "Сценарий удаления технического льва"
echo "Сценарий удаления технического льва"
echo "------------------------------------------------"
echo "Полностью удалит сценарий Kejilion и не повлияет на ваши другие функции"
read -e -p "Вы обязательно продолжите? (Y/N):" choice
case "$choice" in
[Yy])
clear
(crontab -l | grep -v "kejilion.sh") | crontab -
rm -f /usr/local/bin/k
rm ~/kejilion.sh
echo "Сценарий был удален, прощай!"
break_end
clear
exit
;;
[Nn])
echo "Отменен"
;;
*)
echo "Неверный выбор, пожалуйста, введите Y или N."
;;
esac
;;
0)
kejilion
;;
*)
echo "Неверный ввод!"
;;
esac
break_end
done
}
linux_file() {
root_use
send_stats "Файловый менеджер"
while true; do
clear
echo "Файловый менеджер"
echo "------------------------"
echo "Текущий путь"
pwd
echo "------------------------"
ls --color=auto -x
echo "------------------------"
echo "1. Введите каталог 2. Создайте каталог 3. Измените разрешения каталога 4. Переименовать каталог"
echo "5. Удалить каталог 6. Вернитесь в предыдущий каталог меню"
echo "------------------------"
echo "11. Создайте файл 12. Изменить файл 13. Изменить разрешения на файл 14. Переименовать файл"
echo "15. Удалить файл"
echo "------------------------"
echo "21. Сжатие каталога файлов 22. Справочник UNZIP файлов 23. Перемещение файлового каталога 24. Копировать файл каталог"
echo "25. Передайте файл на другой сервер"
echo "------------------------"
echo "0. Вернитесь в предыдущее меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" Limiting
case "$Limiting" in
1) # 进入目录
read -e -p "Пожалуйста, введите имя каталога:" dirname
cd "$dirname" 2>/dev/null || echo "Невозможно войти в каталог"
send_stats "Перейти к каталогу"
;;
2) # 创建目录
read -e -p "Пожалуйста, введите имя каталога, чтобы создать:" dirname
mkdir -p "$dirname" && echo "Каталог создан" || echo "Творение не удалось"
send_stats "Создать каталог"
;;
3) # 修改目录权限
read -e -p "Пожалуйста, введите имя каталога:" dirname
read -e -p "Пожалуйста, введите разрешения (например, 755):" perm
chmod "$perm" "$dirname" && echo "Разрешения были изменены" || echo "Модификация не удалась"
send_stats "Изменить разрешения каталога"
;;
4) # 重命名目录
read -e -p "Пожалуйста, введите имя текущего каталога:" current_name
read -e -p "Пожалуйста, введите новое имя каталога:" new_name
mv "$current_name" "$new_name" && echo "Каталог был переименован" || echo "Переименование не удалось"
send_stats "Переименовать каталог"
;;
5) # 删除目录
read -e -p "Пожалуйста, введите имя каталога, чтобы удалить:" dirname
rm -rf "$dirname" && echo "Каталог был удален" || echo "Удаление не удалось"
send_stats "Удалить каталог"
;;
6) # 返回上一级选单目录
cd ..
send_stats "Вернуться в предыдущий каталог меню"
;;
11) # 创建文件
read -e -p "Пожалуйста, введите имя файла, чтобы создать:" filename
touch "$filename" && echo "Файл создан" || echo "Творение не удалось"
send_stats "Создайте файл"
;;
12) # 编辑文件
read -e -p "Пожалуйста, введите имя файла, чтобы редактировать:" filename
install nano
nano "$filename"
send_stats "Редактировать файлы"
;;
13) # 修改文件权限
read -e -p "Пожалуйста, введите имя файла:" filename
read -e -p "Пожалуйста, введите разрешения (например, 755):" perm
chmod "$perm" "$filename" && echo "Разрешения были изменены" || echo "Модификация не удалась"
send_stats "Изменить разрешения на файл"
;;
14) # 重命名文件
read -e -p "Пожалуйста, введите текущее имя файла:" current_name
read -e -p "Пожалуйста, введите новое имя файла:" new_name
mv "$current_name" "$new_name" && echo "Файл переименован" || echo "Переименование не удалось"
send_stats "Переименовать файл"
;;
15) # 删除文件
read -e -p "Пожалуйста, введите имя файла, чтобы удалить:" filename
rm -f "$filename" && echo "Файл удален" || echo "Удаление не удалось"
send_stats "Удалить файлы"
;;
21) # 压缩文件/目录
read -e -p "Пожалуйста, введите имя файла/каталога для сжатия:" name
install tar
tar -czvf "$name.tar.gz" "$name" && echo "Сжимается$name.tar.gz" || echo "Сжатие не удалось"
send_stats "Сжатые файлы/каталоги"
;;
22) # 解压文件/目录
read -e -p "Пожалуйста, введите имя файла (.tar.gz):" filename
install tar
tar -xzvf "$filename" && echo "Декомпрессированный$filename" || echo "Декомпрессия не удалась"
send_stats "Файлы/каталоги беззазазации"
;;
23) # 移动文件或目录
read -e -p "Пожалуйста, введите путь к файлу или каталогу для перемещения:" src_path
if [ ! -e "$src_path" ]; then
echo "Ошибка: файл или каталог не существует."
send_stats "Не удалось переместить файл или каталог: файл или каталог не существует"
continue
fi
read -e -p "Пожалуйста, введите целевой путь (включая новое имя файла или имя каталога):" dest_path
if [ -z "$dest_path" ]; then
echo "Ошибка: введите целевой путь."
send_stats "Не удалось перемещение файла или каталога: путь назначения не указан"
continue
fi
mv "$src_path" "$dest_path" && echo "Файл или каталог были перемещены в$dest_path" || echo "Не удалось перемещать файлы или каталоги"
send_stats "Перемещать файлы или каталоги"
;;
24) # 复制文件目录
read -e -p "Пожалуйста, введите путь к файлу или каталогу для копирования:" src_path
if [ ! -e "$src_path" ]; then
echo "Ошибка: файл или каталог не существует."
send_stats "Не удалось скопировать файл или каталог: файл или каталог не существует"
continue
fi
read -e -p "Пожалуйста, введите целевой путь (включая новое имя файла или имя каталога):" dest_path
if [ -z "$dest_path" ]; then
echo "Ошибка: введите целевой путь."
send_stats "Не удалось скопировать файл или каталог: Путь назначения не указан"
continue
fi
# Используйте опцию -r, чтобы скопировать каталог рекурсивно
cp -r "$src_path" "$dest_path" && echo "Файл или каталог были скопированы в$dest_path" || echo "Не удалось скопировать файл или каталог"
send_stats "Копировать файлы или каталоги"
;;
25) # 传送文件至远端服务器
read -e -p "Пожалуйста, введите путь к переведению файла:" file_to_transfer
if [ ! -f "$file_to_transfer" ]; then
echo "Ошибка: файла не существует."
send_stats "Не удалось перенести файл: файл не существует"
continue
fi
read -e -p "Пожалуйста, введите IP удаленного сервера:" remote_ip
if [ -z "$remote_ip" ]; then
echo "Ошибка: введите IP удаленного сервера."
send_stats "Неудач"
continue
fi
read -e -p "Пожалуйста, введите имя пользователя удаленного сервера (root по умолчанию):" remote_user
remote_user=${remote_user:-root}
read -e -p "Пожалуйста, введите пароль удаленного сервера:" -s remote_password
echo
if [ -z "$remote_password" ]; then
echo "Ошибка: введите пароль удаленного сервера."
send_stats "Неудача переноса файла: пароль удаленного сервера не введен"
continue
fi
read -e -p "Пожалуйста, введите порт входа в систему (по умолчанию 22):" remote_port
remote_port=${remote_port:-22}
# Чистые старые записи для известных хозяев
ssh-keygen -f "/root/.ssh/known_hosts" -R "$remote_ip"
sleep 2 # 等待时间
# Передача файлов с помощью SCP
scp -P "$remote_port" -o StrictHostKeyChecking=no "$file_to_transfer" "$remote_user@$remote_ip:/home/" <<EOF
$remote_password
EOF
if [ $? -eq 0 ]; then
echo "Файл был перенесен в домашний каталог удаленного сервера."
send_stats "Передача файла успешно"
else
echo "Передача файла не удалась."
send_stats "Передача файла не удалась"
fi
break_end
;;
0) # 返回上一级选单
send_stats "Вернитесь в предыдущее меню меню"
break
;;
*) # 处理无效输入
echo "Неверный выбор, пожалуйста, введите"
send_stats "Неверный выбор"
;;
esac
done
}
cluster_python3() {
install python3 python3-paramiko
cd ~/cluster/
curl -sS -O ${gh_proxy}raw.githubusercontent.com/kejilion/python-for-vps/main/cluster/$py_task
python3 ~/cluster/$py_task
}
run_commands_on_servers() {
install sshpass
local SERVERS_FILE="$HOME/cluster/servers.py"
local SERVERS=$(grep -oP '{"name": "\K[^"]+|"hostname": "\K[^"]+|"port": \K[^,]+|"username": "\K[^"]+|"password": "\K[^"]+' "$SERVERS_FILE")
# Преобразовать извлеченную информацию в массив
IFS=$'\n' read -r -d '' -a SERVER_ARRAY <<< "$SERVERS"
# Итерация через сервер и выполнить команды
for ((i=0; i<${#SERVER_ARRAY[@]}; i+=5)); do
local name=${SERVER_ARRAY[i]}
local hostname=${SERVER_ARRAY[i+1]}
local port=${SERVER_ARRAY[i+2]}
local username=${SERVER_ARRAY[i+3]}
local password=${SERVER_ARRAY[i+4]}
echo
echo -e "${gl_huang}Подключиться к$name ($hostname)...${gl_bai}"
# sshpass -p "$password" ssh -o StrictHostKeyChecking=no "$username@$hostname" -p "$port" "$1"
sshpass -p "$password" ssh -t -o StrictHostKeyChecking=no "$username@$hostname" -p "$port" "$1"
done
echo
break_end
}
linux_cluster() {
mkdir cluster
if [ ! -f ~/cluster/servers.py ]; then
cat > ~/cluster/servers.py << EOF
servers = [
]
EOF
fi
while true; do
clear
send_stats "Центр управления кластером"
echo "Управление кластером сервера"
cat ~/cluster/servers.py
echo
echo -e "${gl_kjlan}------------------------${gl_bai}"
echo -e "${gl_kjlan}Управление списком серверов${gl_bai}"
echo -e "${gl_kjlan}1. ${gl_bai}Добавить сервер${gl_kjlan}2. ${gl_bai}Удалить сервер${gl_kjlan}3. ${gl_bai}Отредактируйте сервер"
echo -e "${gl_kjlan}4. ${gl_bai}Резервный кластер${gl_kjlan}5. ${gl_bai}Восстановите кластер"
echo -e "${gl_kjlan}------------------------${gl_bai}"
echo -e "${gl_kjlan}Выполнять задачи партиями${gl_bai}"
echo -e "${gl_kjlan}11. ${gl_bai}Установите сценарий Tech Lion${gl_kjlan}12. ${gl_bai}Обновите систему${gl_kjlan}13. ${gl_bai}Очистить систему"
echo -e "${gl_kjlan}14. ${gl_bai}Установите Docker${gl_kjlan}15. ${gl_bai}Установите BBR3${gl_kjlan}16. ${gl_bai}Настройка 1G виртуальная память"
echo -e "${gl_kjlan}17. ${gl_bai}Установите часовой пояс в Шанхай${gl_kjlan}18. ${gl_bai}Откройте все порты${gl_kjlan}51. ${gl_bai}Пользовательские команды"
echo -e "${gl_kjlan}------------------------${gl_bai}"
echo -e "${gl_kjlan}0. ${gl_bai}Вернуться в главное меню"
echo -e "${gl_kjlan}------------------------${gl_bai}"
read -e -p "Пожалуйста, введите свой выбор:" sub_choice
case $sub_choice in
1)
send_stats "Добавить сервер кластера"
read -e -p "Имя сервера:" server_name
read -e -p "Сервер IP:" server_ip
read -e -p "Серверный порт (22):" server_port
local server_port=${server_port:-22}
read -e -p "Имя пользователя сервера (root):" server_username
local server_username=${server_username:-root}
read -e -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)
send_stats "Удалить сервер кластера"
read -e -p "Пожалуйста, введите ключевые слова, необходимые для удаления:" rmserver
sed -i "/$rmserver/d" ~/cluster/servers.py
;;
3)
send_stats "Отредактируйте сервер Cluster"
install nano
nano ~/cluster/servers.py
;;
4)
clear
send_stats "Резервный кластер"
echo -e "Пожалуйста${gl_huang}/root/cluster/servers.py${gl_bai}Загрузите файл и заполните резервную копию!"
break_end
;;
5)
clear
send_stats "Восстановите кластер"
echo "Пожалуйста, загрузите свой Server.py и нажмите любую клавишу, чтобы начать загрузку!"
echo -e "Пожалуйста, загрузите свой${gl_huang}servers.py${gl_bai}Файл в${gl_huang}/root/cluster/${gl_bai}Завершите восстановление!"
break_end
;;
11)
local py_task="install_kejilion.py"
cluster_python3
;;
12)
run_commands_on_servers "k update"
;;
13)
run_commands_on_servers "k clean"
;;
14)
run_commands_on_servers "k docker install"
;;
15)
run_commands_on_servers "k bbr3"
;;
16)
run_commands_on_servers "k swap 1024"
;;
17)
run_commands_on_servers "k time Asia/Shanghai"
;;
18)
run_commands_on_servers "k iptables_open"
;;
51)
send_stats "Настроить выполнение команд"
read -e -p "Пожалуйста, введите команду PACTARE выполнение:" mingling
run_commands_on_servers "${mingling}"
;;
*)
kejilion
;;
esac
done
}
kejilion_Affiliates() {
clear
send_stats "Рекламная колонка"
echo "Рекламная колонка"
echo "------------------------"
echo "Он предоставит пользователям более простой и элегантный опыт продвижения и покупки!"
echo ""
echo -e "Сервер предложения"
echo "------------------------"
echo -e "${gl_lan}Leica Cloud Гонконг CN2 GIA Южная Корея Двойной провайдер США CN2 GIA Скидки${gl_bai}"
echo -e "${gl_bai}Веб -сайт: https://www.lcayun.com/aff/zexuqbim${gl_bai}"
echo "------------------------"
echo -e "${gl_lan}Racknerd 10,99 долл. США в год United States 1 Core 1G Memory 20G жесткий диск 1T трафик в месяц${gl_bai}"
echo -e "${gl_bai}Веб -сайт: https://my.racknerd.com/aff.php?aff=5501&pid=879${gl_bai}"
echo "------------------------"
echo -e "${gl_zi}Hostinger 52,7 доллара в год США 1 Core 4G Memory 50G жесткий диск 4T трафик в месяц${gl_bai}"
echo -e "${gl_bai}Веб-сайт: https://cart.hostinger.com/pay/d83c51e9-0c28-47a6-8414-b8ab010ef94f?_ga=ga1.3.942352702.1711283207${gl_bai}"
echo "------------------------"
echo -e "${gl_huang}Brickworker, 49 долларов США за квартал, США CN2GIA, Япония SoftBank, 2 ядра, 1 г памяти, 20 г жесткого диска, 1T трафик в месяц${gl_bai}"
echo -e "${gl_bai}Веб -сайт: https://bandwagonhost.com/aff.php?aff=69004&pid=87${gl_bai}"
echo "------------------------"
echo -e "${gl_lan}DMIMN 28 долл. США в квартал US CN2GIA 1 CORE 2G MEMOMER 20G Жесткий диск 800 г трафика в месяц${gl_bai}"
echo -e "${gl_bai}Веб -сайт: https://www.dmit.io/aff.php?aff=4966&pid=100${gl_bai}"
echo "------------------------"
echo -e "${gl_zi}V.ps $ 6,9 в месяц Tokyo Softbank 2 Core 1G память 20 г жесткого диска 1T трафик в месяц${gl_bai}"
echo -e "${gl_bai}Веб-сайт: https://vps.hosting/cart/tokyo-cloud-kvm-vps/?id=148&?affid=1355&?affid=1355${gl_bai}"
echo "------------------------"
echo -e "${gl_kjlan}Более популярные предложения VPS${gl_bai}"
echo -e "${gl_bai}Веб -сайт: https://kejilion.pro/topvps/${gl_bai}"
echo "------------------------"
echo ""
echo -e "Доменное имя скидка"
echo "------------------------"
echo -e "${gl_lan}Gname 8,8 доллара первого года доменное имя COM 6.68 доллары первого года доменное имя CC${gl_bai}"
echo -e "${gl_bai}Веб -сайт: https://www.gname.com/register?tt=86836&ttcode=kejilion86836&ttbj=sh${gl_bai}"
echo "------------------------"
echo ""
echo -e "Технологический лев окружает"
echo "------------------------"
echo -e "${gl_kjlan}B Станция:${gl_bai}https://b23.tv/2mqnQyh ${gl_kjlan}Масляная труба:${gl_bai}https://www.youtube.com/@kejilion${gl_bai}"
echo -e "${gl_kjlan}Официальный веб -сайт:${gl_bai}https://kejilion.pro/ ${gl_kjlan}Навигация:${gl_bai}https://dh.kejilion.pro/${gl_bai}"
echo -e "${gl_kjlan}Блог:${gl_bai}https://blog.kejilion.pro/ ${gl_kjlan}Центр программного обеспечения:${gl_bai}https://app.kejilion.pro/${gl_bai}"
echo "------------------------"
echo ""
}
kejilion_update() {
send_stats "Обновление скрипта"
cd ~
while true; do
clear
echo "Обновление журнала"
echo "------------------------"
echo "Все журналы:${gh_proxy}raw.githubusercontent.com/kejilion/sh/main/kejilion_sh_log.txt"
echo "------------------------"
curl -s ${gh_proxy}raw.githubusercontent.com/kejilion/sh/main/kejilion_sh_log.txt | tail -n 30
local sh_v_new=$(curl -s ${gh_proxy}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 "${gl_lv}Вы уже последняя версия!${gl_huang}v$sh_v${gl_bai}"
send_stats "Сценарий обновлен и обновление не требуется"
else
echo "Откройте для себя новую версию!"
echo -e "Текущая версия V.$sh_vПоследняя версия${gl_huang}v$sh_v_new${gl_bai}"
fi
local cron_job="kejilion.sh"
local existing_cron=$(crontab -l 2>/dev/null | grep -F "$cron_job")
if [ -n "$existing_cron" ]; then
echo "------------------------"
echo -e "${gl_lv}Автоматическое обновление включено, и скрипт будет автоматически обновляться в 2 часа ночи каждый день!${gl_bai}"
fi
echo "------------------------"
echo "1. Обновление сейчас 2. Включите автоматическое обновление 3. Выключите автоматическое обновление"
echo "------------------------"
echo "0. Вернитесь в главное меню"
echo "------------------------"
read -e -p "Пожалуйста, введите свой выбор:" choice
case "$choice" in
1)
clear
local country=$(curl -s ipinfo.io/country)
if [ "$country" = "CN" ]; then
curl -sS -O ${gh_proxy}raw.githubusercontent.com/kejilion/sh/main/cn/kejilion.sh && chmod +x kejilion.sh
else
curl -sS -O ${gh_proxy}raw.githubusercontent.com/kejilion/sh/main/kejilion.sh && chmod +x kejilion.sh
fi
canshu_v6
CheckFirstRun_true
yinsiyuanquan2
cp -f ~/kejilion.sh /usr/local/bin/k > /dev/null 2>&1
echo -e "${gl_lv}Сценарий был обновлен до последней версии!${gl_huang}v$sh_v_new${gl_bai}"
send_stats "Сценарий обновлен$sh_v_new"
break_end
~/kejilion.sh
exit
;;
2)
clear
local country=$(curl -s ipinfo.io/country)
local ipv6_address=$(curl -s --max-time 1 ipv6.ip.sb)
if [ "$country" = "CN" ]; then
SH_Update_task="curl -sS -O https://gh.kejilion.pro/raw.githubusercontent.com/kejilion/sh/main/kejilion.sh && chmod +x kejilion.sh && sed -i 's/canshu=\"default\"/canshu=\"CN\"/g' ./kejilion.sh"
elif [ -n "$ipv6_address" ]; then
SH_Update_task="curl -sS -O https://gh.kejilion.pro/raw.githubusercontent.com/kejilion/sh/main/kejilion.sh && chmod +x kejilion.sh && sed -i 's/canshu=\"default\"/canshu=\"V6\"/g' ./kejilion.sh"
else
SH_Update_task="curl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/kejilion.sh && chmod +x kejilion.sh"
fi
check_crontab_installed
(crontab -l | grep -v "kejilion.sh") | crontab -
# (crontab -l 2>/dev/null; echo "0 2 * * * bash -c \"$SH_Update_task\"") | crontab -
(crontab -l 2>/dev/null; echo "$(shuf -i 0-59 -n 1) 2 * * * bash -c \"$SH_Update_task\"") | crontab -
echo -e "${gl_lv}Автоматическое обновление включено, и скрипт будет автоматически обновляться в 2 часа ночи каждый день!${gl_bai}"
send_stats "Включите автоматическое обновление скрипта"
break_end
;;
3)
clear
(crontab -l | grep -v "kejilion.sh") | crontab -
echo -e "${gl_lv}Автоматическое обновление закрыто${gl_bai}"
send_stats "Закрыть автоматическое обновление сценария"
break_end
;;
*)
kejilion_sh
;;
esac
done
}
kejilion_sh() {
while true; do
clear
echo -e "${gl_kjlan}"
echo "╦╔═╔═╗ ╦╦╦ ╦╔═╗╔╗╔ ╔═╗╦ ╦"
echo "╠╩╗║╣ ║║║ ║║ ║║║║ ╚═╗╠═╣"
echo "╩ ╩╚═╝╚╝╩╩═╝╩╚═╝╝╚╝o╚═╝╩ ╩"
echo -e "Technology Lion Script Toolbox V$sh_v"
echo -e "Ввод командной строки${gl_huang}k${gl_kjlan}Быстро запустить сценарии${gl_bai}"
echo -e "${gl_kjlan}------------------------${gl_bai}"
echo -e "${gl_kjlan}1. ${gl_bai}Информационный запрос системы"
echo -e "${gl_kjlan}2. ${gl_bai}Обновление системы"
echo -e "${gl_kjlan}3. ${gl_bai}Очистка системы"
echo -e "${gl_kjlan}4. ${gl_bai}Основные инструменты"
echo -e "${gl_kjlan}5. ${gl_bai}Управление BBR"
echo -e "${gl_kjlan}6. ${gl_bai}Docker Management"
echo -e "${gl_kjlan}7. ${gl_bai}Управление деформацией"
echo -e "${gl_kjlan}8. ${gl_bai}Коллекция тестовых скриптов"
echo -e "${gl_kjlan}9. ${gl_bai}Коллекция сценариев Oracle Cloud"
echo -e "${gl_huang}10. ${gl_bai}LDNMP Сайт Построение"
echo -e "${gl_kjlan}11. ${gl_bai}Рынок приложений"
echo -e "${gl_kjlan}12. ${gl_bai}Мое рабочее пространство"
echo -e "${gl_kjlan}13. ${gl_bai}Системные инструменты"
echo -e "${gl_kjlan}14. ${gl_bai}Управление кластером сервера"
echo -e "${gl_kjlan}15. ${gl_bai}Рекламная колонка"
echo -e "${gl_kjlan}------------------------${gl_bai}"
echo -e "${gl_kjlan}p. ${gl_bai}Сценарий открытия сервера Phantom Beast Palu"
echo -e "${gl_kjlan}------------------------${gl_bai}"
echo -e "${gl_kjlan}00. ${gl_bai}Обновление скрипта"
echo -e "${gl_kjlan}------------------------${gl_bai}"
echo -e "${gl_kjlan}0. ${gl_bai}Выход сценария"
echo -e "${gl_kjlan}------------------------${gl_bai}"
read -e -p "Пожалуйста, введите свой выбор:" choice
case $choice in
1) linux_ps ;;
2) clear ; send_stats "Обновление системы" ; linux_update ;;
3) clear ; send_stats "Очистка системы" ; linux_clean ;;
4) linux_tools ;;
5) linux_bbr ;;
6) linux_docker ;;
7) clear ; send_stats "Управление деформацией" ; install wget
wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh ; bash menu.sh [option] [lisence/url/token]
;;
8) linux_test ;;
9) linux_Oracle ;;
10) linux_ldnmp ;;
11) linux_panel ;;
12) linux_work ;;
13) linux_Settings ;;
14) linux_cluster ;;
15) kejilion_Affiliates ;;
p) send_stats "Сценарий открытия сервера Phantom Beast Palu" ; cd ~
curl -sS -O ${gh_proxy}raw.githubusercontent.com/kejilion/sh/main/palworld.sh ; chmod +x palworld.sh ; ./palworld.sh
exit
;;
00) kejilion_update ;;
0) clear ; exit ;;
*) echo "Неверный ввод!" ;;
esac
break_end
done
}
k_info() {
send_stats "k Справочный вариант использования команды"
echo "-------------------"
echo "Введение видео: https://www.bilibili.com/video/bv1ib421e7it?t=0.1"
echo "Ниже приведен пример использования ссылки на команду:"
echo "Начало скрипт k"
echo "Установить программный пакет k Установить Nano Wget | k Добавить нано wget | k Установить Nano Wget"
echo "Удалить пакет k Удалить Nano Wget | K Del Nano Wget | k Удалить Nano Wget | k Удалить Nano Wget"
echo "Обновление системы k Обновление | k Обновление"
echo "Чистая система мусор k чистый | k Чистый"
echo "Переустановить системную панель K DD | k Переустановка"
echo "BBR3 Панель управления K BBR3 | K BBRV3"
echo "Панель настройки ядра K NHYH | K Оптимизация ядра"
echo "Установить виртуальную память k Swap 2048"
echo "Установить виртуальный часовой пояс K Time Asia/Shanghai | k Tome Rota Asia/Shanghai"
echo "Система переработка мусорного мусора K HSZ | К утилизация корзины"
echo "Функция резервного копирования системы K резервное копирование | k bf | K резервная копия"
echo "SSH Удаленное соединение инструмент K SSH | k Удаленное соединение"
echo "rsync удаленной синхронизационной инструмент k rsync | K Удаленная синхронизация"
echo "Инструмент управления жесткими дисками k диск | k Управление жестким диском"
echo "Интранет проникновение (сторона сервера) k FRP"
echo "Интранет проникновение (клиент) K FRPC"
echo "Программное обеспечение Start K Start SSHD | k Start SSHD"
echo "Программное обеспечение Stop K Stop SSHD | k Stop SSHD"
echo "Программное обеспечение перезапустить K перезапустить SSHD | K перезапустить SSHD"
echo "Статус программного обеспечения Просмотр k Статус SSHD | k Статус SSHD"
echo "Программное обеспечение Boot K Enable Docker | K AutoStart Docke | K стартап Docker"
echo "Доменное имя сертификат приложение k ssl"
echo "Сертификат доменного имени Сертификат Запрос k SSL PS"
echo "Установка среды Docker K Docker Установка | K Docker Установка"
echo "Docker Container Management K Docker PS | K Docker Container"
echo "Docker Image Management K Docker IMG | K Docker Image"
echo "LDNMP Управление сайтами K Интернет"
echo "Очистка кэша LDNMP K веб -кэш"
echo "Установите WordPress K WP | K WordPress | K WP XXX.com"
echo "Установите обратный прокси k fd | k rp | k антигенерация | k fd xxx.com"
echo "Установите балансировку нагрузки K LoadBalance | K Балансировка нагрузки"
echo "Панель брандмауэра k fhq | k брандмауэр"
echo "Открытый порт K DKDK 8080 | K Open Port 8080"
echo "Закрыть порт K GBDK 7800 | K Close Port 7800"
echo "Выпустить ip k fxip 127.0.0.0/8 | k Выпуск IP 127.0.0.0/8"
echo "Block IP K Zzip 177.5.25.36 | K Block IP 177.5.25.36"
}
if [ "$#" -eq 0 ]; then
# Если параметров нет, запустите интерактивную логику
kejilion_sh
else
# Если есть параметры, выполните соответствующую функцию
case $1 in
install|add|安装)
shift
send_stats "Установить программное обеспечение"
install "$@"
;;
remove|del|uninstall|卸载)
shift
send_stats "Удалить программное обеспечение"
remove "$@"
;;
update|更新)
linux_update
;;
clean|清理)
linux_clean
;;
dd|重装)
dd_xitong
;;
bbr3|bbrv3)
bbrv3
;;
nhyh|内核优化)
Kernel_optimize
;;
trash|hsz|回收站)
linux_trash
;;
backup|bf|备份)
linux_backup
;;
ssh|远程连接)
ssh_manager
;;
rsync|远程同步)
rsync_manager
;;
rsync_run)
shift
send_stats "Время синхронизация RSYNC"
run_task "$@"
;;
disk|硬盘管理)
disk_manager
;;
wp|wordpress)
shift
ldnmp_wp "$@"
;;
fd|rp|反代)
shift
ldnmp_Proxy "$@"
;;
loadbalance|负载均衡)
ldnmp_Proxy_backend
;;
swap)
shift
send_stats "Быстро настроить виртуальную память"
add_swap "$@"
;;
time|时区)
shift
send_stats "Быстро установить часовой пояс"
set_timedate "$@"
;;
iptables_open)
iptables_open
;;
frps)
frps_panel
;;
frpc)
frpc_panel
;;
打开端口|dkdk)
shift
open_port "$@"
;;
关闭端口|gbdk)
shift
close_port "$@"
;;
放行IP|fxip)
shift
allow_ip "$@"
;;
阻止IP|zzip)
shift
block_ip "$@"
;;
防火墙|fhq)
iptables_panel
;;
status|状态)
shift
send_stats "Просмотр статуса программного обеспечения"
status "$@"
;;
start|启动)
shift
send_stats "Запуск программного обеспечения"
start "$@"
;;
stop|停止)
shift
send_stats "Программное обеспечение пауза"
stop "$@"
;;
restart|重启)
shift
send_stats "Перезапуск программного обеспечения"
restart "$@"
;;
enable|autostart|开机启动)
shift
send_stats "Программное обеспечение сапоги"
enable "$@"
;;
ssl)
shift
if [ "$1" = "ps" ]; then
send_stats "Проверьте статус сертификата"
ssl_ps
elif [ -z "$1" ]; then
add_ssl
send_stats "Быстро подать заявку на сертификат"
elif [ -n "$1" ]; then
add_ssl "$1"
send_stats "Быстро подать заявку на сертификат"
else
k_info
fi
;;
docker)
shift
case $1 in
install|安装)
send_stats "Быстро установите Docker"
install_docker
;;
ps|容器)
send_stats "Быстрое управление контейнерами"
docker_ps
;;
img|镜像)
send_stats "Управление быстрым зеркалом"
docker_image
;;
*)
k_info
;;
esac
;;
web)
shift
if [ "$1" = "cache" ]; then
web_cache
elif [ -z "$1" ]; then
ldnmp_web_status
else
k_info
fi
;;
*)
k_info
;;
esac
fi