Время уйти

PAM может контролировать вход в систему, но не может прерывать текущий сеанс; однако это легко сделать с помощью Cron. Следующий скрипт дает пользователю KDE (будет вам и версия Gnome) пять минут, чтобы завершить сеанс или выключить компьютер, или это делается принудительно:
#!/bin/sh
THEUSER=”username”
[[ -z “$(w -h $THEUSER)” ]] && exit
DISPLAY=”:0” kdialog --msgbox “Пора спать^^Выключение через 5 минут.” & sleep 5m source /home/$THEUSER/.dbus/session-bus/$(cat /var/lib/dbus/ machine-id)-0 qdbus --address $DBUS_SESSION_BUS_ADDRESS org.kde. ksmserver /KSMServer logout 0 3 3 Скрипт запускается при помощи w (да, это команда), проверяет наличие пользователя в системе, затем выводит на экран предупреждение, ожидает пять минут и затем отправляет широковещательное сообщение службам KDE D-BUS. Файл исходного кода используется для распознавания файла, содержащего адрес пользовательского сеанса D-BUS и определения указанных в нем переменных. Необходимо, чтобы он запустился за пять минут до отключения, и это задача Cron. Запускаться он должен от имени того же пользователя, поэтому добавим в crontab sudo crontab -e -u username
Вот как запланировать выход в 9 вечера с воскресенья до четверга и с 10 по выходным:
55 20 * * 0-4 /path/to/script 55 21 * * 5,6 /path/to/script
Нам не надо, чтобы пользователь мог изменить эти данные в Cron, поэтому добавим его имя в /etc/cron.deny и убедимся, что этот скрипт не сможет быть им перезаписан или не находится в директории, которая может быть перезаписана (ведь если доступ к директории у вас есть, вы можете удалять из нее файлы и переименовывать их, пусть и не внося изменения внутри). Хороший вариант расположения - /usr/local/bin.
Как и обещано, представим вариант для Gnome и Unity. Команда gnome-session-quit существует в рабочем сеансе, но выход из системы должен подтверждаться самим пользователем, так что обратимся к D-BUS. Вот версия для Gnome:
#!/bin/sh
THEUSER=”username”
[[ -z “$(w -h $THEUSER)” ]] && exit
DISPLAY=”:0” zenity --info --text=”Пора спать^Выключение через 5 минут.” & sleep 5m source /home/$THEUSER/.dbus/session-bus/$(cat /var/lib/dbus/ machine-id)-0 qdbus --address $DBUS_SESSION_BUS_ADDRESS org.gnome. SessionManager /org/gnome/SessionManager org.gnome. SessionManager.RequestShutdown
Вместо Kdialog мы использовали для отображения сообщения Zenity и изменили вызов D-BUS. Если у вас другой рабочий стол, вы тоже можете использовать D-BUS, или же вам придется действовать жестко и убивать X-процесс. Можно использовать notify-send для создания всплывающего уведомления в строке состояния, каким бы окружением вы ни пользовались - хотя такие сообщения все же менее заметны, чем в виде окна: DISPLAY=”:0” notify-send
“Пора спать”
“Выключение через 5 минут”
Некоторые умельцы, узнав, что вы заблокировали их учетную запись, могут попробовать войти через вашу, чтобы обойти настройки. Вы, конечно, выбрали надежный пароль, желательно не имя того ребенка, которого вы хотите проучить; впрочем, навряд ли их это остановит. Зато это сделает модуль pam_tally2. После нескольких неудачных попыток входа он заблокирует учетную запись: либо на определенный срок, либо пока вы не решите ее разблокировать. Активируйте и настройте модуль в system-auth при помощи строки auth required pam_tally2.so deny=5 unlock_time=7200
Это заблокирует все варианты входа, кроме root, на два часа (7200 секунд) после пяти неудачных попыток. Если вы хотите, чтобы pam_tally2 контролировал и root, добавьте в настройки even_deny_root. Если время разблокирования не указано, учетная запись становится условно активной. Вы можете увидеть статус пользователя через sudo pam_tally2 --user jimmy и разблокировать его учетную запись без таймаута, а если таковой не определен, то с помощью sudo pam_tally2 --user jimmy –reset
Имейте в виду, что при такой блокировке вы не сможете войти в систему ни под своим именем, ни от имени root, но сможете через SSH, если был установлен ключ аутентификации (в этом случае процесс идет внутренне, без вмешательства PAM). Убедитесь, что этот вариант вам доступен, прежде чем установить такие ограничения. Кроме того, запароленный вход через SSH может стать дополнительной мерой подстраховки от вторжения хулиганов-скриптописцев.