如何限制或约束对应用程序的访问?

如何限制或约束对应用程序的访问?

去年圣诞节,我的儿子收到了一台新笔记本电脑,主要用于在新学校使用...现在他有了自己的笔记本电脑,他很高兴安装了 Steam。

但是妻子希望我删除 Steam,因为笔记本电脑主要用于学校使用...如果没有必要,我宁愿不这样做。

有什么方法可以限制或以其他方式限制对 Steam 的访问?也许是 Steam 本身的密码,或者设置可以运行的时间?

理想情况下,必须是漂亮的东西简单的因为我的工作经常让我远离家(和电脑、电信等),而我的妻子不像我那样习惯使用电脑,所以更容易使用,远的更好的。

当然有某物有谁能完成这个任务?

答案1

对流程或应用程序设置时间限制

使用一个小的后台脚本,您可以对进程或应用程序设置时间限制。
只要你的用户不知道管理员密码,并不太容易被超越。

下面的解决方案

是一个很小的后台脚本。它限制了使用每天设定为定义的分钟数,在脚本的开头设置。设置后(这并不难)运行起来非常容易,之后不需要采取任何额外措施。

剧本

#!/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 &
    

就是这样

当有人尝试终止后台脚本时:

在此处输入图片描述

(不允许此操作)

解释;工作原理

  • 该脚本每 10 秒检查一次目标进程是否正在运行。如果正在运行,它会在总使用量中“增加”一个“点”,并记录在文件中 ( /opt/limit/uselog)。如果达到每日限制,该脚本将不再允许该进程运行,并终止该进程(如果存在)。
  • 在日期改变时(日期记录在文件中,因此重新启动无济于事),日志文件将被删除,从而允许建立新的使用时间。
  • 由于脚本运行于启动,只有rc.local具有 sudo 权限的用户才能停止脚本,即使用户知道进程名称。

停止脚本

如果您想停止脚本,请使用以下命令:

sudo kill "$(pgrep limit_use)"

但同样,您需要 sudo 密码才能执行此操作。




编辑

尽管上面的脚本应该提供一种合理安全的方法来限制应用程序的使用,正如@Bytecommander所提到的,但它超越,尽管不是很容易。结合下面的措施,这种情况发生的可能性很小,除非你的儿子知道设置,并且对 Linux/Ubuntu 非常有经验。

附加措施

虽然距离“简单的解决方案”稍远,但设置起来仍然不太困难的是额外的测量如下。如果我们的犯罪嫌疑人会发现该脚本是从 调用的/etc/rc.local,会设法成为 root,然后删除 中的行/etc/rc.local或者能够通过这种方式停止脚本,我们可以面对他的下一个问题:登录后屏幕变黑。此外,解决方案会在重启后 5 分钟检查后台脚本是否正在运行,如果没有,则屏幕变黑。

额外的措施是启动 - 检查该线是否/opt/limit/limit_use &存在/etc/rc.local5 分钟后检查脚本是否仍在运行。由于脚本从启动器(隐藏在启动应用程序中)运行,因此/etc/xdg/autostart很难找出发生了什么,除非你知道如何做到这一点。这两种措施的结合使得你的儿子不太可能发现,即使他发现了,可能也没有什么可以阻止他。

如何设置

涉及两个简单步骤:

  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将为所有用户启动一个应用程序(在本例中为额外的安全检查)。这可以可以在本地覆盖,但你必须知道检查运行。通过将行NoDisplay=true放入我们的启动器,它将不会在本地出现Startup Applications,因此如果不知道它存在,就不太可能被发现。

此外,您的儿子只有 15 秒的时间来找出答案(然后屏幕变黑),所以他会遇到严重的问题,除非他是个天才,对 Ubuntu 有丰富的经验并且有创造性的头脑。

答案2

从我自己的经验来看,限制孩子接触电脑游戏是教育孩子最困难的任务之一。当然,我们家长希望孩子主要将电脑用于学习,但这与孩子的意愿严重冲突。他们会恨我们只给他们可用于学习的硬件。

当然我们希望他们学会合理使用电脑,不仅要用电脑工作,还要用电脑休闲。这包括玩游戏和看视频。

不幸的是,维护良好,工作正常家长控制来限制孩子的计算几乎无法在 Ubuntu 上使用。另一个主要问题是,一旦聪明的孩子我们采取的所有措施都白费了。他们总会找到办法突破我们的限制,万一他们真的很聪明,我们甚至都还没注意到呢。

孩子电脑上运行的任何拦截软件或 PAM 限制都只是暂时的,迟早会很容易被克服。因此,我们决定让受密码保护的路由器来做这项工作,这样可以更轻松地控制物理访问。

因此,我们目前采取的措施在一定程度上限制了游戏,具体如下:

  • 与他们交谈教育他们如何以及何时使用电脑休闲,何时使用电脑学习。这是一个持续不断、相当乏味的过程,导致无休止的讨论和争论。但我们认为仅有的能够长期持续下去的事情。
  • 无管理员权限sudo在他们的账户上。这只是暂时的。我们知道他们迟早会加入这个团体。计划是他们会向我们提出要求,而不是躲起来。
  • 签订合同明确规定计算时间。他们需要知道他们可以使用计算机做什么以及多长时间。他们需要学习如何分配这段时间用于学习休闲。
  • 期间硬封锁所有互联网睡眠时间

为了便于我们和孩子履行计算机使用合同,我们设置了以下限制:

  • 使用密码保护路由器允许通过硬件(MAC)和时间表的组合来限制互联网访问。只要他们不知道 MAC 欺骗,这种方法就会很有效。它还会限制通过智能手机和平板电脑的访问。当然,如果您的邻居有一个开放的无线网络,这种方法就行不通了。
  • 安装SSH 服务器在孩子们的电脑上设置一个断电装置,以防他们迷失自己的意图。这是为紧急情况准备的,我们很高兴我们不需要太多。
  • 安装了一个DNS 黑名单(通过路由器,而不是计算机!)这应该阻止最坏情况的访问。

如果游戏需要互联网访问,阻止互联网访问将有效地禁用游戏,例如蒸汽我的世界或其他游戏服务器。但对于离线运行的游戏则无效。

答案3

这可以通过使用 shell 脚本来实现。

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 时终止第一个脚本。因此,当您的儿子Steam在 10:00 时运行时,他现在就可以播放该脚本。

第三个脚本是在另一个时间点重新启动第一个脚本,以便它Steam在一段时间间隔后终止,然后您的儿子将无法再玩游戏Steam

#!/bin/bash

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

exit 0

将其保存为/path/to/anyname3.sh并将其添加到启动应用程序列表中。

确保这些路径隐藏起来,以便您的儿子无法发现。

答案4

只是补充一下 Jacob Vlijm 的回答。他的解决方案是针对特定应用设置时间限制(每天 2 小时等)。只需在下面粘贴一些代码,供想要在特定时间段限制应用使用的人使用。(例如,上午 9 点到晚上 8 点禁止使用 VLC)。

您需要将脚本保存在某处,使其可执行并从 cron 每分钟运行它。

#!/usr/bin/python3

import subprocess
import datetime


# get current date, time and day
dt = datetime.datetime.now().astimezone()
day_integer = dt.weekday()

# limit use from 9 am onwards
start_time = datetime.time(9, 0, 0, 0)

# this is if you want to set different end times for different days
# 20 stands for 2000 or 8 pm. I've set 17 for 1700 or 5 pm for Sat
end_time_dict = {
                0 : 20,
                1 : 20,
                2 : 20,
                3 : 20,
                4 : 20,
                5 : 17,
                }

# add names of processes you want to limit below
app_list = [
            'vlc',
            ]

if day_integer != 6: # not a sunday. Use or !=5 if you want to add Sat too
    end_time_fragment = end_time_dict[day_integer]
    end_time = datetime.time(end_time_fragment, 0, 0, 0)

    if ((dt.time() >= start_time) and (dt.time() < end_time)):
        for app in app_list:
            try:
                pid = subprocess.check_output(["pgrep", app]).decode("utf-8").strip()
                subprocess.Popen(["kill", pid])
            except subprocess.CalledProcessError:
                pass

# below is line to add to cron script, this will run script every minute
# * * * * * cd /absolute/path/folder && /usr/bin/python3 ./limit_app_time.py

相关内容