如何限制或限制对应用程序的访问?
我的儿子在过去的圣诞节收到了一台新的笔记本电脑,主要是为了在他的新学校使用……现在他有自己的笔记本电脑,他已经开始安装Steam了。
但妻子要我删除Steam,因为笔记本电脑主要供学校使用……如果我不需要,我宁愿不这样做。
有没有办法限制或以其他方式限制对Steam的访问? 也许是Steam本身的密码,或设置它可以运行的时间?
理想情况下 ,它必须是一个非常简单易用的东西,因为我的工作经常让我远离家乡(和电脑,电信和…)很长一段时间,而我的妻子不像我一样对电脑感到舒服,更容易使用是远,更好。
当然有可以实现这一任务的东西吗?
设置流程或应用程序的时间限制
使用小的后台脚本,您可以设置进程或应用程序的时间限制。
只要您的用户不知道管理员的密码 ,就不会太容易超越。
以下解决方案
是这么小的背景脚本。 它将每天的使用量限制为定义的分钟数,以便在脚本的头部设置。 一旦设置(这不是太困难),它运行起来非常简单,之后不需要额外的操作。
剧本
#!/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
如何使用
- 在桌面(或其他任何位置)上,创建名为:
limit
的文件夹 - 将脚本复制到一个空文件中,将其保存为文件夹中的
limit_use
(无扩展名)并使其可执行 -
在脚本的头部编辑要限制的进程名称,以及允许的最大分钟数。 在示例中:
#--- set the time limit below (minutes) minutes = 1 #--- set the process name to limit below app = "gedit"
-
将文件夹复制到目录
/opt
:cp -r /path/to/limit /opt
-
现在编辑
/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.local
是否存在/opt/limit/limit_use &
,如果脚本仍然运行则在5分钟后进行检查。 由于脚本从/etc/xdg/autostart
的(从启动应用程序中隐藏)启动器运行,因此很难找到发生的情况,除非您知道它是如何完成的。 这两项措施的结合使你的儿子不太可能发现,如果他这样做,可能没有什么能阻止他。
如何设置
涉及两个简单的步骤:
-
将下面的代码复制到一个空文件中,将其保存为桌面上的
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
-
将下面的脚本复制到一个空文件中,将其保存为桌面上的
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经验和创造性思维。
根据我自己的经验,限制访问电脑游戏是教育孩子最具挑战性的任务之一。 当然,我们父母希望他们主要用于学校使用他们的电脑,但这与孩子的意图严重冲突。 他们会讨厌我们为他们提供仅供学校使用的硬件。
当然,我们也希望他们学习如何以合理的方式使用他们的计算机,包括如何使用它不仅用于工作,还用于休闲。 这包括游戏和观看video。
不幸的是,维护良好且工作良好的父母控制来限制孩子的计算几乎不适用于Ubuntu。 另一个主要问题是,只要他们是聪明的孩子,我们采取的所有措施都会徒劳无功。 他们总能找到克服我们限制的方法,以防他们真的很聪明而我们甚至无法注意到。
在孩子的计算机上运行的任何阻止软件或PAM限制只是暂时的,并且可能迟早会很容易克服。 因此,我们决定让受密码保护的路由器完成工作,可以更轻松地控制物理访问。
所以我们在这里做的有点限制游戏的是以下所有的组合:
- 与他们交谈,教育他们如何以及何时使用电脑休闲,以及何时将它们用于学校。 这是一个持续不断的,相当乏味的过程,导致无休止的讨论和争论。 但这是我们认为唯一能够持久的东西。
- 他们的帐户没有管理员权限 。 这是暂时的。 我们知道他们迟早会把自己放在
sudo
小组中。 计划是他们会问我们这个而不是隐藏它。 - 签订明确定义的计算时间的合同 。 他们需要知道允许他们使用机器的时间和持续时间。 他们需要学习如何将这段时间用于学校和休闲。
- 在睡眠时间内阻止所有互联网。
为了轻松履行儿童和我们的计算机使用合同,我们安装了以下限制:
- 使用受密码保护的路由器 ,允许在硬件(MAC)和时间表的基础上限制Internet访问。 只要他们不知道MAC欺骗,这将非常有效。 它还将通过智能手机和平板电脑限制访问。 如果您附近有一个开放的无线网络,这当然不会起作用。
- 在孩子的计算机上安装SSH服务器 ,以便在他们自己的意图迷失的情况下拔掉插头。 这是紧急情况,我们很高兴我们不需要太多。
- 安装了DNS黑名单 (通过路由器,而不是计算机!),这应该阻止访问最坏的情况。
如果该游戏需要互联网访问,如Steam , Minecraft或其他gamig服务器,阻止互联网访问将有效地禁用游戏。 但是对离线游戏没有任何影响。
这可以通过使用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时终止第一个脚本。 所以,当你的儿子在10:00运行Steam
时。 他现在可以玩了。
第三个脚本是在另一个时间点重新启动第一个脚本,以便在一段时间后杀死Steam
,你的儿子将无法再通过Steam
玩游戏了。
#!/bin/bash echo "bash /path/to/anyname.sh" | at 12:00 exit 0
将其另存为/path/to/anyname3.sh
并将其添加到启动应用程序列表中。
确保隐藏这些路径,以便你的儿子不会发现。
为什么不使用新的用户帐户 (通过系统设置 )。 这是Linux上唯一一种用于“权限”的方法。
- 新用户“SteamUser”不应该是sudoers(只是一个有限的帐户)。
- 然后创建名为“SuperAdmin”的第二个帐户并将其设为sudoers帐户(root访问权限)。 但只保留密码。
- 然后从sudoers中删除你儿子的帐户。 (
sudo
集团)。 然后,此帐户将不具有root访问权限,它将无法安装或删除软件,更改系统范围的设置。 - 登录到您的“SuperAdmin”帐户并更改Steam二进制文件和Steam游戏文件夹的所有权,以防止除“SteamUser”之外的任何人运行它们。 这包括删除除“SteamUser”之外的任何人的读写+执行访问权限
几个笔记..
- 使用您儿子的帐户留下root权限是没有用的,否则使用chown / chmod可以轻松绕过权限控制。
- 基于后台脚本的其他建议只是不稳定的混乱。 这意味着他们没有前途。 但是,它们很容易设置。
- 传输到“SteamAccount”的文件夹路径是:
/home/son/.steam
,当然还有二进制文件/usr/games/steam
- 要玩蒸汽,需要“SteamUser”密码(您需要使用“SteamUser”登录并运行蒸汽。您可以尝试寻找方法,在锁定后一段时间后使会话过期,以防止播放时间过长。我是不确定是否有类似的工具,但技术上可以设置时间限制,但对于会话,而不是程序。