子供の計算時間を制限するにはどうすればよいですか?


60

私たちのコンピューター(インターネットへのアクセスだけでなく)へのアクセスは、子供(7、8)が自分で管理できる年齢になるまで、そのアカウントに対して制限する必要があります。それまでは、以下を定義できる必要があります。

  • コンピューティングが正常な時間(例:午後5時から9時)
  • 計算がうまくいかない曜日(月曜日から金曜日など)
  • 1日あたりの許容時間(例:2時間)

11.10では、ジョブを実行するために使用されていた次のすべてが機能しなくなりました。

  • Timekpr:11.10を超える場合、ppaを介して利用できなくなります。
  • タイムアウト:コマンドラインの代替手段ですが、11.10 からリポジトリから削除されました
  • Gnome Nanny:見栄えは良いが、繰り返しクラッシュしてXサーバーを強制的に再起動する。そのため、現時点ではこのプログラムを使用または推奨できません。

他の選択肢はありますか?


うーん...これを行うものがなければ、おそらくシェルスクリプト/ cronジョブと一緒にハックするのは簡単でしょう。
ネイサンオスマン

11
EEK。私の両親にこれを見させてはいけません。しかし、素晴らしいルートアクセスを持っているので、私はそれを回避します。:P
jrg

「まだ開発中」に関心がありますが、新しい質問に値するとは思いません。
RobotHumans

timekpr開発者が開発を継続する時間があるかもしれないし、そうでないかもしれないと約束している以外には、そのようなアプリケーションはありません。しかし、私自身の経験から、私たちはなし(より良いとしても?)も行うことができます今知っているが、それはその後、必要スマート子供とスマートな両親を
Takkat

@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

試して!

GUIからスクリプトを呼び出す前に、ターミナルから呼び出して、エラーメッセージが表示されるかどうかを確認します。

~/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フォーカスがあります。そうでない場合は、スクリプトに移動し、スクリプトを1回左クリックしてフォーカスを与えます。次に使用します:

  • ファイルを右クリックすると、コンテキストメニューオプションが表示されます。
  • メニューからを選択しますMake Link
  • という新しいアイコンが表示されLink to lock-screen-timerます。
  • 新しいアイコンを左クリックして、Nautilusからデスクトップにドラッグします。

デスクトップショートカットリンクをダブルクリックすると、スクリプトが実行されます。分数を取得するダイアログボックスが表示されます。2つのボタンが表示さCancelOKます。をクリックしXてウィンドウを閉じると、を選択した場合と同じになりますCancel

タイマーの実行後、もう一度ダブルクリックすると、最初の実行中のコピーが「強制終了」されます。これで、新しいスクレンロックカウントダウンを開始するか、クリックCancelせずにカウントダウンできます。

システムトレイ/通知領域の残り時間を表示する

ロック画面タイマーの実行中、ファイルに残っている分数が記録されます~/.lock-screen-timer-remainingwatchコマンドでこのファイルを見るか、この回答の上部に示されているように、Ubuntuのシステムトレイ/アプリケーションインジケータバーに表示できます。通知領域に残っている時間を表示するには、このQ&Aの指示に従ってください(BASHはアプリケーションインジケーターとしてシステムトレイに表示できますか?)。


38

Ubuntu <= 11.10ユーザーはUbuntuユーザー> = 11.10についてはこのガイドに従ってください。

はい、これらのプログラムはすべて古くなっており、あなたの質問はすべてここで回答されており、親コントロールでよく見えます.....

ユーザーに強制的にログオフさせることについて話すとき、実際に話しているのは、システムアクセスまたはサービスのアカウントに時間制限を実装することです。時間制限を実装するのに最も簡単な方法は、Linux-PAMというプラグインモジュールを使用することです。

Pluggable Authentication Module(PAM)は、ユーザーを認証するためのメカニズムです。具体的にはpam_time、ユーザーがサービスにアクセスするタイミングを制御するためにモジュールを使用します。

このpam_timeモジュールを使用して、特定の日またはさまざまな端末回線を介して、1日のさまざまな時間にシステムおよび/または特定のアプリケーションにアクセス制限を設定できます。構成によっては、このモジュールを使用して、名前、時刻、曜日、申請しているサービス、および要求元の端末に基づいて個々のユーザーへのアクセスを拒否できます。 。

を使用する場合pam_time/etc/security/time.confファイル内の各行(またはルール)の構文を改行で終了する必要があります。ポンド記号[#]を使用して各行にコメントを付けることができ、システムは改行までそのテキストを無視します。

ルールの構文は次のとおりです。

サービス、端末、ユーザー、時間

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時間の間にログオンすることを制限し、これらの時間中のインターネットアクセスも制限します。ルートはいつでもログオンし、いつでもインターネットを閲覧できます。

注:システムは、これらのルールのエラーをsyslog(3)として記録します。


Ubuntu Linuxでは、1人以上のユーザーがシステムに接続するのを防ぐために、コンピューターに時間制限を割り当てることができます。時間制限を使用すると、たとえば、お子様のコンピューターへのアクセスを制限したり(簡単に言うと、ペアレンタルコントロールの一種)、特定の時間にサーバーへの接続を保護したりすることもできます。

手動設定

あなたがすることを理解する

このチュートリアルでは、PAM(プラグ可能な認証モジュール、英語のプラグ可能な認証モジュール)を使用します。接続時にユーザー認証を制御できます。次に、セキュリティ構成ファイルを使用して、許可されるログオン時間を定義します。これらの操作はUbuntuのどのバージョンでも実行でき、簡単なテキストエディター(vim、emacs、nano、gedit、kateなど)のみが必要です。PAMモジュールを介して制限時間を有効にする

まず、すべての/etc/pam.d/構成可能なサービスがあるに移動します。

$ Ls /etc/pam.d/
atd common-account common-session gdm login ppp sudo
chfn common-auth cron gdm-autologin Other samba
chsh common-cupsys gnome-screensaver password passwd su

コンピューターへの接続をブロックする場合は、gdmサービスを変更する必要があります。ファイルを編集してgdmにし、次のコード行を(ファイルの最後に)追加します。

account required pam_time.so

GDMは、Ubuntu、Edubuntu、およびXubuntuのログイン画面ディストリビューションです。KDEを使用するKubuntuの場合、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|jean|emilie;scheduler

短所として、特定の1人を除くすべてのユーザーのシステムへのアクセスをブロックする場合は、!関係者の前に。たとえば、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が誤解を招く略語を混同しないように注意してください!特にインターネット上での識別が不十分です。矛盾する情報を簡単に見つけることができます。

次に、期限を指定します。これらは4桁で構成される24時間フォーマットでなければなりません。たとえば、午後3時17分から午後6時34分に制限するには、1517-1834と書きます。Marieが火曜日の午後3時17分から6時34分にのみ接続できるようにするには、次の結果を取得します。

*;*;marie;Tu1517-1834

これらの時間外の接続は禁止されます。ユーザーに関しては、演算子を使用することが可能です| そして!数回表示する(!は、表示する時間以外のすべてのログオン時間が許可されることを示す)。

コード行の先頭にある2つの星(ワイルドカード)は、それぞれttyサービスフィールドです。システムへのすべてのアクセスをブロックするため、ブロックするサービスまたはttyを指定する必要はありません。ただし、特定のサービスの使用を禁止する場合は、次の例のように指定します。

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

したがって、ユーザーは週末にTTY、4および5に接続できません。

制限スケジュールの例

mathildeは、毎日午後1時20分から午後3時20分まで、および午後4時から8時30分まで接続できます。

*;*;mathilde;Al1320-1520|Al1600-2030

ストーン、フランク、フロリアンは、平日は午後2時から午後6時45分まで、週末は午後2時から午後10時15分まで接続できます。

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

オリーブは接続できません。ジェシカは、水曜日の午後1時から午後4時までログオンできます。

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

各ユーザーの2つの異なる時間の2つの異なる行セッションの有効期限

セッションが期限切れになると(ユーザーが既に接続している時間を超えます)、PAMはユーザーに到達できます。マチルデは許可された時間内に接続しますが、これらの時間を超えることは完全に無料です!このため、新しいプログラム「cron」を使用します。このアプリケーションは、時間間隔でコマンドを実行します。この例では、セッションの有効期限が切れたときにユーザーを切断するためにコマンド「skill-KILL-u」を使用します。取り扱いは非常に簡単です。ファイル「/ etc / crontab」を編集するだけです。次に、次のコード行を追加します。

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

前と同様に、Minuteフィールドのスケジュールと希望する時間を置き換えます。次に、禁止日(s)ごとに日を記入するか、アスタリスク(*)を入力して、すべての曜日を示します。最後に、ログインアカウントで使用するフィールドをブロックするように変更します。

日はcron仕事で同じように気づいていません!このプログラムで使用される略語のリストは次のとおりです。

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

cronジョブの例(前のセクションの時間の例を含む)

ジェシカは水曜日の午後1時から午後4時までログオンできます。

->切断:火曜日の午後4時。

00 16 * root * wed skill -KILL -u jessica

mathildeは、毎日午後1時20分から午後3時20分までと午後4時から8時30分まで接続できます。

->切断:毎日、午後8時30分から午後3時20分まで。

20 15 * * * root skill -KILL -u mathilde
30 20 * * * root skill -KILL -u mathilde

ストーン、フランク、フロリアンは、平日は午後2時から午後6時45分まで、週末は午後2時から午後10時15分まで接続できます。

->切断(1):月曜日、火曜日、水曜日、木曜日、金曜日、18:45。->切断(2):土曜日と日曜日の午後10時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は、TTYと同様にGUIからユーザーを切断します。サーバー管理者に最適です。ただし、このコマンドは即時であり、切断は予告なく行われます。したがって、問題のコンピュータまたはネットワークのこのデバイスユーザーのインストールを防止することが望ましいでしょう!

すべてのユーザーの端末に表示される、タイムフレームの終了の数分前までにwall起動されるコマンドを持つユーザーを防ぐことができます。cron

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

ユーザーがGUIを使用しないようにするには、wallコマンドの代わりにlibnotify-binnotify-sendパッケージを使用します 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-bug lightdm

ここにバグがあるので報告してください。


3
WOW - -これは素晴らしい -私は感心します!特に 私たちの子供が警告なしにキックオフされることを望まないので、通知ビットは私の好みに非常に重要です。それは私のような邪悪なお父さんにとってさえも邪悪すぎるだろう;)
タックカット

残念ながら、lightdmではこれは機能しないようです(bugs.launchpad.net/lightdm/+bug/880313)。
タックカット

うわー、それは素晴らしいと長い説明です..
Mahmudin Ashar

openSUSE 11.4の場合は、Ubuntu 11.10とまったく同じです。
グプタ

11

TimeKpr

必要なものはすべて揃っていると思います。ユーザーごとの1日あたりのアクセス時間の制限、設定の簡単なGUI、1日間のバイパスの許可、「報酬時間」の追加、ユーザーの残り時間の通知など。

プロジェクトページはこちらです。また、ソフトウェアソースに追加できるubuntuのPPAもありますdeb http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu lucid main。Software CenterまたはCLIを介してインストールしますsudo apt-get install timekpr


TimeKprは(?ゲームなど)個々のアプリケーションのための時間制限を設定することができます
アンダーソングリーン

8

Timekpr

11.10でLightDMを実行する際に、次の行を /etc/pam.d/lightdm

account required pam_time.so

バグ#835310が修正されるまで、ユーザーの切り替えを有効にするためにlibpam-smbpassを削除する必要がある場合があります。

アプリケーションウィンドウで定義されたすべての制限は、timekpr GUIで定義されたとおりに機能します。

Unityでtimekpr-clientアイコンを表示するには、Unityパネル設定でホワイトリストに登録 する必要があり'timekpr'ます。さらにUnity、次の行に追加する必要があります/etc/xdg/autostart/timekpr-client.desktop

OnlyShowIn=GNOME;XFCE;KDE;Unity;

許可された時間のカウントダウンを開始するには、timekprデーモンを開始する必要があります。

/etc/init.d/timekpr start

14.04の場合:

timekprの新しいリリース/フォークは、Ubuntu 14.04のEduards Bezverhijsによって彼ので公開されましたppa:mjasnik/ppa


素晴らしいですが、一時的な解決策だと思います...あなたはtimepkrとsambaを同時に使用して他のコンピュータと共有しています(ClaudeD(claude-d)が書いたものを参照してください)....
hhlp

7

自動ログオフは、何かの途中にいると非常にイライラします。それは暴力的で、残忍で、無礼です。そして、あなたが何歳であっても関係ありません。あなたがただコンピューター中毒になっているときの一つのことであり、あなたがその送信ボタンをクリックするか、ドキュメントを保存する前に時間を追跡して5秒追い出されたときは非常に異なります。自動キッカーの代わりに自動アラームの使用を検討することをお勧めします。それはあなたの子供にお互いを尊重し、お互いがコンピュータを喜んで使用できるようにすることを教えます。

さらに軽い代替手段もあります。各子供がコンピュータを使用して費やした時間を追跡することから始めて、収集したデータをすべての人が利用できるようにして、彼らがそれを見ることができるようにします。この信じられないほど単純なこと(インターネットの帯域幅の消費に適用)だけで、私は大人でいっぱいのオフィスでネットワーク管理者をしていたときに私の命を救いました。各コンピューターの帯域幅使用状況に関する一般的な統計(バイト数であり、訪問したサイトのリストなどの匿名化情報ではありません)は、状況を「私-悪意のある貪欲な管理者-貧しい虐待を受けたオフィスユーザー」から「男性、あなたは私より5倍ダウンロードした、それは悪い!」「申し訳ありませんが、実際にダウンロードしました。昼休みに多くのYouTubeを視聴しましたが、このレートではもう見ません」-私は対立シナリオから単に除外されました。


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:

  • ユーザーがログインしているかどうかを1分ごとに確認します。ログインしている場合は、合計時間を増やします。最大時間に達した場合は、アカウントを無効にしてログオフシーケンスを開始します(合計5分)。
  • ユーザーがログインを許可されているかどうかを1時間ごとに確認します。その場合、アカウントを有効にします。
  • 深夜に、時刻をリセットします。

注意:

アプリケーションは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:timekpr-maintainers/ppaシステムのソフトウェアソースに追加することにより、この信頼できないPPAからサポートされていないパッケージでシステムを更新できます。

deb http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu oneiric main 
deb-src http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu oneiric main 

このパッケージはで利用可能です:

  • Oneiric Problemバグレポートを参照してください。...
  • ナッティ
  • 焼き印のない子牛
  • 明快
  • カルマ
  • ジャウンティ
  • イントレピッド
  • ハーディ

  • PPAとは何ですか?

問題点:

ここにバグがあるので報告してください。


ああ、それは朗報です。ここではtimekprを使用していました。それがうまくいくことを願っています-それはまだ私の11.10ボックスにインストールされており、うまく動作しますが、私の子供のアカウントをロックしません。
Takkat

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特権がないと仮定します。

このソリューションは、小さなバックグラウンドスクリプトです。スクリプトの先頭に設定するために、1日あたりの使用量を定義された分数に制限します。一度設定すると(それほど難しくありません)、非常に簡単に実行でき、その後は追加のアクションは不要です。

開いている可能性のあるファイルの不要なデータ損失を防ぐため、対象ユーザーの制限時間が切れる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秒に1回、スクリプトは対象ユーザーがログインしているかどうかを確認します。ログインしている場合、ファイルに記録される合計使用量に「ポイント」を1つ追加します(/opt/limit/uselog)。1日の制限に達すると、スクリプトはユーザーのログインを許可せず、プロセスが存在する場合は強制終了します。
  • 日が変わると(日付はファイルに記録されるため、再起動は役に立たない)、ログファイルは削除され、新しい使用時間が蓄積されます。
  • スクリプトは、上で実行されるため、ブートアップから、rc.localsudo権限を持つユーザーのみ(複数可)、ユーザは、プロセス名を知っている場合にのみ、その後も、スクリプトを停止することができます。

スクリプトを停止します

スクリプトを停止する場合は、次のコマンドを使用します。

sudo kill "$(pgrep limit_use)"

ただし、そのためにはsudoパスワードが必要です。


2

試しましたtimekprが、うまくいきませんでした。次に、私のUbuntuで動作するバリアントを作成しました。これは、このバリアントに対して行う必要があるものです。

  1. /var/lib/timelimit/user_to_be_limited.limitルート権限のみを持つファイルに時間制限を追加します。たとえば、1800秒(1800秒(30分)の1日の制限)。

  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で説明されています。要するに、1日あたりの分単位で設定された制限、1分ごとの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

トーマス・ベケルート


1

LittleBrotherLinuxマシンでの再生時間を監視できる新しいアプリケーションのベータ版をリリースしました。テストユーザーはDebianパッケージを試してみてください。ダウンロードして使用する方法については、https//github.com/marcus67/little_brotherをご覧ください。ただし、インストールはまだ少し荒いかもしれません。これらは、アプリケーションの機能です。

  • 任意の数のユーザーを監視できます。
  • 各ユーザーは、許可された再生時間を定義する特定のルールセットを持つことができます。
  • ルールは、曜日や休暇スケジュールなどの「コンテキスト」に適合させることができます(現在、ドイツのスケジュールのみがサポートされています)。
  • 再生時間はタイムウィンドウ(from、to)に制限できます。
  • 1日あたりの最大再生時間を定義できます。
  • ユーザーは、特定の最大セッション時間の後に休憩を取ることを強制できます。
  • ユーザーは、アクティビティの後、最小限の休憩時間を待つことを強制できます。
  • 任意の数のLinuxクライアントホストを監視できます(現在、これにはユーザーがすべてのマシンで同じログインを持っている必要があります)。
  • すべてのユーザーのアクティビティの履歴を持つマスターホストがあります。このマスターホストはルールセットをチェックし、必要に応じてプロセスを終了するようクライアントホストに要求します。
  • マスターホストは、設定された履歴期間(7日間など)にわたってユーザーアクティビティを表示するためのシンプルなWebインターフェイスと、設定された将来の日数のルール例外を動的に定義する管理ページを提供します。
  • Webアプリケーションはプロキシの背後で実行できるため、離れたところからアクセスできるので、若いユーザーからの呼び出しを受け取って、より多くのプレイ時間を求めてリモート管理できるようになります。
  • アプリケーションは、国際言語をサポートしています。現在、英語とドイツ語の翻訳が提供されています。ユーザーは、他の言語の翻訳を提供するように招待されています。
  • アプリケーションは、音声生成を使用して、差し迫った強制ログアウトをユーザーに通知します。また、これらの音声メッセージは国際化されています。
  • Linuxホストで費やした時間に加えて、アプリケーションはスマートフォンやテーブルなどの他のデバイスのアクティビティ時間も監視できます。最新のオペレーティングシステムのほとんどは、デバイスが使用されていない間、デバイスを何らかの省電力モードにするという事実を利用しています。このように、(pingによる)ネットワーク応答を使用して、これらのデバイスのアクティビティを判断できます。Linuxホストとは対照的に、アプリケーションはアクティビティを終了できません。ただし、再生時間は全体の再生時間に追加されるため、許可される時間に影響を与え、Linuxホストの休憩時間のルールにも影響を与えます。

いくつかのスクリーンショット:

ステータスページ 管理ページ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.