Решаем проблему «плодящихся» папок 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 - для борьбы с мусором от гостевых сеансов
И дальше я предполагаю ещё немного пополнить эту коллекцию.