Как я могу ограничить компьютерное время моих детей?
Доступ к нашему компьютеру (не только к Интернету) должен быть ограничен для учетных записей моих детей (7, 8), пока они не станут достаточно взрослыми, чтобы управлять этим самостоятельно. До этого момента мы должны иметь возможность определить следующее:
- часы дня, когда вычисления в порядке (например, с 5 до 9 часов вечера)
- дни недели, когда вычисления не в порядке (например, с понедельника по пятницу)
- количество времени, разрешенное в день (например, 2 часа)
В 11.10 все следующее, что раньше выполняло эту работу, больше не работает:
- Timekpr: для> 11.10 больше не доступно через ppa.
- Timeoutd: альтернатива командной строки, но из 11.10 удалена из репозиториев.
- Gnome Nanny: выглядит великолепно, но постоянно вылетает, чтобы перезапустить X-сервер. Поэтому мы не можем использовать или рекомендовать эту программу в данный момент.
Есть ли другие альтернативы?
12 ответов
Таймер блокировки экрана
Создайте свой собственный таймер блокировки экрана вместо сторонних приложений
Хотя для этого есть сторонние приложения, вы можете создавать свои собственные. Краткое изложение шагов:
- использование
gedit
создать скриптlock-screen-timer
- Скопируйте и вставьте код из этого окна в
lock-screen-timer
- отметка
lock-screen-timer
как исполняемый файл - Попробуй это!
- Настроить Nautilus для выполнения скриптов bash
- Создать ссылку на рабочем столе
- Мониторинг оставшегося времени
использование gedit
создать скрипт lock-screen-timer
Открой Terminal
используя Ctrl + Alt + T и наберите:
gedit lock-screen-timer
Скопируйте и вставьте код из окна ниже в lock-screen-timer
Вернитесь к этому экрану и скопируйте следующий код, выделив его и нажав Ctrl + C:
#!/bin/bash
# NAME: lock-screen-timer
# PATH: $HOME/bin
# DESC: Lock screen in x minutes
# CALL: Place on Desktop or call from Terminal with "lock-screen-timer 99"
# DATE: Created Nov 19, 2016. Last revision Mar 22, 2018.
# UPDT: Updated to support WSL (Windows Subsystem for Linux)
# Remove hotplugtv. Replace ogg with paplay.
# NOTE: Time defaults to 30 minutes.
# If previous version is sleeping it is killed.
# Zenity is used to pop up entry box to get number of minutes.
# If zenity is closed with X or Cancel, no screen lock timer is launched.
# Pending lock warning displayed on-screen at set intervals.
# Write time remaining to ~/.lock-screen-timer-remaining
MINUTES="$1" # Optional parameter 1 when invoked from terminal.
# if no parameters set default MINUTES to 30
if [ $# == 0 ]; then
MINUTES=30
fi
DEFAULT="$MINUTES" # When looping, minutes count down to zero. Save deafult for subsequent timers.
# Check if lock screen timer already running
pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name
PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$)
if [ "$PREVIOUS" != "" ]; then
kill "$PREVIOUS"
rm ~/.lock-screen-timer-remaining
zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated."
fi
# Running under WSL (Windows Subsystem for Linux)?
if cat /proc/version | grep Microsoft; then
WSL_running=true
else
WSL_running=false
fi
while true ; do # loop until cancel
# Get number of minutes until lock from user
MINUTES=$(zenity --entry --title="Lock screen timer" --text="Set number of minutes until lock" --entry-text="$DEFAULT")
RESULT=$? # Zenity return code
if [ $RESULT != 0 ]; then
break ; # break out of timer lock screen loop and end this script.
fi
DEFAULT="$MINUTES" # Save deafult for subsequent timers.
if [[ $MINUTES == 0 ]] || [[ $MINUTES == "" ]]; then
break ; # zero minutes considered cancel.
fi
# Loop for X minutes, testing each minute for alert message.
(( ++MINUTES ))
while (( --MINUTES > 0 )); do
case $MINUTES in 1|2|3|5|10|15|30|45|60|120|480|960|1920)
notify-send --urgency=critical --icon=/usr/share/icons/gnome/256x256/status/appointment-soon.png "Locking screen in ""$MINUTES"" minute(s)." ;
if [[ $WSL_running == true ]]; then
powershell.exe -c '(New-Object Media.SoundPlayer "C:\Windows\Media\notify.wav").PlaySync();'
else
paplay /usr/share/sounds/freedesktop/stereo/complete.oga ;
fi
;;
esac;
# Record number of minutes remaining to file other processes can read.
echo "$MINUTES Minutes" > ~/.lock-screen-timer-remaining
sleep 60
done
rm ~/.lock-screen-timer-remaining # Remove work file others can see our progress with
if [[ $WSL_running == true ]]; then
# Call lock screen for Windows 10
rundll32.exe user32.dll,LockWorkStation
else
# Call screen saver lock for Unbuntu versions > 14.04.
dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
fi
done # End of while loop getting minutes to next lock screen
exit 0 # Closed dialog box or "Cancel" selected.
Затем переключиться обратно на пустую gedit
окно и вставьте код, используя Ctrl + V. Сохраните файл и выйдите из редактора обратно в командную строку.
отметка lock-screen-timer
как исполняемый файл
Теперь нам нужно сделать исполняемый скрипт, набрав:
chmod +x lock-screen-timer
Попробуй это!
Перед вызовом скрипта из графического интерфейса мы вызовем его из терминала, чтобы мы могли увидеть, отображаются ли какие-либо сообщения об ошибках:
~/lock-screen-timer
Вам предлагается ввести количество минут:
Установите желаемое количество минут и нажмите OK, чтобы запустить таймер. Когда осталось 15, 10, 5, 3, 2 и 1 минута, раздается системный звук, и появляется сообщение, сообщающее, когда экран будет заблокирован. После блокировки экрана вам необходимо ввести пароль, чтобы разблокировать экран.
Настроить Nautilus для выполнения скриптов bash
Наутилус определяет, что происходит, когда мы дважды щелкаем на исполняемом скрипте, когда это окно отображения файлов или ссылка на рабочем столе. Нормальное поведение - редактировать скрипт, используя gedit
, Мы хотим изменить это поведение так, чтобы оно выполнялось.
Запустите Nautilus и перейдите в каталог, содержащий lock-screen-timer
, Щелкните левой кнопкой мыши по нему один раз, чтобы выделить его. Наведите указатель мыши на верхнюю строку меню, пока не появится меню "Редактировать файл...", используйте:
- Нажмите
Edit
выпадающее меню - Нажмите
Properties
вариант - Нажмите
Behavior
табуляция - Наблюдайте переключатели под радио
Executable Text Files
- Проверьте переключатель
Run executable text files when they are opened
Создать ссылку на рабочем столе
Из предыдущего раздела lock-screen-timer
все еще имеет фокус. Если нет, перейдите к сценарию и щелкните левой кнопкой мыши по нему один раз, чтобы выделить его. Тогда используйте:
- Щелкните правой кнопкой мыши на файле, и появятся параметры контекстного меню.
- Из меню выберите
Make Link
, - Появляется новый значок с именем
Link to lock-screen-timer
, - Щелкните левой кнопкой мыши на новом значке и перетащите его из Nautilus на рабочий стол.
Теперь вы можете дважды щелкнуть ссылку ярлыка на рабочем столе, и скрипт будет запущен. Появится диалоговое окно для получения количества минут. Две кнопки представлены Отмена и ОК. Если вы нажмете X
закрыть окно - это то же самое, что выбрать " Отмена".
После запуска таймера и двойного щелчка по нему первая запущенная копия "убивается". Теперь вы можете начать новый отсчет блокировки экрана или нажать кнопку " Отмена", чтобы не было обратного отсчета.
Отображение оставшегося времени в области systray / уведомлений
Когда таймер блокировки экрана работает, он записывает, сколько минут осталось в файле ~/.lock-screen-timer-remaining
, Вы можете посмотреть на этот файл с watch
введите команду или отобразите ее на панели задач / панели приложений Ubuntu, как показано в верхней части этого ответа. Чтобы отобразить оставшееся время в области уведомлений, следуйте инструкциям в этом разделе вопросов и ответов: ( Может ли BASH отображаться в systray в качестве индикатора приложения?).
Ubuntu <= 11.10 Пользователь следует этому руководству для пользователей Ubuntu>= 11.10 прочитайте примечание на нижней странице:
Да, все эти программы устарели, и на все ваши вопросы здесь даны ответы.
Когда мы говорим о том, чтобы заставить пользователя выйти из системы, мы на самом деле говорим о введении временных ограничений для учетной записи для доступа к системе или службам. Самый простой способ реализовать временные ограничения - использовать подключаемый модуль под названием Linux-PAM.
Сменный модуль аутентификации (PAM) - это механизм аутентификации пользователей. В частности, мы будем использовать pam_time
модуль для контроля доступа пользователей к сервисам.
С использованием pam_time
Модуль, мы можем установить ограничения доступа к системе и / или определенным приложениям в разное время дня, а также в определенные дни или по различным терминальным линиям. В зависимости от конфигурации вы можете использовать этот модуль, чтобы запретить доступ отдельным пользователям на основе их имени, времени суток, дня недели, услуги, на которую они обращаются, и их терминала, с которого они делают запрос.,
Когда используешь pam_time
Вы должны прекратить синтаксис каждой строки (или правила) в /etc/security/time.conf
файл с новой строкой. Вы можете комментировать каждую строку знаком решетки [#], и система будет игнорировать этот текст до новой строки.
Вот синтаксис для правила:
услуги; TTYs; пользователей; раз
The first field — services — is a logic list of PAM service names.
The second field — tty — is a logic list of terminal names.
The third field — users — is a logic list of users or a netgroup of users.
The fourth field — times — indicates the applicable times.
Вот пример типичного набора правил:
login ; * ; !bobby ; MoTuWeThFr0800-2000
login ; * ; !root ; !Al0000-2400
http ; * ; !bobby ; MoTuWeThFr0800-2000
http ; * ; !root; !Al0000-2400
Эти правила ограничивают вход пользователя в систему с 08:00 до 2000, а также ограничивают доступ к Интернету в эти часы. Root сможет войти в систему в любое время и просматривать Интернет все время.
Примечание. Система регистрирует ошибки с этими правилами как syslog(3).
С Ubuntu Linux можно назначить вашему компьютеру временные ограничения, чтобы предотвратить подключение одного или нескольких пользователей к вашей системе. С учетом временных ограничений вы можете, например, ограничить доступ к компьютеру для ваших детей (короче говоря, своего рода родительский контроль) или даже защитить соединение с вашим сервером в определенные часы.
Ручная настройка
Понять, что вы будете делать
В этом руководстве мы будем использовать PAM (сменные модули аутентификации, английские сменные модули аутентификации). Это позволяет вам контролировать аутентификацию пользователей при их подключении. Затем мы будем использовать файлы конфигурации безопасности, чтобы определить разрешенные часы входа в систему. Эти манипуляции могут быть выполнены в любой версии Ubuntu и требуют только простого текстового редактора (vim, emacs, nano, gedit, kate и многие другие). Включить ограничения часов через модуль PAM
Прежде всего, сначала перейти к /etc/pam.d/
где все настраиваемые сервисы:
$ Ls /etc/pam.d/
atd common-account common-session gdm login ppp sudo
chfn common-auth cron gdm-autologin Other samba
chsh common-cupsys gnome-screensaver password passwd su
Если мы хотим заблокировать соединение с компьютером, нам придется изменить службу gdm. Отредактируйте файл так, чтобы gdm добавил эту строку кода (в конце файла):
account required pam_time.so
GDM - это дистрибутивы экрана входа в систему Ubuntu, Edubuntu и Xubuntu. Для Kubuntu, который использует KDE, вызывается служба kdm, это будет файл, который он откроет. И все готово для настройки PAM! Это позволит контролировать часы на этом сервисе.
Если у вас есть сервер, у вас, вероятно, нет графического интерфейса. В этом случае GDM / KDM не устанавливается и соединение не будет заблокировано. Чтобы предотвратить подключение к TTY, вы должны изменить логин того же файла и добавить ту же строку кода, что и ранее подтвержденная. Это действие также распространяется на людей, которые установили графический интерфейс и хотят заблокировать доступ к экрану входа и терминалам.
Настроить часы доступа
Теперь, когда служба PAM активирована, нам нужно только настроить время доступа. Открой /etc/security
, Доступно несколько файлов конфигурации:
$ Ls /etc/security/
access.conf namespace.conf pam_env.conf
group.conf namespace.init time.conf
limits.conf opasswd time.conf.bak
Редактировать файл time.conf
, Некоторые пояснения и примеры (на английском), представляющие. Чтобы установить расписания доступа, скопируйте и вставьте следующую строку кода (как всегда в конце файла):
*;*;user;scheduler
Вместо поля пользователя введите учетную запись, которую вы хотите заблокировать.
Если вы хотите заблокировать несколько пользователей, введите их логин в строке, разделенные знаком | оператор. Например, если я хочу заморозить счета Патрика, Джона и Эмили:
*;*;Patrick|jean|emilie;scheduler
К минусам, если вы хотите заблокировать доступ к системе для всех пользователей, кроме одного, используйте! перед заинтересованным лицом. Например, если я хочу, чтобы доступ к компьютеру был запрещен всем пользователям, кроме Николаса и Ксавьера:
Nicolas *;*;!|xavier;scheduler
Обратимся теперь к полевым зонам. В этом поле, что на выбор дней и часов будет разрешено подключение возможно. Сначала вы должны указать день недели, используя следующие сокращения:
Mo : Monday Fr : Friday Wd : Sa/Su
Tu : Tuesday Sa : Saturday wk : Mo/Tu/We/Th/Fr
We : Wenesday Su : Sunday
Th : Thursday Al : All Days
Будьте осторожны, чтобы не перепутать сокращения Wk и Wd, вводящие в заблуждение! особенно плохо идентифицируется в интернете: вы легко можете найти противоречивую информацию!
Затем мы указываем сроки. Они должны быть отформатированы 24 часа, состоящий из 4 цифр. Например, чтобы ограничить 15:17 до 6:34 вечера, мы пишем: 1517-1834. Чтобы позволить Мари подключиться только во вторник с 15:17 до 18:34, мы получаем результат:
*;*;marie;Tu1517-1834
Соединения вне этих часов будут запрещены. Что касается пользователей, то можно использовать операторы | а также! указывать несколько раз (знак! означает, что разрешены все часы входа в систему, кроме тех, которые показаны).
Две звезды (подстановочные знаки) в начале строки кода - это, соответственно, поля tty services. Поскольку вы хотите заблокировать весь доступ к системе, нет необходимости указывать, какой сервис или какой tty вы хотите заблокировать. Однако, если вы хотите запретить использование определенного сервиса, просто укажите его в следующем примере:
login;tty1|tty4|tty5;marie;!Wd0000-2400
Таким образом, пользователь жениться не может подключиться к TTY 4 и 5 в выходные дни.
Некоторые примеры графика ограничений
Матильде разрешено подключаться каждый день с 13:20 до 15:20 и с 16:00 до 20:30.
*;*;mathilde;Al1320-1520|Al1600-2030
Стоун, Фрэнк и Флориан могут подключиться с 14:00 до 18:45 в будние дни и с 14:00 до 22:15 в выходные дни:
*;*;Stone|franck|florian;Wk1400-1845|Wd1400-2215
Olive никогда не разрешается подключаться. Джессика может войти в среду с 13:00 до 16:00:
*;*;olivier;!Al0000-2400
*;*;jessica;We1300-1600
2 разные строки, по два разных времени для каждого пользователя Истечение срока сессии
Когда сеанс истекает (он превышает время, пока пользователь уже подключен), PAM может связаться с пользователем. Хотя матильда соединяется в течение отведенного времени, совершенно свободно превышать эти часы! Для этого мы будем использовать новую программу: "cron". Это приложение выполняет команды с интервалами времени. В нашем случае мы будем использовать команду "skill-KILL-u", чтобы отключить пользователя по окончании сеанса. Обработка очень проста. Просто отредактируйте файл ´/etc/crontab´. Затем добавьте следующую строку кода:
Minute Hour Day * * (s) root skill -KILL -u User
Как и раньше, замена полевых расписаний минут и желаемого времени. Затем укажите дни, которые должны быть забанены, или просто введите звездочку (*), чтобы указать все дни недели. Наконец, измените поле, используемое для блокировки учетной записи, и вуаля!
Дни не замечают то же самое с cron
работа! Вот список сокращений, которые будут использоваться с этой программой:
mon : monday fri : friday
tue : tuesday sat : saturday
wed : wednesady sun : sunday
thu : thursday * : all hours
Некоторые примеры cron
рабочие места (с примерами раз в предыдущем разделе)
Джессика может войти в среду с 13:00 до 16:00.
-> Отключение: вторник в 16:00.
00 16 * root * wed skill -KILL -u jessica
Матильде разрешено подключаться каждый день с 13:20 до 15:20 и с 16:00 до 20:30.
-> Отключение: ежедневно с 8:30 до 15:20 ET.
20 15 * * * root skill -KILL -u mathilde
30 20 * * * root skill -KILL -u mathilde
Стоун, Фрэнк и Флориан могут подключаться с 14:00 до 18:45 в будние дни и с 14:00 до 22:15 в выходные.
-> Отключение (1): понедельник, вторник, среда, четверг и пятница в 18:45. -> Отключить (2): суббота и воскресенье в 22:15.
45 18 * * mon,tue,wed,thu,fri root skill -KILL -u stone && skill -KILL -u franck && skill -KILL -u florian
15 22 * * sat,sun root skill -KILL -u stone && skill -KILL -u franck && skill -KILL -u florian
Команда skill-KILL-u отключает пользователя от GUI, а также от TTY. Он идеально подходит для администраторов серверов. Однако эта команда является немедленной, и отключение будет выполнено без уведомления. Поэтому было бы предпочтительнее запретить установку данного устройства пользователям данного компьютера или сети!
Можно предотвратить пользователей с wall
команда запущена cron
за несколько минут до окончания таймфрейма, который будет отображаться в терминалах всех пользователей.
40 18 * * Mon,Tue,wed,thu,fri root echo "end of session in 5 minutes" | wall
Для предотвращения пользователей от графического интерфейса можно использовать вместо стены команду notify-send
находится в пакете libnotify-bin
40 18 * * Mon,Tue,wed,thu,fri stone DISPLAY=:0 notify-send "end of session in 5 minutes"
Ubuntu 11.10 пользователя
Я видел вокруг пользователя, имеющего проблемы с Пэм, и я видел много ошибок по этому поводу, так почему причина??? так просто Ubuntu 11.10 больше не поддерживает GDM, новый менеджер дисплеев - lightGDM, проблема в том, где хранить эту директиву account required pam_time.so
я думаю, что в /etc/pam.d/lightdm
или же /etc/pam.d/lightdm-autologin
но ошибка как???
так что вы можете проверить эти 2 файла журнала LightGdm:
- /var/log/lightdm/lightdm.log
- /var/log/lightdm/x-0.log
или запустите LightGdm в режиме отладки:
LightDM - дебаг
или сообщить об ошибке:
убунту-баг лайтдм
Я сообщаю об ошибке здесь, так что скрестите палец и подождите....
TimeKpr
Я думаю, в нем есть все, что вам нужно. Ограничьте время доступа в день для каждого пользователя, удобный интерфейс для настройки, возможность обхода в течение дня, добавьте некоторое "время вознаграждения", уведомление об оставшемся времени для пользователей и т. Д.
Страница проекта находится здесь. У них также есть PPA для Ubuntu, который вы можете добавить в свои источники программного обеспечения: deb http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu lucid main
, И установить через Центр программного обеспечения или через CLI: sudo apt-get install timekpr
,
Автоматический выход из системы крайне разочаровывает, если вы находитесь в середине чего-то. Это насилие, это жестоко, это просто грубо. И не важно, сколько тебе лет. Одно дело, когда вы просто зависимы от компьютера, и это совсем другое, когда вы отслеживаете время и выгоняетесь за 5 секунд до того, как вам удалось нажать на кнопку "Отправить" или сохранить свой документ. Я предлагаю вам рассмотреть возможность использования авто-напоминания вместо авто-кикера. Это научит ваших детей уважать друг друга и позволит друг другу охотно пользоваться компьютером.
Есть даже более легкая альтернатива. Начните с отслеживания количества времени, которое каждый ребенок проводит за компьютером, и сделайте собранные данные доступными для всех, чтобы они могли их увидеть. Одна только эта невероятно простая вещь (применительно к потраченной пропускной способности интернета) спасла мне жизнь, когда я был сетевым администратором в офисе, полном взрослых. Публичные статистические данные об использовании полосы пропускания для каждого компьютера (только количество байтов, не деанонимизирующая информация, такая как списки посещенных сайтов и т. Д.) Изменили ситуацию с "я - злой жадный администратор против них - бедные оскорбленные пользователи офиса" на "человека", ты скачал в 5 раз больше меня, это плохо!"Извините, я действительно скачал, я смотрел много YouTube во время перерывов на обед, больше не буду делать это с такой скоростью", - меня просто исключили из сценария конфронтации.
Timekpr
может использоваться в 11.10 при запуске LightDM для установки ограничений для пользователей путем добавления следующей строки в /etc/pam.d/lightdm
account required pam_time.so
Возможно, нам придется удалить libpam-smbpass, чтобы разрешить переключение пользователей, пока ошибка #835310 не будет исправлена.
Все ограничения, определенные в окне приложения, работают так, как определено в графическом интерфейсе timekpr.
Чтобы отобразить иконку timekpr-client в Unity, нам нужен белый список 'timekpr'
в настройках панели Unity, а кроме того нам нужно добавить Unity
на следующую строку в /etc/xdg/autostart/timekpr-client.desktop
:
OnlyShowIn=GNOME;XFCE;KDE;Unity;
Чтобы начать отсчет предоставленного времени, нам, возможно, придется запустить демон timekpr с помощью
/etc/init.d/timekpr start
на 14.04:
Более новый выпуск / ветка timekpr был опубликован для Ubuntu 14.04 Эдуардсом Безверхайсом в его ppa:mjasnik/ppa
,
У меня тоже была эта проблема. Итак, я написал скрипт kidtimer, который позволяет вам определять время использования и итоги. Проект можно найти на Github по следующему адресу:
Вот как это установить и использовать:
Скопируйте и вставьте код в файл с именем
kidtimer.install
,#!/bin/bash # Restrict kids computer access to specific hours and total time. # By: Michael Groves - grover66_at_gmail_dot_com #variables basedir="/usr/local/kidtimer" configdir="/etc/kidtimer" Cdate=`/bin/date | awk '{ print $2" "$3 }'` TUI=0 HOUR=`/bin/date +%H` DOW=`/bin/date +%u` WEEKEND="no" [ "$DOW" == "6" ] && WEEKEND="yes" [ "$DOW" == "7" ] && WEEKEND="yes" #arguments [ $# -eq 0 ] && TUI=1 [ $# -eq 1 ] && COMMAND=$1 [ $# -eq 2 ] && COMMAND=$1 && KID=$2 [ $# -eq 3 ] && COMMAND=$1 && KID=$2 && Time=$3 ################# Subroutines ################## ################################################ go_check_install () { if [ ! -e $basedir ]; then go_initialize fi } go_initialize () { /bin/mkdir -p $basedir/time /bin/mkdir -p $basedir/schedule /bin/cp $0 /usr/local/bin/kidtimer && chmod +x /usr/local/bin/kidtimer echo "0 * * * * root /usr/local/bin/kidtimer hourly" > /etc/cron.d/kidtimer echo "0 0 * * * root /usr/local/bin/kidtimer daily" >> /etc/cron.d/kidtimer echo "* * * * * root /usr/local/bin/kidtimer check" >> /etc/cron.d/kidtimer echo "@reboot root /usr/local/bin/kidtimer daily" >> /etc/cron.d/kidtimer echo "@reboot root /usr/local/bin/kidtimer hourly" >> /etc/cron.d/kidtimer /bin/mkdir $configdir /usr/bin/touch $configdir/kid.list go_create_message_files echo "Kidtimer is now installed. Run /usr/local/bin/kidtimer to configure." } go_create_message_files () { cat << EOF > $basedir/send5.sh #!/bin/bash Name=\$1 /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \ /usr/share/pixmaps/gnome-set-time.png "ALERT" \ "You will be logged out in 5 minutes."' \$Name EOF chmod +x $basedir/send5.sh cat << EOF > $basedir/send4.sh #!/bin/bash Name=\$1 /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \ /usr/share/pixmaps/gnome-set-time.png "ALERT" \ "You will be logged out in 4 minutes."' \$Name EOF chmod +x $basedir/send4.sh cat << EOF > $basedir/send3.sh #!/bin/bash Name=\$1 /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \ /usr/share/pixmaps/gnome-set-time.png "ALERT" \ "You will be logged out in 3 minutes."' \$Name EOF chmod +x $basedir/send3.sh cat << EOF > $basedir/send2.sh #!/bin/bash Name=$1 /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \ /usr/share/pixmaps/gnome-set-time.png "ALERT" \ "You will be logged out in 2 minutes."' \$Name EOF chmod +x $basedir/send2.sh cat << EOF > $basedir/send1.sh #!/bin/bash Name=\$1 /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \ /usr/share/pixmaps/gnome-set-time.png "ALERT" \ "You will be logged out in 1 minute."' \$Name EOF chmod +x $basedir/send1.sh cat << EOF > $basedir/logout.sh #!/bin/bash Name=\$1 /usr/bin/pkill -KILL -u \$Name rm -rf /tmp/kidtimer.shutdown.\$Name EOF chmod +x $basedir/logout.sh cat << EOF > $basedir/schedule/blank #hour weekday weekend (y/n) 00 n n 01 n n 02 n n 03 n n 04 n n 05 n n 06 n n 07 n n 08 y y 09 y y 10 y y 11 y y 12 y y 13 y y 14 y y 15 y y 16 y y 17 y y 18 y y 19 y y 20 n n 21 n n 22 n n 23 n n #minutes weekday weekend MAX 120 240 EOF } go_check () { for I in `cat $configdir/kid.list`; do /usr/bin/users | grep -q $I if [ $? -eq 0 ]; then if [ -e $basedir/time/$I.ttl ]; then C=`cat $basedir/time/$I.ttl` C=$((C + 1)) echo $C > $basedir/time/$I.ttl else echo 1 > $basedir/time/$I.ttl C=1 fi else go_clean_jobs $I exit 0 fi # check total time. W="no" [ $DOW -eq 6 ] && W="yes" [ $DOW -eq 7 ] && W="yes" [ "$W" == "no" ] && TIME_LIMIT=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $2 }'` [ "$W" == "yes" ] && TIME_LIMIT=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $3 }'` if [ $C -ge $TIME_LIMIT ]; then if [ ! -e /tmp/kidtimer.shutdown.$I ]; then /usr/bin/passwd $I -l go_logout $I fi fi done } go_clean_jobs () { K=$1 for I in `/usr/bin/atq | awk '{ print $1 }' | sort`; do /usr/bin/at -c $I | grep kidtimer | grep -q $K [ $? -eq 0 ] && /usr/bin/at -d $I done [ -e /tmp/kidtimer.shutdown.$K ] && rm -rf /tmp/kidtimer.shutdown.$K } go_daily () { for I in `cat $configdir/kid.list`; do ls -l $basedir/time/$I.ttl | grep -q "$Cdate" if [ ! $? -eq 0 ]; then echo "0" > $basedir/time/$I.ttl fi done } go_hourly () { if [ -s $configdir/kid.list ]; then for I in `cat $configdir/kid.list`; do if [ -e $basedir/schedule/$I ]; then [ "$WEEKEND" == "no" ] && TL=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $2 }'` [ "$WEEKEND" == "yes" ] && TL=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $3 }'` [ -e $basedir/time/$I.ttl ] && C=`cat $basedir/time/$I.ttl` [ $C -ge $TL ] && /usr/bin/passwd $I -l && exit 0 [ "$WEEKEND" == "no" ] && R=`grep ^$HOUR $basedir/schedule/$I | awk '{ print $2 }'` [ "$WEEKEND" == "yes" ] && R=`grep ^$HOUR $basedir/schedule/$I | awk '{ print $3 }'` if [ "$R" == "y" ]; then /usr/bin/passwd $I -u else /usr/bin/passwd $I -l /usr/bin/users | grep -q $I && /usr/local/bin/kidtimer shutdown $I fi fi done fi } go_logout () { K=$1 echo "$basedir/send5.sh $K" | at now + 1 minutes echo "$basedir/send4.sh $K" | at now + 2 minutes echo "$basedir/send3.sh $K" | at now + 3 minutes echo "$basedir/send2.sh $K" | at now + 4 minutes echo "$basedir/send1.sh $K" | at now + 5 minutes echo "$basedir/logout.sh $K" | at now + 6 minutes touch /tmp/kidtimer.shutdown.$K } go_addtime () { U=$KID A=$Time if [ "$KID" == "reset" ]; then echo "0" > $basedir/time/$U.ttl echo "Done." exit 0 elif [ "$KID" == "" ]; then echo "Error." echo "Syntax: addtime <user> <minutes|reset>" exit 1 else C=`cat $basedir/time/$KID.ttl` C=$((C - Time)) echo $C > $basedir/time/$KID.ttl echo "New total minutes is "$C"." echo "Done." fi /usr/bin/passwd $KID -u } go_tui () { go_command_list echo -n "Choose: "; read -e X case "$X" in 1) go_setup_user ;; 2) go_modify_user ;; 3) go_remove_user ;; 4) go_list_users ;; 5) exit 0 ;; esac go_tui } go_command_list () { echo echo "1) Setup user limits." echo "2) Modify user limits." echo "3) Remove user limits." echo "4) List configured users." echo "5) Quit." echo } go_list_users () { echo echo "Users configured for kidtimer:" if [ -s $configdir/kid.list ]; then cat $configdir/kid.list else echo "No configured users." fi } go_setup_user () { echo echo -n "Username: "; read -e U /usr/bin/id $U > /dev/null 2>&1 if [ $? -eq 0 ]; then /bin/cp $basedir/schedule/blank $basedir/schedule/$U echo "0" > $basedir/time/$U.ttl echo $U >> $configdir/kid.list echo "Done." echo echo -n "Modify limits now ?(y/n): "; read -e M if [ "$M" == "y" ]; then if [ -e /usr/bin/nano ]; then /usr/bin/nano $basedir/schedule/$U echo "Done." else /usr/bin/vi $basedir/schedule/$U echo "Done." fi fi else echo "Error. User does not exist. Please create user using the useradd command first." fi } go_modify_user () { echo echo -n "Username: "; read -e U grep -q ^$U $configdir/kid.list if [ $? -eq 0 ]; then if [ -e /usr/bin/nano ]; then /usr/bin/nano $basedir/schedule/$U echo "Done." else /usr/bin/vi $basedir/schedule/$U echo "Done." fi else echo "Error. User not setup. Please setup user first." fi } go_remove_user () { echo echo -n "Username: "; read -e U grep -q ^$U $configdir/kid.list if [ $? -eq 0 ]; then grep -v ^$U $configdir/kid.list > /tmp/kidtimer.tmp cat /tmp/kidtimer.tmp > $configdir/kid.list echo "Done." else echo "Error. User is not setup." fi } go_help () { echo echo "Commands:" echo "--------------------------------------------------------------------------------" echo "addtime <user> <minutes> ... Increases allowed time for the day." echo "logout <user> ... Starts logout sequence for user." echo "hourly ... Enables/disables user access based on the schedule." echo "daily ... Resets time for the new day." echo "help ... This list." echo "--------------------------------------------------------------------------------" } ###################### Code #################### ################################################ go_check_install [ $TUI -eq 1 ] && go_tui case "$COMMAND" in addtime) go_addtime ;; logout) go_logout $KID ;; initialize) go_initialize ;; hourly) go_hourly ;; daily) go_daily ;; check) go_check ;; -h) go_help ;; help) go_help ;; esac exit 0
Выполните это:
sudo ./kidtimer.install
Запустить его:
sudo kidtimer
Настройте существующую учетную запись пользователя.
Готово.
За помощью:
sudo kidtimer help
Добавьте время к учетной записи пользователя (только для этого дня):
sudo kidtimer addtime user minutes
Особенности:
- Предоставьте своему ребенку определенные часы дня для доступа к компьютеру как в будни, так и в выходные.
- Установите максимальное количество времени, будний день и выходные.
Ключевые файлы:
/etc/kidtimer/kid.list
/etc/cron.d/kidtimer
/usr/local/kidtimer/schedule/<user>
/usr/local/kidtimer/time/<user>.ttl
/usr/local/bin/kidtimer
Cronjobs:
- Проверьте каждую минуту, чтобы увидеть, если пользователь вошел в систему. Если это так, увеличить общее время. Если достигнуто максимальное время, отключите учетную запись и начните последовательность выхода из системы (всего 5 минут).
- Ежечасно проверяйте, разрешено ли пользователю входить в систему. Если это так, включите учетную запись.
- В полночь время сброса.
Замечания:
Приложение использует notify-send
чтобы предупредить пользователя истекает время. Когда время истекает, все пользовательские процессы завершаются, поэтому, пожалуйста, подготовьте пользователя.
timekpr - эта программа будет отслеживать и контролировать использование учетных записей пользователей на компьютере. Вы можете ограничить их ежедневное использование в зависимости от продолжительности доступа по времени и настроить периоды дня, когда они могут или не могут войти в систему. С помощью этого приложения администраторы могут ограничивать продолжительность времени входа в учетную запись или часы доступа к учетной записи. Приложение работает как родительский контроль времени и будет полезно родителям, которые хотят ограничить время доступа детей.
Even Nedberg proposed the following answer:
Just started copying into the 11.10 version for the PPA. Should finish
in a few minutes.
Вы можете обновить свою систему с помощью неподдерживаемых пакетов из этого ненадежного PPA, добавив ppa:timekpr-maintainers/ppa
к программным источникам вашей системы.
deb http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu oneiric main
deb-src http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu oneiric main
Этот пакет доступен в:
- Oneiric Проблема см. Отчет об ошибке....
- искусный
- инакомыслящий
- ясный
- Кармическая
- бойкий
- бесстрашный
выносливый
ПРОБЛЕМА:
Я сообщаю об ошибке здесь, так что скрестите палец и подождите....
Вступление
Мы можем проверить, вошел ли пользователь с помощью команды:
who -u
что дает нам вывод, как:
$ who -u
jacob :0 2016-03-17 20:48 ? 2557 (:0)
newuser :1 2016-03-17 20:50 ? 4466 (:1)
В выводе мы получаем pid целевого пользователя, который должен быть остановлен, если время превышает лимит.
Решение
Предполагая, что ваш пользователь не имеет sudo
привилегии:
Это решение представляет собой небольшой фоновый скрипт. Это ограничивает использование в день определенным количеством минут, чтобы установить в заголовке сценария. После настройки (что не так уж сложно) он работает очень легко, и после этого никаких дополнительных действий не требуется.
Чтобы предотвратить нежелательную потерю данных в потенциально открытых файлах, за 60 секунд до истечения срока действия целевого пользователя на его или ее экране появится сообщение DISPLAY
:
Сценарий
#!/usr/bin/python3
import subprocess
import os
import sys
import time
#--- set the time limit below (minutes)
minutes = 120
#--- set the user name to limit below
user = "newuser"
uselog = "/opt/limit/uselog"
datefile = "/opt/limit/currdate"
def read(f):
try:
return int(open(f).read().strip())
except FileNotFoundError:
pass
def message(disp, user):
return "DISPLAY="+disp+" su - "+user+" -c "+'"'+\
"notify-send 'User "+user+\
" will be logged off in 60 seconds'"+'"'
currday1 = read(datefile)
while True:
time.sleep(10)
currday2 = int(time.strftime("%d"))
# check if the day has changed, to reset the used quantum
if currday1 != currday2:
open(datefile, "wt").write(str(currday2))
try:
os.remove(uselog)
except FileNotFoundError:
pass
# if the pid of the targeted process exists, add a "tick" to the used quantum
check = subprocess.check_output(["who", "-u"]).decode("utf-8")
pid = [l.split() for l in check.splitlines() if user in l]
if pid:
n = read(uselog)
n = n + 1 if n != None else 0
open(uselog, "wt").write(str(n))
# when time exceeds the permitted amount, kill the process
if n > minutes*6:
disp = [d for d in [d[1] for d in pid] if all([":" in d, not "." in d])][0]
subprocess.Popen(["/bin/bash", "-c", message(disp, user)])
time.sleep(60)
pids = [p[-2] for p in pid]
for p in pids:
subprocess.Popen(["kill", p])
currday1 = currday2
Как пользоваться
- На рабочем столе (или в любом другом месте) создайте папку с именем:
limit
- Скопируйте скрипт в пустой файл, сохраните его как
limit_use
(без расширения) внутри папки и сделать ее исполняемой Отредактируйте в заголовке скрипта имя пользователя до предела и максимальное количество разрешенных минут. В примере:
#--- set the time limit below (minutes) minutes = 1 #--- set the user name to limit below user = "jacob"
Скопируйте папку в каталог
/opt
:cp -r /path/to/limit /opt
Сейчас редактирую
/etc/rc.local
чтобы скрипт запускался какroot
на старте:sudo -i gedit /etc/rc.local
Прямо перед линией
exit 0
другая строка:
/opt/limit/limit_use &
Объяснение; как это устроено
- Раз в 10 секунд скрипт просматривает, вошел ли целевой пользователь в систему. Если это так, он "добавляет" одну "точку" к общему использованию, которое будет записано в файл (
/opt/limit/uselog
). Если дневной лимит достигнут, скрипт больше не позволяет пользователю войти в систему, убивает его процесс, если он существует. - При смене дня (дата записывается в файл, поэтому перезагрузка не поможет), файл журнала удаляется, что позволяет увеличить время использования.
- Поскольку скрипт запускается при загрузке, из
rc.local
только пользователи с правами sudo могут остановить сценарий, даже если только пользователь знает имя процесса.
Остановить сценарий
Если вы хотите остановить скрипт, используйте команду:
sudo kill "$(pgrep limit_use)"
Но для этого вам понадобится пароль sudo.
Я только что выпустил бета-версию моего нового приложения LittleBrother
который способен контролировать время воспроизведения на машинах Linux. Тестовые пользователи могут попробовать пакет Debian. Инструкции по загрузке и использованию можно найти здесь: https://github.com/marcus67/little_brother. Однако установка может быть немного грубой. Это особенности приложения:
- Можно контролировать любое количество пользователей.
- Каждый пользователь может иметь определенный набор правил, определяющих разрешенное время воспроизведения.
- Правила могут быть адаптированы к "контекстам", таким как день недели и / или график отпусков (в настоящее время поддерживаются только немецкие расписания).
- Время воспроизведения может быть ограничено временным окном (от, до).
- Можно определить максимальное время игры в день.
- Пользователи могут быть вынуждены сделать перерыв после определенного максимального времени сеанса.
- Пользователи могут быть вынуждены ждать минимальный перерыв после их активности.
- Можно контролировать любое количество клиентских хостов Linux (в настоящее время это требует, чтобы пользователи имели одинаковый логин на всех машинах).
- Есть главный хост с историей активности всех пользователей. Этот главный хост проверяет наборы правил и предлагает клиентским хостам завершить процессы, если это необходимо.
- Главный хост предлагает простой веб-интерфейс для просмотра активности пользователя в течение заданной длины истории (например, 7 дней) и страницу администрирования для динамического определения исключений из правил в течение заданного количества дней в будущем.
- Веб-приложение может быть запущено за прокси-сервером, так что оно будет доступно издали, позволяя удаленное администрирование после получения звонков от молодых пользователей, просящих больше времени для игры.
- Приложение имеет международную языковую поддержку. В настоящее время предоставляются переводы на английский и немецкий языки. Пользователям предлагается предоставлять переводы на другие языки.
- Приложение использует генерацию голоса для информирования пользователя о предстоящих принудительных выходах из системы. Также эти разговорные сообщения интернационализированы.
- В дополнение к времени, проведенному на хостах Linux, приложение может также отслеживать время активности на других устройствах, таких как смартфоны или таблицы. Он использует тот факт, что большинство современных операционных систем переводят устройства в какой-то режим энергосбережения, когда они не используются. Таким образом, ответ сети (путем проверки связи) может использоваться для определения активности на этих устройствах. В отличие от хостов Linux, приложение не сможет прекратить действие. Время воспроизведения, однако, будет добавлено к общему времени воспроизведения и, следовательно, будет влиять на допустимое время, а также на правила перерыва на хостах Linux.
Некоторые скриншоты:
Я старался timekpr
но не получил это работает. Затем сделал вариант, который работает на моем Ubuntu. Вот что нужно сделать для этого варианта:
Добавить ограничение по времени в
/var/lib/timelimit/user_to_be_limited.limit
файл только с правами root. например, 1800 за 1800 секунд (30 минут) дневного лимита.Создайте
/usr/local/bin/timelimit.sh
с правами root со следующим:#!/bin/bash pollTime=30 export DISPLAY=:0 while(true); do sleep $pollTime usersLogedIn=$( users|sed -e 's/\s\+/\n/g'|sort|uniq ) for userName in $usersLogedIn; do if [[ -e "/var/lib/timelimit/$userName.limit" ]] then if [[ ! -e "/var/lib/timelimit/$userName.time" || `( stat -c '%z' /var/lib/timelimit/$userName.time|cut -c9,10 )` != `date +%d` ]] then echo $pollTime > /var/lib/timelimit/$userName.time else timeUsed=$(( `cat /var/lib/timelimit/$userName.time` + $pollTime )) echo $timeUsed > /var/lib/timelimit/$userName.time fi if [[ `cat /var/lib/timelimit/$userName.time` -gt `cat /var/lib/timelimit/$userName.limit` ]] then export XAUTHORITY=/home/$userName/.Xauthority notify-send --icon=gtk-dialog-warning --urgency=critical -t 30000 "$userName" "You have 60 seconds left!" sleep 60 pkill -u $userName fi fi done done
добавить в
/etc/rc.local
:sudo /usr/local/bin/timelimit.sh &
Перезапустите Ubuntu
Я просто сделал ответ доступным легко. Код поясняется в теме http://forums.linuxmint.com/viewtopic.php?f=213&t=77687. Короче говоря: лимит, настроенный в минутах в день, задание cron каждую минуту, сообщение пользователю, чтобы держать его в курсе, и принудительный выход из системы.
Чтобы загрузить и установить это, откройте Терминал и выполните команды ниже:
cd /tmp/
git clone https://github.com/Thomas-Baeckeroot/ParentalControl.git
cd ParentalControl/
./install.sh
Пароль администратора будет запрошен в процессе установки (для установки задания cron, для копирования сценария и т. Д.). Оттуда вы будете руководствоваться для всех. Также на всякий случай есть./uninstall.sh в том же месте. Он создан для работы со всеми дистрибутивами на основе Ubuntu (Mint и т. Д., Вероятно, также и с Debian). Если возникнет какая-либо проблема, пожалуйста, дайте мне знать, включая версию системы и графическое окружение в комментариях:
uname -a
echo $XDG_CURRENT_DESKTOP
Томас Бекрут
Пример сценария родительского тайм-аута
Создайте задание cron со следующим скриптом bash
sudo vi /root/timeout.sh
образец содержания сценария (по расписанию с понедельника по пятницу с 18:00 до 20:00, в субботу и воскресенье с 08:00 до 22:00)
#!/bin/bash
#==========================================
# Timeout script
#==========================================
# */1 * * * * /root/timeout.sh
USER="test"
TIMEOUT_USER=$(who | grep $USER)
TIMEOUT_DHM=$(date +"%u%H%M")
if [ ! -z "$TIMEOUT_USER" ] \
&& [[ ! (\
($TIMEOUT_DHM -ge 11800 && $TIMEOUT_DHM -le 12200) || \
($TIMEOUT_DHM -ge 21800 && $TIMEOUT_DHM -le 22200) || \
($TIMEOUT_DHM -ge 31800 && $TIMEOUT_DHM -le 32200) || \
($TIMEOUT_DHM -ge 41800 && $TIMEOUT_DHM -le 42200) || \
($TIMEOUT_DHM -ge 51800 && $TIMEOUT_DHM -le 52200) || \
($TIMEOUT_DHM -ge 60800 && $TIMEOUT_DHM -le 62200) || \
($TIMEOUT_DHM -ge 00800 && $TIMEOUT_DHM -le 02200) \
)]];
then
echo "$(date +"%Y-%m-%d %H:%M:%S") - $USER timeout" >> /var/log/timeout.log
skill -KILL -u $USER
fi
Изменить корневой контакт
sudo crontab -e
и добавьте это расписание, работающее каждую минуту
*/1 * * * * /root/timeout.sh
перезапустите cron и выведите список crontab
sudo systemctl restart cron
sudo crontab -l
Вы можете редактировать в любое время /root/timeout.sh
Вручную проверьте скрипт, используя
sudo /root/timeout.sh
Просроченные сеансы регистрируются в /var/log/timeout.log.