#!/bin/bash # ============================================================ # ПРОВЕРКА ЗАДАНИЕ 2 — HQ-CLI: automount NFS, chrony, домен, sudo # для группы hq (только cat/grep/id), Яндекс Браузер # ЕДИНСТВЕННЫЕ попытка записи — временный файл в NFS (см. пункт 2, # создаётся и сразу удаляется). # ============================================================ NAME="hq-cli" LOG="check_${NAME}_z2.txt" OK=0; FAIL=0; SKIP=0 ok() { echo "[OK] $1"; OK=$((OK+1)); } fail() { echo "[FAIL] $1 — $2"; FAIL=$((FAIL+1)); } skip() { echo "[ПРОПУЩЕНО] $1"; SKIP=$((SKIP+1)); } root_or_skip() { if [[ $EUID -ne 0 ]]; then skip "$1 (нужен root)"; return 1; fi; return 0; } check_var() { if [[ -z "${!2}" ]]; then skip "$1 — не задано $2"; return 1; fi; return 0; } expect_eq() { if [[ "$3" == "$2" ]]; then ok "$1"; else fail "$1" "ожидалось '$2', получено '$3'"; fi; } # ================= ПЕРЕМЕННЫЕ (заполните для проверки) ================= NFS_MOUNT="/mnt/nfs" # точка автомонтирования по заданию NFS_SERVER="" # адрес HQ-SRV (проверка записи в auto.nfs) HQ_USER_TEST="hquser1" # пользователь домена для проверки входа SUDO_CMDS="/usr/bin/cat /usr/bin/grep /usr/bin/id" # разрешённый список NTP_ADDR="" # адрес ISP (источник NTP) BROWSER_PATTERN="yandex" # ищемся через dnf list installed main () { echo "=== Проверка задания 2: HQ-CLI ===" # --- 1. Автомонтирование NFS в /mnt/nfs --- if root_or_skip "конфиг autofs"; then if grep -Eq "[[:space:]]*/mnt[[:space:]]+" /etc/auto.master 2>/dev/null; then ok "auto.master: карта для /mnt присутствует" else fail "auto.master" "нет записи для /mnt"; fi if grep -Eq "^[[:space:]]*[a-zA-Z0-9_-]+[[:space:]]+-rw[[:space:]]+.*$NFS_SERVER" /etc/auto.nfs 2>/dev/null; then echo "[ИНФО] $(cat /etc/auto.nfs 2>/dev/null)" SKIP=$((SKIP+1)) fi fi # смонтированную директорию NFS проверяем её содержимым # (cat вызывает automount триггер — чистое чтение) # доступный каталог NFS проверяем чтением (оно же триггерит automount) if [[ -d "$NFS_MOUNT" ]]; then ok "каталог $NFS_MOUNT доступен (autofs активен)" else fail "каталог $NFS_MOUNT" "не открылся (autofs/сервер недоступен)"; fi # --- 2. ЕДИНСТВЕННЫЙ временный файл в NFS (создаём и сразу удаляем) --- if [[ -d "$NFS_MOUNT" && -w "$NFS_MOUNT" ]]; then printf 'tmp %s\n' "$(date +%s)" > "$NFS_MOUNT/.delete-nfs-write-test" if [[ -f "$NFS_MOUNT/.delete-nfs-write-test" ]]; then ok "запись в NFS работает (временный файл создан)" fi rm -f "$NFS_MOUNT/.delete-nfs-write-test" && ok "временный файл удалён" else skip "запись в NFS (не смонтирован $NFS_MOUNT)" fi # --- 3. chrony-клиент: источник = ISP --- check_var "источник NTP" NTP_ADDR && if command -v chronyc &>/dev/null; then if chronyc sources 2>/dev/null | grep -qF "$NTP_ADDR"; then ok "NTP источник = $NTP_ADDR" else fail "NTP источник" "нет $NTP_ADDR в chronyc sources"; fi else skip "NTP источник — chronyc не найден"; fi # --- 4. Пользователь домена доступен (getent) --- if getent passwd "$HQ_USER_TEST" &>/dev/null; then ok "пользователь домена $HQ_USER_TEST доступен на машине (getent)" else fail "пользователь домена $HQ_USER_TEST" "getent не вернул запись (ввод в домен вручную — MANUAL.md)"; fi # --- 5. Sudo для группы hq (только cat/grep/id) --- if root_or_skip "sudo -l -U $HQ_USER_TEST"; then SUDO_OUT=$(sudo -l -U "$HQ_USER_TEST" 2>/dev/null) CMDS_OK=1 for c in $SUDO_CMDS; do grep -qw "$(basename "$c")" <<<"$SUDO_OUT" || CMDS_OK=0 done if [[ $CMDS_OK -eq 1 ]] && ! grep -q "NOPASSWD: ALL" <<<"$SUDO_OUT"; then ok "sudo для $HQ_USER_TEST: только $(echo "$SUDO_CMDS" | tr ' ' ',')" else fail "sudo для $HQ_USER_TEST" "список не совпал (есть ALL или нет всех команд): $(echo "$SUDO_OUT" | grep NOPASSWD)"; fi fi # --- 6. Яндекс Браузер --- if dnf list installed 2>/dev/null | grep -qiF "$BROWSER_PATTERN"; then ok "Яндекс Браузер установлен ($(dnf list installed 2>/dev/null | grep -iF "$BROWSER_PATTERN"))" else fail "Яндекс Браузер" "пакет не найден в dnf list installed"; fi echo "" echo "=== Проверить вручную ===" echo " — запуск Яндекс Браузера с рабочего стола (если GUI есть)" echo " — реальные входы доменных пользователей в систему (экран входа/GUI или su -)" echo "" echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ===" [[ $FAIL -eq 0 ]] } main 2>&1 | tee "$LOG" STATUS=${PIPESTATUS[0]} echo "Лог сохранён: $LOG" exit $STATUS