Как я могу ограничить компьютерное время моих детей?

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

  • часы дня, когда вычисление не работает. (например, с 5 до 9 часов вечера)
  • дни недели, когда компьютер не работает. (например, с понедельника по пятницу)
  • количество времени, разрешенного на день (например, 2 часа)

В 11.10 все нижеперечисленное, использовавшееся для выполнения работы, не работает больше:

  • Timekpr : для> 11.10 больше не доступно через ppa.
  • Timeoutd : альтернатива командной строки, но с 11.10 удалено из репозиториев .
  • Gnome Nanny : выглядит великолепно, но неоднократно вылетает , чтобы принудительно перезапустить X-сервер. Поэтому мы не можем использовать или рекомендовать эту программу в данный момент.

Есть ли другие альтернативы?

66
задан 13 April 2017 в 15:24

11 ответов

Экранный таймер блокировки

systray.gif

Создайте свой собственный Экранный Таймер Блокировки вместо приложений сторонних производителей

Хотя существуют приложения сторонних производителей, чтобы сделать это, можно создать собственное. Сводка шагов:

  • Использовать gedit создать сценарий lock-screen-timer
  • Копия и вставка кодируют от этого окна до lock-screen-timer
  • Mark lock-screen-timer как исполняемый файл
  • Протестируйте его!
  • Настройте Наутилус для выполнения сценариев удара
  • Создайте настольную ссылку ярлыка
  • Время монитора, оставаясь

Использовать 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. Сохраните файл и выйдите из редактора назад к командной строке.

Mark lock-screen-timer как исполняемый файл

Теперь мы должны сделать исполняемый файл сценария путем ввода:

chmod +x lock-screen-timer

Протестируйте его!

Прежде, чем назвать сценарий от GUI, мы назовем его от терминала, таким образом, мы будем видеть, отображены ли какие-либо сообщения об ошибках:

~/lock-screen-timer

Вам предлагают число минут:

Lock Screen Timer

Определите желаемый номер минут и нажмите "OK" для запуска таймера. Когда существует 15, 10, 5, 3, 2 и 1 минута (минута) уехала, системный звук слышат, и пузырь сообщения кажется советующим, когда экран будет заблокирован. После того, как экран заблокирован, необходимо ввести пароль для разблокирования экрана.

Настройте Наутилус для выполнения сценариев удара

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

Запустите Наутилус и перейдите к каталогу, содержащему lock-screen-timer. Щелкните левой кнопкой по нему однажды, чтобы дать ему фокус. Мышь при наведении курсора по верхней панели меню до меню "File Edit..." появляется, используйте:

  1. Нажать Edit выпадающее меню
  2. Нажать Properties опция
  3. Нажать Behavior вкладка
  4. Наблюдайте радио-переключатели под Executable Text Files
  5. Переключатель Check Run executable text files when they are opened

Создайте настольную ссылку ярлыка

От предыдущего раздела lock-screen-timer все еще фокусируется. В противном случае перейдите к сценарию и щелчку левой кнопкой по нему однажды, чтобы дать ему фокус. Затем используйте:

  • Щелкните правой кнопкой по файлу, и опции контекстного меню появляются.
  • От выбора меню Make Link.
  • Новый значок кажется названным Link to lock-screen-timer.
  • Щелкните левой кнопкой по новому значку и перетащите его от Наутилуса до Вашего рабочего стола.

Теперь можно дважды щелкнуть по настольной ссылке ярлыка, и скрипт запущен. Диалоговое окно, кажется, получает минуты числа. Две кнопки представлены Отмена и хорошо. Если Вы нажимаете X для закрытия окна, это совпадает с Отменой выбора.

После того, как таймер работает, и Вы дважды щелкаете по нему снова, первая под управлением копия "уничтожается". Можно теперь запустить новый экранный обратный отсчет блокировки или нажать Cancel ни для какого обратного отсчета.

Время дисплея, Оставаясь в systray / область уведомлений

В то время как экранный таймер блокировки работает, он записывает, сколько минут остается в файл ~/.lock-screen-timer-remaining. Можно посмотреть на этот файл с watch команда или дисплей это на системном лотке Ubuntu / панель индикатора приложения как показано наверху этого ответа. Для отображения времени, оставаясь в области уведомлений следуйте инструкциям в этом Вопросы и ответы: (Bash может отобразиться в systray как индикатор приложения?).

1
ответ дан 13 April 2017 в 15:24

Timekpr

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

account required pam_time.so
[ 1115] Нам может потребоваться удалить libpam-smbpass , чтобы разрешить переключение пользователей, пока не исправлена ​​ошибка # 835310 .

Все ограничения, определенные в окно приложения работает, как определено в графическом интерфейсе timekpr.

Чтобы отобразить иконку timekpr-client в Unity, нам нужно белый список 'timekpr' в настройках панели Unity и, кроме того, нам нужно добавить Unity в следующую строку в /etc/xdg/autostart/timekpr-client.desktop: [ 1117]

OnlyShowIn=GNOME;XFCE;KDE;Unity;

Чтобы начать отсчет предоставленного времени, нам, возможно, придется запустить демон timekpr с

/etc/init.d/timekpr start

для 14.04:

Более новая версия / форк timekpr был опубликован для Ubuntu 14.04 Эдуардсом Безверхийсом в его ppa:mjasnik/ppa.

0
ответ дан 13 April 2017 в 15:24

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 

Этот пакет доступен в:

ПРОБЛЕМА:

Я сообщаю здесь об ошибке , так что скрестите палец и подождите ...

0
ответ дан 13 April 2017 в 15:24

Я пытался timekpr, но у меня не получилось. Затем сделал вариант, который работает на моем Ubuntu. Вот что нужно сделать для этого варианта:

  1. Добавить ограничение по времени в файле /var/lib/timelimit/user_to_be_limited.limit только с правами root. например 1800 за 1800 секунд (30 минут) дневного лимита.

  2. Создать /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
    
  3. Добавить в /etc/rc.local:

    sudo /usr/local/bin/timelimit.sh &
    
    [ 119]
  4. Перезапустите Ubuntu

0
ответ дан 13 April 2017 в 15:24

Я просто сделал доступным ответ. Код поясняется в теме 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

Thomas Baeckeroot

0
ответ дан 13 April 2017 в 15:24

Автоматический выход из системы крайне разочаровывает, если вы находитесь в середине чего-либо. Это насилие, это жестоко, это просто грубо. И не важно, сколько тебе лет. Одно дело, когда вы просто зависимы от компьютера, и это совсем другое, когда вы отслеживаете время и выгоняетесь за 5 секунд до того, как вам удалось нажать на кнопку «Отправить» или сохранить свой документ. Я предлагаю вам рассмотреть возможность использования авто-напоминания вместо авто-кикера. Это научит ваших детей уважать друг друга и позволит им охотно пользоваться компьютером.

Есть даже более легкая альтернатива. Начните с отслеживания количества времени, которое каждый ребенок проводит за компьютером, и сделайте собранные данные доступными для всех, чтобы они могли их увидеть. Одна только эта невероятно простая вещь (применительно к потраченной пропускной способности интернета) спасла мне жизнь, когда я был сетевым администратором в офисе, полном взрослых. Публичные статистические данные об использовании полосы пропускания для каждого компьютера (только количество байтов, не деанонимизирующая информация, такая как списки посещенных сайтов и т. Д.) Изменили ситуацию с «я - злой жадный администратор против них - бедные оскорбленные пользователи офиса» на «человека», ты скачал в 5 раз больше меня, это плохо! «Извините, я действительно скачал, я смотрел много YouTube во время перерывов на обед, больше не буду делать это с такой скоростью» - меня просто исключили из сценария конфронтации.

0
ответ дан 13 April 2017 в 15:24

TimeKpr

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

Страница проекта здесь , здесь . У них также есть PPA для Ubuntu, который вы можете добавить в свои источники программного обеспечения: deb http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu lucid main. И установить через Центр программного обеспечения или через CLI: sudo apt-get install timekpr.

0
ответ дан 13 April 2017 в 15:24

У меня была эта проблема также. Таким образом, я записал 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 предупредить пользовательское время заканчивается. Когда время заканчивается, все пользовательские процессы завершаются, поэтому подготовьте пользователя.

6
ответ дан 13 April 2017 в 15:24

Введение

Мы можем проверить, зарегистрирован ли пользователь командой:

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:

enter image description here

Сценарий

#!/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)"

Но Вам был бы нужен sudo пароль, чтобы сделать так.

3
ответ дан 13 April 2017 в 15:24

Я только что выпустил бета-версию своего нового приложения LittleBrother, способного контролировать время воспроизведения на компьютерах с Linux. Тестовые пользователи могут попробовать пакет Debian. Инструкции по загрузке и использованию можно найти здесь: https://github.com/marcus67/little_brother . Хотя установка может быть немного грубой. Вот особенности приложения:

  • Любое количество пользователей может контролироваться.
  • Каждый пользователь может иметь определенный набор правил, определяющих разрешенное время воспроизведения.
  • Правила могут быть адаптированы к «контекстам», таким как день недели и / или график отпусков (в настоящее время поддерживаются только немецкие расписания).
  • Время воспроизведения может быть ограничено временным окном (от, до).
  • Можно определить максимальное время воспроизведения в день.
  • Пользователи могут быть вынуждены сделать перерыв после определенного максимального времени сеанса.
  • Пользователи могут быть вынуждены ждать минимального перерыва после своей активности.
  • Можно отслеживать любое количество клиентских хостов Linux (в настоящее время это требует, чтобы пользователи имели одинаковый логин на всех машинах).
  • Существует главный хост с историей действий всех пользователей. Этот главный хост проверяет наборы правил и предлагает клиентским хостам завершать процессы, если это необходимо.
  • Главный хост предлагает простой веб-интерфейс для просмотра активности пользователя в течение заданной длины истории (например, 7 дней) и страницу администрирования для динамического определения исключений из правил в течение заданного количества дней в будущем.
  • Веб-приложение может быть запущено за прокси-сервером, так что оно будет доступно издали, позволяя удаленное администрирование после получения вызовов от молодых пользователей, просящих больше времени для игры.
  • Приложение имеет международную языковую поддержку. В настоящее время английский и немецкий переводы предоставляются. Пользователям предлагается переводить на другие языки.
  • Приложение использует генерацию голоса для информирования пользователя о предстоящих принудительных выходах из системы. Также эти разговорные сообщения интернационализированы.
  • В дополнение к времени, проведенному на хостах Linux, приложение может также отслеживать время активности на других устройствах, таких как смартфоны или таблицы. Он использует тот факт, что большинство современных операционных систем переводят устройства в какой-то режим энергосбережения, когда они не используются. Таким образом, ответ сети (путем проверки связи) может использоваться для определения активности на этих устройствах. В отличие от хостов Linux, приложение не сможет прекратить действие. Время воспроизведения, однако, будет добавлено к общему времени воспроизведения и, следовательно, будет влиять на допустимое время, а также на правила перерыва на хостах Linux.

Некоторые скриншоты:

Status Page Administration Page

0
ответ дан 13 April 2017 в 15:24

Ubuntu <= 11.10 Пользователей следуют, это руководство для Пользователя Ubuntu> = 11.10 прочитало уведомление страницы Bottom:

Да все те программы устарели, и на все Ваши вопросы отвечают здесь и хороший взгляд с Вашим родительским управлением.....

То, когда мы говорим о том, чтобы вынуждать пользователя выйти из системы, о чем мы действительно говорим, реализует ограничения по времени на счете на системный доступ или сервисы. Самым легким путем я нашел для реализации ограничений по времени, использует сменный модуль, названный 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

Эти правила ограничивают пользователя bobby во вхождении в систему между часами 0800 и 2000, и они также ограничивают доступ в Интернет в течение этих часов. Корень смог бы войти в систему в любое время и просмотреть Интернет во время всех случаев также.

Примечание: Система регистрирует ошибки с этими правилами как системный журнал (3).


С Ubuntu Linux возможно присвоить Вашим ограничениям машинного времени, предотвратить соединение одного или нескольких пользователей к Вашей системе. С ограничениями по времени можно, например, ограничить доступ к компьютеру для детей (своего рода родительский контроль, короче говоря), или даже защитить соединение с сервером в течение определенных часов.

Ручная конфигурация

Поймите то, что Вы сделаете

Всюду по этому учебному руководству мы будем использовать PAM (Сменные Модули аутентификации, английские Сменные Модули аутентификации). Это позволяет Вам управлять аутентификацией пользователя, когда они соединяются. Затем мы будем использовать файлы конфигурации безопасности для определения позволенных часов регистрации. Эти манипуляции могут быть выполнены на любой версии Ubuntu и потребовать только простого текстового редактора (энергия, emacs, нано, 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! Это включит управление часов на этом сервисе.

Если у Вас есть сервер, у Вас, вероятно, нет GUI. В этом случае GDM / KDM, не установленный и соединение, не будет заблокирован. Для предотвращения соединения с TTY необходимо изменить вход в систему того же файла и добавить ту же строку кода, чем ранее подтвержденный. Это действие также относится к людям, которые установили GUI и хотят блокировать доступ к экрану входа в систему и терминалам.

Настройте часы доступа

Теперь, когда сервис 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, John и Emily:

*;*;Patrick|jean|emilie;scheduler

Недостатками, если Вы хотите блокировать доступ к системе для всех пользователей, но один, в частности, использование! прежде чем человек заинтересован. Например, если я хочу получить доступ к компьютеру, отклонен всем пользователям, кроме Nicolas и Xavier:

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 18:34 мы пишем: 1517-1834. Чтобы позволить Marie соединиться только во вторник, с 15:17 до 18:34, мы получаем результат:

*;*;marie;Tu1517-1834

Соединения за пределами этих часов будут запрещены. Что касается пользователей, возможно использовать операторы | и! указывать несколько раз (! затем укажите, что все часы регистрации позволяются, кроме тех, чтобы быть показанными).

Эти две звезды (подстановочные знаки) в начале строки кода, соответственно, и tty сервисные поля. Так как Вы хотите блокировать весь доступ к системе, является ненужным указать, какой сервис или какой 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

Камню, Frank и Florian разрешают соединиться с 14:00 к 18:45 в течение рабочих дней и 14:00 к 22:15 в течение выходных:

*;*;Stone|franck|florian;Wk1400-1845|Wd1400-2215

Маслине никогда не позволяют соединиться. jessica может зарегистрироваться в среду с 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

Как прежде, заменяя расписания поля Minute и время желаем. Затем заполните день (дни) запрещенным (s) (s) дня (дней) или просто введите звездочку (*) для указания на все дни недели. Наконец, измените поле, используемое учетной записью, которая будет заблокирована, и вуаля!

Дни не замечают тот же путь с cron вакансии! Вот список сокращений, которые будут использоваться с этой программой:

mon : monday    fri : friday
tue : tuesday   sat : saturday
wed : wednesady sun : sunday
thu : thursday   *  : all hours

Некоторые примеры cron задания (с примерами времен в предыдущем разделе)

jessica может зарегистрироваться в среду с 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

Камню, Frank и Florian разрешают соединиться с 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. Это совершенно применимо для администраторов сервера. Однако эта команда непосредственна, и разъединение будет сделано без уведомления. Поэтому было бы предпочтительно предотвратить установку этого пользователи устройств компьютера или рассматриваемой сети!

Возможно предотвратить пользователей с a wall команда, запущенная cron несколько минут до конца периода времени, который будет отображен в терминалах всех пользователей.

40 18 * * Mon,Tue,wed,thu,fri root echo "end of session in 5 minutes" | wall

Предотвратить пользователей от GUI может использоваться вместо стенной команды notify-send находится в libnotify-мусорное-ведро Install 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 - отладка

или сообщите об ошибке:

ошибка человечности lightdm

Я сообщаю об Ошибке здесь, так пересеките палец и ожидайте....

38
ответ дан 13 April 2017 в 15:24

Другие вопросы по тегам:

Похожие вопросы: