Автор Тема: Убираем мусор от гостевых сеансов в Альт Образование 11  (Прочитано 88 раз)

Оффлайн gadfly7

  • Участник
  • *
  • Сообщений: 23
Решаем проблему «плодящихся» папок guest-xxx

В прошлой теме писал, что ранее настраивал ученический профиль на основе гостевых сеансов и всё было ОК. Однако, когдя я сделал так же на Альт 11 - меня ждала "засада". В папке home мигом появились сотни папок вида guest-XXXX - неудалённые профили гостевых сеансов. Оказалось, что в силу какого-то бага (ну или может фичи какой-то) на 11 версии гостевой сеанс не удаляет за собой следы, а просто бросает их. Я не помню уже, какую именно ошибку мне выдала попытка штатного удаления, помню что толку не было. А заглянув в /var/lib/AccountsService/users/ обнаружил и там сотни брошеных файлов. Из интереса проверил на Simply - там тоже такая же бяка.

Я не шибко силён в Линуксе. Мож там всего-то где-то какую строку в каком-то файле подправить, - я не знаю. Поэтому лечить буду аки хирург, живительной ампутацией. И кстати, делалось всё исключительно на Альт Образование 11 XFCE. Ни на чём другом не проверялось.

Собственно проблема вообще минимальная. Удалить файлы и папки с типичными именами и настроить что-то, что будет делать это регулярно. Однако, для уймы школьных учителей это вполне может оказаться серьёзной проблемой. Поэтому среди своих готовых решений решил предложить им скрипт-чистильщик, создающий службу для очистки "брошенных" гостевых сеансов.

Опять же буду максимально прямо "разжевывать" действия.

Важно: Это решение не лечит сам баг, но полностью убирает его последствия. Даже если ошибку когда-нибудь исправят, наша служба ничему не помешает - она просто будет подчищать то, что и так должно удаляться.

Нам потребуются

1. Флешка
2. Компьютер с Альт Образование 11, на котором включены гостевые сеансы (или просто хотим подстраховаться)

Скрипт мы создадим один раз, а запускать его можно на любом компьютере класса, да и вообще где угодно.

Шаг 1. Создаём упомянутый скрипт

На флешке создайте новый текстовый файл и назовите его guest_cleanup.sh.

Важно про окончания строк! Если вы создаёте файл в Windows (в Блокноте), потом придётся конвертировать окончания строк. Напомню об этом позже.

Откройте файл в текстовом редакторе и вставьте туда вот этот код:

#!/bin/bash
# =====================================================================
# GUEST-PURGE: Полная зачистка следов гостевых сеансов
# =====================================================================

if [ "$EUID" -ne 0 ]; then
    echo "Запустите от имени root (через su -)"
    exit 1
fi

# Загружаем конфиг задачи, если есть
HERE=$(dirname "$(readlink -f "$0")")
[ -f "$HERE/task.conf" ] && source "$HERE/task.conf"

echo "--- 1. Опционально: Управление гостевым входом ---"

# Если DISABLE_GUEST не задан в конфиге — спрашиваем
if [ -z "$DISABLE_GUEST" ]; then
    read -p "Желаете полностью отключить гостевой вход (disable guest)? [y/n]: " DISABLE_GUEST
fi

if [[ "${DISABLE_GUEST,,}" == y* ]] || [[ "${DISABLE_GUEST,,}" == д* ]]; then
    if command -v guest-account >/dev/null 2>&1; then
        guest-account disable
        echo "[OK] Гостевой вход отключен."
    else
        echo "[!] Утилита guest-account не найдена, пропускаем."
    fi
else
    echo "[i] Гостевой вход оставлен без изменений."
fi

echo "--- 2. Создание службы глубокой очистки ---"

cat <<EOF > /etc/systemd/system/guest-cleanup.service
[Unit]
Description=Comprehensive Cleanup of Stale Guest Accounts
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'for user in \$(ls /home | grep ^guest-); do \
    echo "Уборка за: \$user"; \
    /usr/sbin/guest-account remove "\$user" 2>/dev/null; \
    rm -rf "/home/\$user"; \
    rm -f "/var/lib/AccountsService/users/\$user"; \
    rm -f "/var/spool/mail/\$user"; \
    sed -i "/^\$user:/d" /etc/group 2>/dev/null; \
done'
RemainAfterExit=no

[Install]
WantedBy=multi-user.target
EOF

echo "--- 3. Активация службы ---"
systemctl daemon-reload
systemctl enable guest-cleanup.service
systemctl start guest-cleanup.service

echo "-------------------------------------------------------"
echo "ГОТОВО! Служба 'guest-cleanup' установлена."
echo "-------------------------------------------------------"

Сохраните файл.

Шаг 2. Идём на "больной" компьютер


1. Вставляем флешку.
2. Открываем терминал.
3. Переходим в root:
su -(вводим пароль администратора)

4. Переходим в папку с флешкой. Напоминаю волшебный способ перехода с помощью Tab:
   - Введите # cd /run/media/   пока не нажимаем Enter   - Нажмите Tab - подставится ваш логин
   - Нажмите Tab ещё раз - подставится имя флешки
   - А вот теперь нажмите Enter. Мы на флешке.

5. Если вы создавали скрипт в Windows, перед запуском нужно исправить окончания строк (я в прошлой статье писал про это), инаяе он не выполнится. Я делаю это с помощью dos2unix.

Если утилиты dos2unix у вас нет - ставим, она есть в репозиториях:
#apt-get update
#apt-get install dos2unix
# dos2unix guest_cleanup.sh
Или можно просто открыть скрипт в Текстовом редакторе (Mousepad), выбрать "Документ" - "Завершение строк" - "Unix (LF)" и пересохранить файл.

6. Запускаем скрипт:
# sh guest_cleanup.sh
Шаг 3. Отвечаем на вопрос скрипта
Желаете полностью отключить гостевой вход (disable guest)? [y/n]:

- В прошлой теме я показал, как реализовать фактически тот же гостевой сеанс другими средствами. Причём легко настраиваемый и распространяемый. Если исполльзовать его, то гостевой вход вам больше не нужен. Смело отвечайте y - скрипт отключит гостя полностью.

- Если по каким-то причинам вы хотите оставить возможность гостевого входа, отвечайте n. Скрипт в любом случае установит службу очистки, которая будет убирать мусор после гостей. Просто сам вход останется доступным.

- создаст службу /etc/systemd/system/guest-cleanup.service
- включит её в автозагрузку
- сразу же запустит первую очистку


Итак
- При каждой загрузке компьютера, ещё до появления экрана входа, срабатывает служба guest-cleanup.service.
- Она пробегает по всем папкам в /home, которые начинаются с guest-.
- Для каждой такой папки:
  1. Пытается удалить гостевую учётку штатными средствами (на случай, если система вдруг одумается)
  2. Удаляет саму папку из /home
  3. Удаляет файл пользователя из /var/lib/AccountsService/users/ (чтобы в меню входа не было "призраков")
  4. Удаляет возможный почтовый ящик гостя. Не знаю, насколько это нужно, просто мне подсказали, что там тоже могут оставаться "хвосты".
  5. Чистит упоминания в /etc/group

Проверяем

1. Посмотрите содержимое папки /home до перезагрузки:
Там уже не должно быть лишнего. Если там были папки guest-* - скрипт их уже удалил на этапе первичной очистки.

2. Перезагрузите компьютер:

3. После перезагрузки снова загляните в home. Вдруг это был оптический обман зрения.
Лишних папок там быть не должно. Если же кто-то зайдёт в гостевой сеанс между перезагрузками - служба подчистит их при следующем старте.

4. Проверьте статус службы:
# systemctl status guest-cleanup.serviceДолжно быть написано active (exited).

Что делать, если передумали / хотим вернуть всё взад откатить

Если вдруг понадобится отключить автоматическую очистку:

# systemctl disable guest-cleanup.serviceМожно и через Центр управления (acc) отключить.

Сам файл службы можно удалить (необязательно):

# rm /etc/systemd/system/guest-cleanup.service
# systemctl daemon-reload

Если вы отключали гостевой вход, а потом решили его вернуть- это делается командой:
# guest-account enable
И вот ещё. При использовании "чистильщика" не создавайте на компьютере пользователей с именами "guest-любое_продолжение". Удалит.

Я когда писал про набор готовых решений для учителя информатики, имел в виду вот что: Если ранее воспользовались темой про заморозку ученического профиля, то на вашей флешке теперь есть:

- archive_profile.sh и deploy.sh - для создания "замороженного" профиля ученика
- guest_cleanup.sh - для борьбы с мусором от гостевых сеансов

И дальше я предполагаю ещё немного пополнить эту коллекцию.

« Последнее редактирование: 24.03.2026 10:10:30 от gadfly7 »