web-dev-qa-db-ja.com

アプリケーションへのアクセスを制限または制限するにはどうすればよいですか?

私の息子は、主に彼の新しい学校での使用のために、このクリスマスに新しいラップトップを受け取りました。

しかし、ラップトップは主に学校での使用を目的としているので、妻は私にSteamを削除することを望んでいます。

Steamへのアクセスを制限または制限する方法はありますか?おそらくSteam自体のパスワード、またはそれを実行できる時間を設定しますか?

理想的には、私の仕事なので使用するのはきれいなものでなければなりませんシンプルな多くの場合、私は自宅(およびコンピューター、および電気通信など)から遠ざけられ、妻はコンピューターほど快適ではありませんが、使いやすいとは言えませんfarより良い。

確かにこのタスクを達成できる何かがありますか?

17
Gregory Opera

プロセスまたはアプリケーションに時間制限を設定する

小さなバックグラウンドスクリプトを使用すると、プロセスまたはアプリケーションに時間制限を設定できます。
ユーザーが管理者のパスワードを知らない限りは簡単に超えられません。

以下の解決策

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

スクリプト

#!/usr/bin/python3
import subprocess
import os
import sys
import time

#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"

uselog = "/opt/limit/uselog"
datefile = "/opt/limit/currdate"

def read(f):
    try:
        return int(open(f).read().strip())
    except FileNotFoundError:
        pass

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

    try:
        # if the pid of the targeted process exists, add a "tick" to the used quantum
        pid = subprocess.check_output(["pgrep", app]).decode("utf-8").strip()
        n = read(uselog)
        n = n + 1 if n != None else 0
        # when time exceeds the permitted amount, kill the process
        if n > minutes*6: 
            subprocess.Popen(["kill", pid])
        open(uselog, "wt").write(str(n))
    except subprocess.CalledProcessError:
        pass

    currday1 = currday2

使い方

  1. デスクトップ(または他の場所)で、limitという名前のフォルダーを作成します。
  2. スクリプトを空のファイルにコピーし、limit_use(拡張子なし)フォルダー内およびとして保存します
  3. スクリプトの先頭で、制限するプロセス名、および許可される最大分数を編集します。例では:

    #--- set the time limit below (minutes)
    minutes = 1
    #--- set the process name to limit below
    app = "gedit"
    
  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 &
    

それだけ

誰かがバックグラウンドスクリプトを殺そうとすると:

enter image description here

(アクションは許可されません)

説明;使い方

  • 10秒に1回、スクリプトはターゲットプロセスが実行されているかどうかを確認します。その場合、ファイル(/opt/limit/uselog)に記録される合計使用量に「ポイント」を1つ追加します。 1日の制限に達すると、スクリプトはプロセスの実行を許可せず、存在する場合は強制終了します。
  • 日が変わると(日付はファイルに記録されるため、再起動は役に立たない)、ログファイルが削除され、新しい使用時間が蓄積されます。
  • スクリプトはboot upで実行されるため、rc.localからは、ユーザーがプロセス名を知っている場合のみ、Sudo特権を持つユーザーのみがスクリプトを停止できます。

スクリプトを停止します

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

Sudo kill "$(pgrep limit_use)"

ただし、これを行うには、Sudoパスワードが必要です。




編集

上記のスクリプトは、@ Bytecommanderで述べられているように、アプリケーションの使用を制限する合理的に安全な方法を提供する必要がありますが、非常に簡単ではありませんがcanを超えます。あなたの息子knowsセットアップであり、Linux/Ubuntuで十分な経験がない限り、以下の対策との組み合わせにより、これが発生する可能性は非常に低くなります。

追加対策

「簡単な解決策」から少し離れていますが、セットアップするのはそれほど難しくありません。追加以下の対策です。 If疑わしい非行は、スクリプトが/etc/rc.localから呼び出されていることを見つけ、ルートになり、/etc/rc.localの行を削除しますorこの方法でスクリプトを停止できれば、次の問題に直面することができます。ログイン後に画面が黒くなる。さらに、ソリューションは、再起動後5分後にバックグラウンドスクリプトが実行されているかどうかをチェックします。

余分な手段はスタートアップです。/opt/limit/limit_use &行に/etc/rc.localが存在するかどうかをチェックします。andスクリプトがまだ実行されている場合は5分後にチェックします。スクリプトは/etc/xdg/autostartの(スタートアップアプリケーションに隠された)ランチャーから実行されるため、know実行方法がない限り、何が起こっているのかを見つけることは非常に困難です。これらの2つの手段の組み合わせにより、あなたの息子が気付く可能性は低くなります。

設定方法

2つの簡単な手順が含まれます。

  1. 以下のコードを空のファイルにコピーし、デスクトップにblackout.desktopとして保存します。

    [Desktop Entry]
    Name=not allowed
    Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
    Type=Application
    Terminal=false
    NoDisplay=true
    

    ファイルを/etc/xdg/autostartにコピーします。

    Sudo cp /path/to/blackout.desktop /etc/xdg/autostart
    
  2. 次のスクリプトを空のファイルにコピーし、デスクトップにblackout.pyとして保存します実行可能にするおよび/usr/local/binにコピーします:

    cp /path/to/blackout.py /usr/local/bin
    

    スクリプト

    #!/usr/bin/env python3
    import subprocess
    import time
    
    def dim_screen():
        screen = [
            l.split()[0] for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()\
            if " connected" in l
            ]
        for scr in screen:
            subprocess.Popen(["xrandr", "--output", scr, "--brightness", "0"])
    
    if not "/opt/limit/limit_use &" in open("/etc/rc.local").read():
        dim_screen()
    
    time.sleep(300)
    
    try:
        pid = subprocess.check_output(["pgrep", "limit_use"]).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        dim_screen()
    

説明

/etc/xdg/autostartのランチャーは、すべてのユーザーに対してアプリケーション(この場合は追加のセキュリティチェックアップ)を起動します。このcouldはローカルで上書きされますが、knowチェックアップが必要です。行NoDisplay=trueをランチャーに入れると、Startup Applicationsにローカルに表示されないため、存在することを知らないと、検出されない可能性が高くなります。

さらに、あなたの息子は見つけるのに15秒しかありません(画面が黒くなります)ので、彼は天才でない限り深刻な問題を抱えているでしょう。Ubuntuと創造的な心で多くの経験を持っています。

2
Jacob Vlijm

私自身の経験から、コンピューターゲームへのアクセスを制限することは、子供たちを教育する上で最も困難な作業の1つです。もちろん、私たちの両親は、主に学校でコンピューターを使用することを望んでいますが、これは子供の意図と大きく対立しています。彼らは、学校でのみ使用できるハードウェアを提供することで私たちを嫌います。

そしてもちろん、私たちはalso彼らに彼らのコンピューターを賢明な方法で使う方法を学んでほしい。これには、ゲームやビデオの視聴が含まれます。

残念ながら、よく維持され、機能している 子供のコンピューティングを制限するペアレンタルコントロール は、Ubuntuではほとんど利用できません。もう1つの大きな問題は、それらが スマートキッズ になるとすぐに、すべての対策が無駄になることです。彼らは、私たちが気付かなくても本当に賢い場合、私たちの制限を克服する方法を常に見つけます。

子供のコンピュータで実行されているブロッキングソフトウェアまたはPAM制限は一時的なものであり、遅かれ早かれ非常に簡単に克服される可能性があります。そのため、パスワードで保護されたルーターにジョブを実行させ、物理的なアクセスをはるかに簡単に制御できるようにすることにしました。

したがって、現時点でゲームをある程度制限するためにここで行うことは、以下のすべての組み合わせです。

  • 彼らに話しかけ、余暇にコンピューターをどのように、いつ使うか、いつ学校に使うかを彼らに教育してください。これは絶え間なく進行する、かなり退屈なプロセスであり、終わりのない議論と議論につながります。しかし、私たちが感じるのは、長期的に続くのはonlyのことです。
  • アカウントに管理者権限がありません。これは一時的なものです。遅かれ早かれ、彼らがSudoグループに参加できることを知っています。計画では、これを非表示にするのではなく、私たちにそれを求めます。
  • 明確に定義された計算時間のために契約を結んでください。彼らは、自分のマシンを何のためにどのくらいの期間使用できるかを知る必要があります。彼らは今度は余暇のために学校に分割する方法を学ぶ必要があります。
  • 睡眠時間の間、すべてのインターネットをハードブロックします。

子供と私たち両方のコンピューターの使用に関する契約の履行を容易にするために、次の制限を設けました。

  • パスワードで保護されたrouterを使用します。これにより、ハードウェア(MAC)とタイムテーブルベースの組み合わせでインターネットアクセスを制限できます。 MACスプーフィングについて知らない限り、これは非常にうまく機能します。また、スマートフォンやタブレットからのアクセスも制限されます。もちろん、近所にオープンワイヤレスネットワークがある場合、これは機能しません。
  • 子供のコンピューターにSSHサーバーをインストールして、自分の意図で迷子になった場合にプラグを抜く。これは、緊急の場合に必要なものでした。
  • DNSブラックリスト(ルーターではなく、コンピューター経由!)をインストールし、最悪のアクセスをブロックします。

インターネットアクセスをブロックすると、SteamMinecraft、またはその他のgamigサーバー。ただし、オフラインで実行されるゲームには効果がありません。

4
Takkat

これは、シェルスクリプトを使用して実現できます。

最初のスクリプトは、Steamを実行するとすぐに強制終了します。

#!/bin/bash

while true
do
    pkill Steam
    sleep 1
done

exit 0

/path/to/anyname.shとして保存し、スタートアップアプリケーションのリストに追加します。

このスクリプトは、Steamという名前の開いているプロセスを毎秒チェックし、見つかった場合は強制終了します。

ただし、特定の時間にSteamを実行して、その間隔で息子がゲームをプレイできるようにするソリューションが必要です。そのためには、別のスクリプトを作成する必要があります。

#!/bin/bash

    echo "pkill anyname.sh" | at 10:00

exit 0

/path/to/anyname2.shとして保存し、これをスタートアップアプリケーションのリストに追加します。

このスクリプトは10:00に最初のスクリプトを強制終了します。ですから、あなたの息子が10:00にSteamを走ったとき。彼は今すぐプレイできるようになります。

3番目のスクリプトは、別の時点で最初のスクリプトを再起動することで、一定時間後にSteamを殺し、息子がSteamを介してゲームをプレイできなくなるようにします。

#!/bin/bash

    echo "bash /path/to/anyname.sh" | at 12:00

exit 0

/path/to/anyname3.shとして保存し、スタートアップアプリケーションのリストに追加します。

あなたの息子が見つけられないように、それらの道を隠しておいてください。

0
Raphael

新しいユーザーアカウント(経由でシステム設定)を使用しない理由。これは、Linuxでの「許可」の唯一の方法です。

  1. 新しいユーザー「SteamUser」は、sudoers(制限されたアカウントのみ)であってはなりません。
  2. 次に、「SuperAdmin」という2番目のアカウントを作成し、sudoersアカウント(ルートアクセス)にします。ただし、パスワードは自分だけに保管してください。
  3. 次に、sudoersから息子のアカウントを削除します。 (Sudoグループ)。このアカウントはルートアクセス権を持たなくなり、ソフトウェアのインストールまたは削除、システム全体の設定の変更ができなくなります。
  4. 「SuperAdmin」アカウントにログインして、SteamバイナリおよびSteamゲームフォルダの所有権を変更し、「 SteamUser」。これには、「SteamUser」を除くすべてのユーザーからの読み取り、書き込み、実行アクセス権の削除が含まれます

いくつかのメモ..

  • 息子のアカウントでルートアクセスを許可することはできません。そうしないと、chown/chmodを使用してアクセス許可の制御が簡単にバイパスされます。
  • バックグラウンドスクリプトに基づく他の提案は、不安定な混乱です。これは、彼らが有望ではないことを意味します。ただし、セットアップは簡単かもしれません。
  • 「SteamAccount」に転送するフォルダーパスは、/home/son/.Steamと、もちろんバイナリファイル/usr/games/Steamです。
  • Steamをプレイするには、「SteamUser」パスワードが必要です(「SteamUser」でログインし、Steamを実行する必要があります。ロックしてしばらくしてからセッションを期限切れにする方法を探してみてください。そのようなツールがあるかどうかはわかりませんが、時間制限を設定することは技術的には可能ですが、プログラムではなくセッションに対してです。
0
Croll