Як обмежити час на обчислення дітей?


60

Доступ до нашого комп’ютера (не тільки до Інтернету) потрібно обмежувати для облікових записів моїх дітей (7, 8), поки вони не стануть досить дорослими, щоб самостійно цим керувати. До цього нам потрібно мати можливість визначити наступне:

  • години дня, коли обчислення нормально (наприклад, 17:00 - 21:00)
  • дні тижня, коли обчислення не в порядку (наприклад, понеділок до п’ятниці)
  • кількість дозволеного часу на день (наприклад, 2 години)

У 11.10 все наступне, що раніше виконувало роботу, більше не працює:

  • Timekpr : для> 11.10 більше не доступні через ppa.
  • Timeoutd : альтернативний командний рядок, але з 11.10 видалено зі сховищ .
  • Gnome Nanny : Чудово виглядає, але неодноразово виходить з ладу, щоб змусити перезапустити X-сервер. Тому ми не можемо використати цю програму чи її повторно використати на даний момент.

Чи є інші альтернативи?


Гммм ... якщо немає нічого такого, це, ймовірно, буде легко зламати його разом із скриптами оболонки / завданнями cron.
Натан Осман

11
EEK. Не можу дати батькам бачити це. Але я б обійшов це, тому що у мене є дивовижний доступ до кореня. : P
jrg

Інтерес полягає в тому, щоб "все ще розвивається", але я не думаю, що це заслуговує на нове питання.
RobotHumans

Крім розробника timekpr, який обіцяє, що він може або не встигне продовжити розробку, немає такого додатка afaik. Але з власного досвіду я зараз знаю, що ми можемо добре (навіть краще?) Без цього, але для цього потрібні розумні діти та розумні батьки .
Таккат

@jrg або просто живий usb;)
Вільгельм Еразм

Відповіді:


1

Таймер блокування екрана

systray.gif

Створіть власний таймер блокування екрана замість сторонніх додатків

Хоча для цього є додатки сторонніх розробників, ви можете створити свої власні. Підсумок кроків:

  • Використовуйте 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 Ubuntu 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

Nautilus визначає, що відбувається, коли ми двічі клацнемо виконуваний сценарій, коли це вікно відображення файлів або посилання на робочий стіл. Нормальна поведінка - це редагувати сценарій за допомогою gedit. Ми хочемо змінити цю поведінку таким чином, щоб вона виконувалася.

Запустіть Nautilus та перейдіть до каталогу, що містить lock-screen-timer. Клацніть лівою кнопкою миші один раз, щоб виділити фокус. Наведіть курсор миші на верхню панель меню, доки не з'явиться меню "Редагувати файл ...", використовуйте:

  1. Клацніть Editспадне меню
  2. Клацніть Propertiesваріант
  3. Клацніть на Behaviorвкладку
  4. Дотримуйтесь кнопки параметрів радіо в Executable Text Files
  5. Перевірте перемикач Run executable text files when they are opened

Створіть посилання ярликів на робочому столі

З попереднього розділу lock-screen-timerвсе ще залишається фокус. Якщо ні, перейдіть до сценарію та клацніть лівою кнопкою миші один раз, щоб надати йому фокус. Потім використовуйте:

  • Клацніть правою кнопкою миші на файл і з'являться параметри контекстного меню.
  • У меню виберіть Make Link.
  • З'являється нова ікона під назвою Link to lock-screen-timer.
  • Клацніть лівою кнопкою миші на новій піктограмі та перетягніть її з Nautilus на робочий стіл.

Тепер ви можете двічі клацнути по ярлику робочого столу і сценарій запускається. З'явиться діалогове вікно, щоб отримати кількість хвилин. Представлені дві кнопки Cancelта OK. Якщо ви натиснете на кнопку, Xщоб закрити вікно, це збігається з вибором Cancel.

Після запуску таймера і ви двічі клацніть по ньому, перша запущена копія "вбита". Тепер ви можете почати новий відлік блокування екрана або натиснути Cancelдля відліку не.

Час відображення, що залишився в області систрай / повідомлень

Під час роботи таймера блокування екрана він записує, скільки хвилин залишилось у файлі ~/.lock-screen-timer-remaining. Ви можете переглянути цей файл за допомогою watchкоманди або відобразити його на системній панелі / панелі індикаторів Ubuntu, як показано вгорі цієї відповіді. Щоб відобразити час, що залишився в області сповіщень, дотримуйтесь вказівок у цьому запитанні: ( Чи може BASH відображатись у символіці як індикатор програми? ).


38

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

Ці правила обмежують користувальницьке бобі входити в режим між годинами 0800 та 2000, а також обмежують доступ до Інтернету протягом цих годин. Корінь зможе ввійти в будь-який час та також переглядати Інтернет в усі часи.

Примітка: Система записує помилки з цими правилами як syslog (3).


За допомогою Ubuntu Linux можна встановити обмеження часу на комп'ютер, щоб запобігти підключенню одного або декількох користувачів до вашої системи. Маючи обмеження за часом, ви можете, наприклад, обмежити доступ до комп'ютера для своїх дітей (такий собі батьківський контроль, коротше) , або навіть захистити з'єднання з вашим сервером протягом певних годин.

Налаштування вручну

Зрозумійте, що ви будете робити

У цьому підручнику ми будемо використовувати PAM (Pluggable Authentication Modules, англійські Pluggable Authentication Modules). Це дозволяє контролювати автентифікацію користувачів під час їх підключення. Потім ми будемо використовувати файли конфігурації безпеки для визначення дозволених годин входу. Ці маніпуляції можна виконувати на будь-якій версії 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 вводять в оману! особливо погано визначені в Інтернеті: ви можете легко знайти конфліктну інформацію!

Потім уточнюємо терміни. Вони повинні бути відформатовані 24H, що складаються з 4 цифр. Наприклад, щоб обмежитись з 15:17 до 18:34, ми пишемо: 1517-1834. Щоб дозволити Марі підключитися лише у вівторок, з 15:17 до 18:34, ми отримуємо результат:

*;*;marie;Tu1517-1834

Підключення поза ці години буде заборонено. Що стосується користувачів, то тут можна скористатися операторами | і! вказати кілька разів (the! тоді вказують, що всі години входу дозволені, за винятком показаних).

Дві зірки (макіяж) на початку рядка коду - це відповідно поле та послуги tty. Оскільки ви хочете заблокувати весь доступ до системи, непотрібно вказувати, яку службу чи те, що ви хочете заблокувати. Однак якщо ви хочете запобігти використанню певної послуги, просто вкажіть її як наступний приклад:

login;tty1|tty4|tty5;marie;!Wd0000-2400

Таким чином, користувач може одружитися не може підключитися до TTY, 4 та 5 протягом вихідних.

Деякі приклади розкладу обмежень

mathilde дозволено підключатися щодня з 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

Оливкові ніколи не дозволяється з'єднуватися. Джессіка може ввійти в середу з 13:00 до 16:00:

*;*;olivier;!Al0000-2400
*;*;jessica;We1300-1600

2 різних рядки, по два різних часу для кожного користувача Закінчення сесії

Коли сеанс закінчується (він перевищує час, коли користувач уже підключений), PAM може дійти до користувача. У той час, як mathilde підключається протягом часу, дозволеного часу, це абсолютно вільне перевищення цих годин! Для цього ми скористаємося новою програмою: "кроном". Ця програма виконує команди з інтервалом часу. У нашому випадку ми скористаємось командою «skill-KILL-u» для відключення користувача, коли сеанс закінчиться. Поводження дуже просте. Просто відредагуйте файл ´ / etc / crontab´. Потім додайте наступний рядок коду:

Minute Hour Day * * (s) root skill -KILL -u User

Як і раніше, замінюючи графіки поля та потрібний час хвилини. Потім заповніть день (и) на заборонений (и) день (и) або просто введіть зірочку (*), щоб вказати всі дні тижня. Нарешті, змініть поле, яке використовує обліковий запис для входу для блокування, і voila!

Дні не помічають однаково з 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

mathilde дозволяється підключати щодня з 13:20 до 15:20 та з 16:00 до 20:30.

-> Відключення: щодня, з 20: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 Встановити X

40 18 * * Mon,Tue,wed,thu,fri stone DISPLAY=:0 notify-send "end of session in 5 minutes"

Ubuntu 11.10 користувача

Я бачив, як у користувача виникають проблеми з Pam, і я бачив багато помилок з цього приводу. Чому причина ??? це так просто Ubuntu 11,10 doens't підтримка 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 - налагодження

або повідомити про помилку:

ubuntu-помилка lightdm

Я повідомляю про помилку тут, так що схрестіть ваш палець і чекайте ....


3
Це - вау - чудово - я вражений! Esp біт сповіщення мені дуже подобається, тому що ми не хочемо, щоб наших дітей запускали без попередження. Це було б занадто злом навіть для такого злого тата, як я;)
Таккат

На жаль, з lightdm це, здається, не працює ( bugs.launchpad.net/lightdm/+bug/880313 ).
Таккат

уау, це чудово і довге пояснення ..
Махмудін Ашар

Справа для openSUSE 11.4 точно схожа на Ubuntu 11.10.
Гупта

11

TimeKpr

Я здогадуюсь, що в ньому є все необхідне. Обмежуйте час доступу в день на кожного користувача, прості настройки для конфігурації, придатність для обходу за день, додайте деякий «час винагороди», повідомлення про час, що залишився для користувачів тощо.

Сторінка проекту тут . Вони також мають PPA для Ubuntu , який можна додати до ваших джерел програмного забезпечення: deb http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu lucid main. І встановити з допомогою Software Center або з допомогою інтерфейсу командного рядка: sudo apt-get install timekpr.


Чи може TimeKpr встановити часові межі для окремих програм (наприклад, ігор?)
Андерсон Грін

8

Timekpr

можна використовувати в 11.10 під управлінням LightDM для встановлення обмежень для користувачів, додавши наступний рядок до /etc/pam.d/lightdm

account required pam_time.so

Можливо, нам буде потрібно видалити libpam-smbpass, щоб увімкнути перемикання користувачів, поки помилка № 835310 не буде виправлена.

Всі обмеження, визначені у вікні програми, працюють як визначено в GUI timekpr.

Для відображення піктограми timekpr-клієнта в 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.


Чудово, але я думаю, що це тимчасове рішення ... адже ви одночасно використовуєте timepkr та самбу для обміну з іншими комп'ютерами (дивіться, що написав ClaudeD (claude-d)) про можливі помилки ....
hhlp

7

Автоматичний вихід із системи вкрай засмучує, якщо ви знаходитесь в середині чогось. Це жорстоко, жорстоко, просто грубо. І не має значення скільки тобі років. Це одне, коли ти просто залежний від комп’ютера, і це зовсім інше, коли ти відстежуєш час і виганяєшся за 5 секунд, перш ніж ти зумів натиснути кнопку подання або зберегти свій документ. Я пропоную вам розглянути можливість використання автоматичного нагадування замість автоматичного удару. Це навчить ваших дітей поважати один одного і дозволить один одному користуватися комп’ютером охоче.

Є навіть легша альтернатива. Почніть з відстеження часу, який кожна дитина проводить за допомогою комп’ютера, і зробіть зібрані дані доступними для всіх, щоб вони могли їх бачити. Сама ця неймовірно проста річ (застосована до витраченої пропускної здатності в Інтернеті) врятувала мені життя, коли я був адміністратором мережі в офісі, повному для дорослих. Загальнодоступні статистичні дані про використання пропускної здатності для кожного комп’ютера (лише кількість байтів, не деанонімізуючи інформацію, як-от списки відвідуваних сайтів тощо) перетворили ситуацію з "мене - злого жадібного адміністратора проти них - поганих зловживань офісних користувачів" на "людину" ви завантажили в 5 разів більше за мене, це погано! " "Вибачте, я завантажив дійсно, я переглядав багато ютуб під час обідніх перерв, більше не буду це робити", - мене просто виключили зі сценарію протистояння.


6

У мене теж було це питання. Тому я написав сценарій kidtimer, який дозволяє визначити час використання та підсумки. Проект можна знайти в Github у наступному місці:

Ось як його встановити та використовувати:

  1. Скопіюйте та вставте код у файл, який називається 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
    
  2. Виконайте:

    sudo ./kidtimer.install
  3. Виконати:

    sudo kidtimer
  4. Налаштування наявного облікового запису користувача.

  5. Зроблено.

Для допомоги:

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для сповіщення часу користувача. Коли час закінчиться, всі користувацькі процеси припиняються, тому будь ласка, підготуйте користувача.


5

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 

Цей пакет доступний на:

ПРОБЛЕМА:

Я повідомляю про помилку тут, так що схрестіть ваш палець і чекайте ....


О, це гарна новина. Тут ми використовували timekpr . Сподіваюся, це спрацює - він все ще встановлений на моєму вікні 11.10, працює добре, але не блокує облікові записи мого малюка.
Таккат

а на 14.04 працює?
rogerdpack

3

Вступ

Ми можемо перевірити, чи користувач увійшов за допомогою команди:

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

Як користуватись

  1. На робочому столі (або деінде) створіть папку з назвою: limit
  2. Скопіюйте скрипт у порожній файл, збережіть його limit_use(без розширення) всередині папки та зробіть його виконуваним
  3. Відредагуйте в голові сценарію ім'я користувача, яке потрібно обмежити, і максимальну кількість дозволених хвилин. У прикладі:

    #--- set the time limit below (minutes)
    minutes = 1
    #--- set the user name to limit below
    user = "jacob"
    
  4. Скопіюйте папку в каталог /opt:

    cp -r /path/to/limit /opt
  5. Тепер відредагуйте, /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)"

Але для цього вам знадобиться пароль судо.


2

Я спробував, timekprале не вийшло. Потім зробив його варіант, який працює на моєму Ubuntu. Ось що потрібно зробити для цього варіанту:

  1. Додайте обмеження у /var/lib/timelimit/user_to_be_limited.limitфайл лише з правами root. наприклад, 1800 протягом 1800 секунд (30 хвилин) щоденний ліміт.

  2. Створіть /usr/local/bin/timelimit.shіз кореневими правами наступні:

    #!/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
    
  3. Додати до /etc/rc.local:

    sudo /usr/local/bin/timelimit.sh &
  4. Перезапустіть Ubuntu


2

Я просто зробив доступну відповідь легко. Код пояснюється на потоці http://forums.linuxmint.com/viewtopic.php?f=213&t=77687 . Коротше кажучи: ліміт, налаштований на хвилини на день, робота з кроном щохвилини, повідомлення користувачеві про інформування про нього та вимушений вихід з системи.

Щоб завантажити та встановити це, відкрийте термінал і запустіть команди нижче:

cd /tmp/
git clone https://github.com/Thomas-Baeckeroot/ParentalControl.git
cd ParentalControl/
./install.sh

Під час встановлення буде запрошено пароль адміністратора (щоб встановити завдання cron, скопіювати сценарій,…). Звідти ви будете орієнтуватися на всіх. Там же є ./uninstall.sh на кожному випадку. Він побудований для роботи з усіма дистрибутивами на базі Ubuntu (Монетний двір тощо), ймовірно, також всі debian. Якщо виникає якась проблема, будь ласка, повідомте мене, включаючи версію системи та графічне середовище у коментарях:

uname -a
echo $XDG_CURRENT_DESKTOP

Томас Беккерут


1

Щойно я випустив бета-версію мого нового додатка, LittleBrotherякий здатний контролювати час відтворення на машинах Linux. Користувачі тестів можуть спробувати пакет Debian. Інструкції щодо її завантаження та використання можна знайти тут: https://github.com/marcus67/little_brother . Однак установка може бути дещо грубою. Це особливості програми:

  • Будь-яка кількість користувачів може контролюватися.
  • Кожен користувач може мати певний набір правил, що визначають дозволений час відтворення.
  • Правила можуть бути адаптовані до "контекстів", таких як день тижня та / або графік відпусток (на даний момент підтримуються лише німецькі графіки).
  • Час відтворення може бути обмежено часовим вікном (від, до).
  • Максимальний час гри в день може бути визначений.
  • Користувачів можна змусити зробити перерву після певного максимального часу сеансу.
  • Користувачів можна змусити чекати мінімум часу перерви після своєї діяльності.
  • Можна контролювати будь-яку кількість хостів клієнта Linux (на даний момент для користувачів потрібен однаковий вхід на всіх машинах).
  • Є головний хост з історією діяльності всіх користувачів. Цей головний хост перевіряє набори правил і пропонує клієнтові хости припинити процеси, якщо це потрібно.
  • Головний хост пропонує простий веб-інтерфейс для перегляду активності користувача протягом налаштованої тривалості історії (наприклад, 7 днів) та сторінку адміністрування, щоб динамічно визначати винятки з правил для налаштованої кількості днів у майбутньому.
  • Веб-додаток можна запускати за проксі, так що він буде доступний далеко, що дозволяє віддаленому адмініструванню після отримання дзвінків від молодих користувачів, які просять більше часу на програвання.
  • У додатку є міжнародна мовна підтримка. В даний час надаються переклади з англійської та німецької мов. Користувачам пропонується надати переклади іншими мовами.
  • У додатку використовується передача голосу для інформування користувача про примусові виходи з системи. Також ці розмовні повідомлення є інтернаціоналізованими.
  • Окрім часу, проведеного на хостах Linux, програма також може відстежувати час роботи на інших пристроях, таких як смартфони або таблиці. Скористається тим, що більшість сучасних операційних систем переводять пристрої в певний режим енергозбереження, поки вони не використовуються. Таким чином, мережевий відгук (за допомогою пінгінгу) можна використовувати для визначення активності на цих пристроях. На відміну від хостів Linux, програма не зможе припинити діяльність. Однак час відтворення буде додано до загальної тривалості відтворення і, отже, матиме вплив на час, а також на правила перерви на хостах Linux.

Деякі скріншоти:

Сторінка статусу Сторінка адміністрації

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.