Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 97031d15f2 | |||
| f41b83dff0 | |||
| d135b81c61 | |||
| 8c9b451437 | |||
| f48effabb2 | |||
| 3dd558c0f9 | |||
| 3bcb4ffbb7 | |||
| e5dfc19f55 | |||
| e565b73e8b | |||
| c11638b178 | |||
| 65f46ad74d | |||
| ca36be6812 | |||
| a257391a97 | |||
| 03ce460a4e | |||
| ca0c66687a | |||
| 968f377e41 | |||
| 959afaddcf | |||
| c67a2fe0e1 | |||
| 2f1fa03509 | |||
| 5d3d59e1b2 |
124
Readme.md
Normal file
124
Readme.md
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
🚀 Server Ultimate Setup — Универсальный серверный комбайн
|
||||||
|
|
||||||
|
Единственный скрипт для полной автоматизации настройки любого Linux сервера!
|
||||||
|
Ubuntu - Debian - AlmaLinux - Rocky - CentOS - Fedora
|
||||||
|
|
||||||
|
✨ Что делает скрипт (15+ функций)
|
||||||
|
Категория Функция Описание
|
||||||
|
🔧 База Часовой пояс + пакеты mc, htop, gdu, curl, git, net-tools
|
||||||
|
👤 Пользователи Создание + SSH + sudo Только ключ / пароль+ключ, sudo NOPASSWD
|
||||||
|
🔒 SSH Hardening Отключение root/паролей, только ключи
|
||||||
|
📊 Аудит auditd + ротация 400MB логов, sudo/ssh/passwd мониторинг
|
||||||
|
🔄 Обновления Unattended Upgrades Ежедневные security updates
|
||||||
|
🐳 Docker + Compose Plugin Официальная установка
|
||||||
|
🌐 VPN WireGuard + OpenVPN Официальные скрипты (wg-quick, Angristan)
|
||||||
|
🛡️ Безопасность Fail2Ban Защита SSH от брутфорса
|
||||||
|
📈 Мониторинг glances + htop Реал-тайм статистика
|
||||||
|
|
||||||
|
🎯 Поддерживаемые ОС
|
||||||
|
✅ Debian-based ✅ RHEL-based
|
||||||
|
Ubuntu 20.04/22.04/24.04 AlmaLinux 8/9
|
||||||
|
Debian 11/12 Rocky Linux 8/9
|
||||||
|
CentOS Stream 8/9
|
||||||
|
Fedora 38+
|
||||||
|
|
||||||
|
🚀 Быстрый старт (30 секунд)
|
||||||
|
```bash
|
||||||
|
|
||||||
|
# 1. Скачать
|
||||||
|
curl -fsSL http://10.0.1.48:3010/smolkik_adm/scripts/src/branch/main/ib.sh -o ib.sh
|
||||||
|
|
||||||
|
# 2. Права
|
||||||
|
chmod +x ib.sh
|
||||||
|
|
||||||
|
# 3. Запуск
|
||||||
|
sudo ./ib.sh
|
||||||
|
````
|
||||||
|
📋 Интерактивное меню
|
||||||
|
|
||||||
|
```text
|
||||||
|
🚀 SERVER ULTIMATE v1.2.1 (ubuntu 24.04) 🚀
|
||||||
|
==============================================
|
||||||
|
1) 📛 Hostname 2) 🌍 Часовой пояс + база
|
||||||
|
3) 👤 Пользователь 4) 🔒 SSH безопасность
|
||||||
|
5) 📊 Аудит + ротация логов 6) 🐳 Docker + Compose
|
||||||
|
7) 🌐 WireGuard 8) 🔐 OpenVPN
|
||||||
|
9) 📈 Мониторинг 10) 🛡️ Fail2Ban
|
||||||
|
11) 🧹 Очистка 12) 🔄 Автообновления
|
||||||
|
S) 📊 Статус сервисов 0) ❌ Выход
|
||||||
|
````
|
||||||
|
|
||||||
|
🔐 Безопасность (НЕ закроет вас снаружи!)
|
||||||
|
```text
|
||||||
|
⚠️ ВНИМАНИЕ: Только root в системе!
|
||||||
|
✅ Сначала пункт 3 → Создать пользователя
|
||||||
|
````
|
||||||
|
Бэкап SSH перед изменениями (sshd_config.bak.20260112_2017)
|
||||||
|
|
||||||
|
Тест конфига sshd -t перед рестартом
|
||||||
|
|
||||||
|
Автовосстановление при ошибках
|
||||||
|
|
||||||
|
Проверка пользователей перед hardening
|
||||||
|
|
||||||
|
🛡️ Что устанавливается
|
||||||
|
1. Базовые утилиты
|
||||||
|
|
||||||
|
```text
|
||||||
|
mc htop zip wget curl git net-tools gnupg2 unzip gdu
|
||||||
|
```
|
||||||
|
2. Безопасность
|
||||||
|
```text- SSH: только ключи, no root
|
||||||
|
- auditd: 400MB ротация логов
|
||||||
|
- Fail2Ban: защита SSH
|
||||||
|
- Unattended-Upgrades: ежедневные security updates
|
||||||
|
```
|
||||||
|
3. DevOps
|
||||||
|
```text
|
||||||
|
Docker + docker compose v2
|
||||||
|
WireGuard (wg-quick)
|
||||||
|
OpenVPN (Angristan script)
|
||||||
|
```
|
||||||
|
```text
|
||||||
|
📊 СТАТУС СИСТЕМЫ
|
||||||
|
==============================================
|
||||||
|
🔄 Unattended: active 🛡️ Fail2Ban: active
|
||||||
|
🔒 SSH: active 📊 Auditd: active
|
||||||
|
🐳 Docker: active 👥 Пользователей: 2
|
||||||
|
📅 Время: Mon Jan 12 20:17:23 UTC 2026
|
||||||
|
```
|
||||||
|
🎨 Кросс-платформенность
|
||||||
|
Команда Ubuntu AlmaLinux
|
||||||
|
Пакеты apt dnf
|
||||||
|
SSH ssh sshd
|
||||||
|
Docker get.docker.com docker-ce.repo
|
||||||
|
Аудит auditd audit
|
||||||
|
|
||||||
|
📚 Полная документация
|
||||||
|
Создание пользователя
|
||||||
|
|
||||||
|
```text
|
||||||
|
1) Только SSH ключ (рекомендуется)
|
||||||
|
2) Пароль + SSH ключ
|
||||||
|
→ sudo NOPASSWD: ALL
|
||||||
|
```
|
||||||
|
Логи аудита
|
||||||
|
```text
|
||||||
|
ausearch -k ssh_config # Изменения SSH
|
||||||
|
ausearch -k sudoers # sudo команды
|
||||||
|
ausearch -k identity # Изменения /etc/passwd
|
||||||
|
````
|
||||||
|
Unattended Upgrades
|
||||||
|
|
||||||
|
```text
|
||||||
|
📅 Ежедневно в 6:00 UTC
|
||||||
|
🔒 Только security + updates
|
||||||
|
📋 /var/log/unattended-upgrades/
|
||||||
|
````
|
||||||
|
🐛 Частые проблемы и решения
|
||||||
|
```text
|
||||||
|
Проблема Решение
|
||||||
|
❌ "Кракозябры" Используйте printf вместо echo -e
|
||||||
|
❌ SSH недоступен Пункт 4 только после пункта 3!
|
||||||
|
❌ Docker не стартует systemctl status docker
|
||||||
|
````
|
||||||
7
bit/server-rollback
Normal file
7
bit/server-rollback
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
BASE="/var/backups/server-ultimate"
|
||||||
|
select D in "$BASE"/*; do
|
||||||
|
cp -av "$D"/* /
|
||||||
|
systemctl restart sshd smbd fail2ban
|
||||||
|
break
|
||||||
|
done
|
||||||
2
config/main.conf
Normal file
2
config/main.conf
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
BACKUP_DIR="/var/backups/server-ultimate"
|
||||||
|
LOG_FILE="/opt/server-ultimate/logs/server.log"
|
||||||
84
ib.sh
84
ib.sh
@@ -1,84 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# --- НАСТРОЙКИ ---
|
|
||||||
USERNAME=""
|
|
||||||
USER_PASSWORD=""
|
|
||||||
SSH_PUB_KEY=""
|
|
||||||
|
|
||||||
# Проверка прав root
|
|
||||||
if [ "$EUID" -ne 0 ]; then
|
|
||||||
echo "Пожалуйста, запустите скрипт от имени root (sudo)."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 1. Определение дистрибутива и имени службы SSH
|
|
||||||
if [ -f /etc/os-release ]; then
|
|
||||||
. /etc/os-release
|
|
||||||
OS=$ID
|
|
||||||
else
|
|
||||||
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$OS" in
|
|
||||||
ubuntu|debian|raspbian)
|
|
||||||
SSH_SERVICE="ssh"
|
|
||||||
;;
|
|
||||||
centos|rhel|fedora|almalinux|rocky)
|
|
||||||
SSH_SERVICE="sshd"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
SSH_SERVICE="sshd" # Значение по умолчанию
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "Определена ОС: $OS. Используемая служба SSH: $SSH_SERVICE"
|
|
||||||
|
|
||||||
# 2. Создание пользователя
|
|
||||||
if id "$USERNAME" &>/dev/null; then
|
|
||||||
echo "Пользователь $USERNAME уже существует."
|
|
||||||
else
|
|
||||||
useradd -m -s /bin/bash "$USERNAME"
|
|
||||||
echo "$USERNAME:$USER_PASSWORD" | chpasswd
|
|
||||||
echo "Пользователь $USERNAME создан."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 3. Настройка SSH-ключа
|
|
||||||
USER_HOME=$(eval echo "~$USERNAME")
|
|
||||||
mkdir -p "$USER_HOME/.ssh"
|
|
||||||
echo "$SSH_PUB_KEY" > "$USER_HOME/.ssh/authorized_keys"
|
|
||||||
chown -R "$USERNAME:$USERNAME" "$USER_HOME/.ssh"
|
|
||||||
chmod 700 "$USER_HOME/.ssh"
|
|
||||||
chmod 600 "$USER_HOME/.ssh/authorized_keys"
|
|
||||||
|
|
||||||
# 4. Настройка sudo NOPASSWD
|
|
||||||
SUDOERS_FILE="/etc/sudoers.d/$USERNAME"
|
|
||||||
echo "$USERNAME ALL=(ALL) NOPASSWD: ALL" > "$SUDOERS_FILE"
|
|
||||||
chmod 440 "$SUDOERS_FILE"
|
|
||||||
|
|
||||||
# 5. Настройка sshd_config
|
|
||||||
SSHD_CONFIG="/etc/ssh/sshd_config"
|
|
||||||
[ -f "$SSHD_CONFIG" ] && cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak" # Бэкап
|
|
||||||
|
|
||||||
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' "$SSHD_CONFIG"
|
|
||||||
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' "$SSHD_CONFIG"
|
|
||||||
|
|
||||||
# 6. Универсальный перезапуск службы
|
|
||||||
restart_service() {
|
|
||||||
if command -v systemctl >/dev/null 2>&1; then
|
|
||||||
systemctl restart "$1"
|
|
||||||
elif command -v service >/dev/null 2>&1; then
|
|
||||||
service "$1" restart
|
|
||||||
else
|
|
||||||
/etc/init.d/"$1" restart
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "Проверка конфигурации SSH..."
|
|
||||||
if sshd -t; then
|
|
||||||
restart_service "$SSH_SERVICE"
|
|
||||||
echo "Настройка успешно завершена!"
|
|
||||||
else
|
|
||||||
echo "Ошибка в конфигурации SSH! Изменения не применены."
|
|
||||||
mv "${SSHD_CONFIG}.bak" "$SSHD_CONFIG"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
12
install.sh
Normal file
12
install.sh
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🔧 Установка server-ultimate"
|
||||||
|
|
||||||
|
mkdir -p /opt/server-ultimate/{lib,config,logs}
|
||||||
|
cp -r ./* /opt/server-ultimate/
|
||||||
|
|
||||||
|
chmod +x /opt/server-ultimate/server.sh
|
||||||
|
ln -sf /opt/server-ultimate/server.sh /usr/local/bin/server
|
||||||
|
|
||||||
|
echo "✅ Установлено. Запуск: server"
|
||||||
23
lib/backup.sh
Normal file
23
lib/backup.sh
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
source /opt/server-ultimate/config/main.conf
|
||||||
|
|
||||||
|
backup_create() {
|
||||||
|
local COMP="$1"; shift
|
||||||
|
local FILES="$@"
|
||||||
|
|
||||||
|
TS="$(date +%F_%H-%M-%S)"
|
||||||
|
DEST="$BACKUP_DIR/$COMP/$TS"
|
||||||
|
|
||||||
|
mkdir -p "$DEST"
|
||||||
|
for f in $FILES; do
|
||||||
|
[ -f "$f" ] && cp -a "$f" "$DEST/"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "$DEST"
|
||||||
|
}
|
||||||
|
|
||||||
|
backup_restore() {
|
||||||
|
local COMP="$1"
|
||||||
|
ls "$BACKUP_DIR/$COMP"
|
||||||
|
read -p "Snapshot: " TS
|
||||||
|
cp -av "$BACKUP_DIR/$COMP/$TS"/* /
|
||||||
|
}
|
||||||
4
lib/colors.sh
Normal file
4
lib/colors.sh
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
GREEN='\033[0;32m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m'
|
||||||
21
lib/fail2ban.sh
Normal file
21
lib/fail2ban.sh
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
setup_fail2ban() {
|
||||||
|
$PKG install -y fail2ban
|
||||||
|
CONF="/etc/fail2ban/jail.local"
|
||||||
|
SNAP=$(backup_create fail2ban "$CONF")
|
||||||
|
|
||||||
|
cat > "$CONF" <<EOF
|
||||||
|
[sshd]
|
||||||
|
enabled = true
|
||||||
|
bantime = 1d
|
||||||
|
findtime = 10m
|
||||||
|
maxretry = 3
|
||||||
|
EOF
|
||||||
|
|
||||||
|
fail2ban-client -t || {
|
||||||
|
cp "$SNAP/jail.local" "$CONF"
|
||||||
|
err "Fail2Ban rollback"
|
||||||
|
}
|
||||||
|
|
||||||
|
systemctl enable --now fail2ban
|
||||||
|
pause
|
||||||
|
}
|
||||||
21
lib/os-detect.sh
Normal file
21
lib/os-detect.sh
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
detect_os() {
|
||||||
|
. /etc/os-release
|
||||||
|
OS_ID=$ID
|
||||||
|
OS_VERSION=$VERSION_ID
|
||||||
|
|
||||||
|
case $OS_ID in
|
||||||
|
ubuntu|debian)
|
||||||
|
PKG=apt
|
||||||
|
SSHD=sshd
|
||||||
|
;;
|
||||||
|
almalinux|rocky|centos|fedora)
|
||||||
|
PKG=dnf
|
||||||
|
SSHD=sshd
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
err "Неподдерживаемая ОС"
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
|
||||||
|
log "ОС: $OS_ID $OS_VERSION"
|
||||||
|
}
|
||||||
52
lib/samba.sh
Normal file
52
lib/samba.sh
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
create_or_use_directory() {
|
||||||
|
read -p "Путь к папке: " DIR
|
||||||
|
if [ -d "$DIR" ]; then
|
||||||
|
log "Используем $DIR"
|
||||||
|
else
|
||||||
|
read -p "Создать $DIR ? (y/N): " Y
|
||||||
|
[[ "$Y" != "y" ]] && return 1
|
||||||
|
mkdir -p "$DIR"
|
||||||
|
chmod 770 "$DIR"
|
||||||
|
fi
|
||||||
|
echo "$DIR"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_samba() {
|
||||||
|
$PKG install -y samba
|
||||||
|
CONF="/etc/samba/smb.conf"
|
||||||
|
SNAP=$(backup_create samba "$CONF")
|
||||||
|
|
||||||
|
cat > "$CONF" <<EOF
|
||||||
|
[global]
|
||||||
|
workgroup = WORKGROUP
|
||||||
|
security = user
|
||||||
|
map to guest = bad user
|
||||||
|
EOF
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
read -p "Имя шары (Enter=выход): " NAME
|
||||||
|
[ -z "$NAME" ] && break
|
||||||
|
|
||||||
|
PATH=$(create_or_use_directory) || continue
|
||||||
|
read -p "Пользователи (guest или user1,user2): " USERS
|
||||||
|
|
||||||
|
if [[ "$USERS" == "guest" ]]; then
|
||||||
|
GUEST="yes"; VALID=""
|
||||||
|
else
|
||||||
|
GUEST="no"; VALID="valid users = $USERS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat >> "$CONF" <<EOF
|
||||||
|
|
||||||
|
[$NAME]
|
||||||
|
path = $PATH
|
||||||
|
guest ok = $GUEST
|
||||||
|
writable = yes
|
||||||
|
$VALID
|
||||||
|
EOF
|
||||||
|
done
|
||||||
|
|
||||||
|
testparm || { cp "$SNAP/smb.conf" "$CONF"; }
|
||||||
|
systemctl restart smbd
|
||||||
|
pause
|
||||||
|
}
|
||||||
48
lib/ssh.sh
Normal file
48
lib/ssh.sh
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
secure_ssh() {
|
||||||
|
CONF="/etc/ssh/sshd_config"
|
||||||
|
PROFILE="/opt/server-ultimate/config/ssh-hardening.conf"
|
||||||
|
|
||||||
|
SNAP=$(backup_create ssh "$CONF")
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
read -p "Отключить вход по паролю? (y/N): " DISABLE_PASS
|
||||||
|
|
||||||
|
if [[ "$DISABLE_PASS" == "y" ]]; then
|
||||||
|
confirm_ssh_key_works || {
|
||||||
|
err "Ключ не подтверждён. Операция отменена."
|
||||||
|
pause
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Удаляем старые параметры
|
||||||
|
sed -i '/^PermitRootLogin/d
|
||||||
|
/^PasswordAuthentication/d
|
||||||
|
/^PubkeyAuthentication/d
|
||||||
|
/^MaxAuthTries/d
|
||||||
|
/^ClientAliveInterval/d
|
||||||
|
/^ClientAliveCountMax/d
|
||||||
|
/^X11Forwarding/d
|
||||||
|
/^AllowTcpForwarding/d
|
||||||
|
/^TCPKeepAlive/d
|
||||||
|
/^UseDNS/d' "$CONF"
|
||||||
|
|
||||||
|
# Применяем профиль
|
||||||
|
cat "$PROFILE" >> "$CONF"
|
||||||
|
|
||||||
|
# Пароль — по выбору
|
||||||
|
if [[ "$DISABLE_PASS" != "y" ]]; then
|
||||||
|
sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' "$CONF"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if sshd -t; then
|
||||||
|
systemctl restart sshd
|
||||||
|
log "SSH security профиль применён"
|
||||||
|
else
|
||||||
|
err "Ошибка SSH → rollback"
|
||||||
|
cp "$SNAP/sshd_config" "$CONF"
|
||||||
|
systemctl restart sshd
|
||||||
|
fi
|
||||||
|
|
||||||
|
pause
|
||||||
|
}
|
||||||
13
lib/sysctl.sh
Normal file
13
lib/sysctl.sh
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
harden_sysctl() {
|
||||||
|
CONF="/etc/sysctl.d/99-hardening.conf"
|
||||||
|
SNAP=$(backup_create sysctl "$CONF")
|
||||||
|
|
||||||
|
cat > "$CONF" <<EOF
|
||||||
|
net.ipv4.conf.all.accept_redirects = 0
|
||||||
|
kernel.kptr_restrict = 2
|
||||||
|
fs.protected_symlinks = 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sysctl --system || rm -f "$CONF"
|
||||||
|
pause
|
||||||
|
}
|
||||||
44
lib/users.sh
Normal file
44
lib/users.sh
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
create_user() {
|
||||||
|
clear
|
||||||
|
read -p "Имя пользователя: " USER
|
||||||
|
id "$USER" &>/dev/null && { err "Уже существует"; pause; return; }
|
||||||
|
|
||||||
|
echo "Способ входа:"
|
||||||
|
echo "1) 🔑 Только ключ"
|
||||||
|
echo "2) 🔐 Пароль + ключ"
|
||||||
|
echo "3) 🔐 Только пароль"
|
||||||
|
read -p "> " MODE
|
||||||
|
|
||||||
|
useradd -m -s /bin/bash "$USER"
|
||||||
|
mkdir -p /home/$USER/.ssh
|
||||||
|
chmod 700 /home/$USER/.ssh
|
||||||
|
|
||||||
|
case "$MODE" in
|
||||||
|
1)
|
||||||
|
read -p "Вставь публичный ключ: " KEY
|
||||||
|
echo "$KEY" > /home/$USER/.ssh/authorized_keys
|
||||||
|
chmod 600 /home/$USER/.ssh/authorized_keys
|
||||||
|
passwd -l "$USER"
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
passwd "$USER"
|
||||||
|
read -p "Публичный ключ (Enter чтобы пропустить): " KEY
|
||||||
|
[[ -n "$KEY" ]] && echo "$KEY" > /home/$USER/.ssh/authorized_keys
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
passwd "$USER"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
userdel -r "$USER"
|
||||||
|
err "Отмена"
|
||||||
|
pause
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
chown -R $USER:$USER /home/$USER/.ssh
|
||||||
|
usermod -aG sudo "$USER"
|
||||||
|
|
||||||
|
log "Создан пользователь $USER"
|
||||||
|
pause
|
||||||
|
}
|
||||||
20
lib/utils.sh
Normal file
20
lib/utils.sh
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
require_root() {
|
||||||
|
[[ $EUID -ne 0 ]] && { echo "❌ Запусти от root"; exit 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "[+] $1"
|
||||||
|
echo "$(date) | $1" >> "$LOG_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
echo "[!] $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
err() {
|
||||||
|
echo "[x] $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
pause() {
|
||||||
|
read -p "Нажмите Enter..."
|
||||||
|
}
|
||||||
18
menu.sh
Normal file
18
menu.sh
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
main_menu() {
|
||||||
|
while true; do
|
||||||
|
clear
|
||||||
|
echo "🛡 SERVER-ULTIMATE v2.1"
|
||||||
|
echo "1) 👤 Создать пользователя"
|
||||||
|
echo "2) 🔒 Настроить SSH"
|
||||||
|
echo "3) ♻ Rollback конфигов"
|
||||||
|
echo "0) Выход"
|
||||||
|
read -p "> " C
|
||||||
|
|
||||||
|
case "$C" in
|
||||||
|
1) create_user ;;
|
||||||
|
2) secure_ssh ;;
|
||||||
|
3) backup_restore ssh ;;
|
||||||
|
0) exit ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user