Я нашел способ сделать это, это что-то вроде хака с использованием сценариев оболочки, cron и sudo, но, похоже, это работает довольно хорошо.
Сначала создайте сценарий оболочки /bin/usertimeout
принадлежащий root, измените его на 755 и вставьте в файл следующее содержимое
#!/bin/bash
# Timeout is the number of seconds a login session can be idle before it is
# automatically logged out.
timeout=3600
if [ $(stat -f %u /dev/console) == $UID ]
then
if [ -e /tmp/backgroundUserLogout.$UID ]
then
rm /tmp/backgroundUserLogout.$UID
fi
else
if [ ! -e /tmp/backgroundUserLogout.$UID ]
then
touch /tmp/backgroundUserLogout.$UID
else
if [ $(( `date +%s` - `stat -f %m /tmp/backgroundUserLogout.$UID || printf 0` )) -ge $(( $timeout )) ]
then
rm /tmp/backgroundUserLogout.$UID
sudo /sbin/killuser
fi
fi
fi
Затем создайте файл /sbin/killuser
, принадлежащий пользователю root, измените его на 755 и вставьте следующее содержимое
#!/bin/bash
#
# Logs out the user calling this script
# Get the PID of the loginwindow process for the user executing this
pid=`ps -Axjc | grep ^$SUDO_USER | grep loginwindow | cut -c 14-20 | tr -d /\ /`
# If the PID appears to be valid, kill the process
if [ $pid -gt 0 2>/dev/null ]
then
kill -9 $pid
fi
Затем добавьте запись crontab для каждого пользователя, для которого вы хотите автоматически выйти из системы. Это было бы больно, если бы вы хотели, чтобы это затронуло всех пользователей, но в моем случае мне требуется, чтобы только небольшое количество пользователей вышло из системы в режиме ожидания.
# Crontab for user that has to be autologged out
* * * * * /bin/usertimeout
Обратите внимание, что приведенный выше пример запускается каждую минуту, в зависимости от времени простоя, которое вы разрешаете, вы можете увеличить его до более подходящей частоты (например, каждые 15 минут, используя */15 * * * * /bin/usertimeout
)
Теперь простой мод для файла sudoers с использованием visudo
и все готово .
%users ALL=(ALL) NOPASSWD: /sbin/killuser