AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 726544
Accepted
Gregory Opera
Gregory Opera
Asked: 2016-01-28 22:39:39 +0800 CST2016-01-28 22:39:39 +0800 CST 2016-01-28 22:39:39 +0800 CST

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

  • 772

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

但是妻子要我删除 Steam,因为笔记本电脑主要是供学校使用的……如果我不必这样做,我宁愿不这样做。

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

理想情况下,它必须是非常易于使用的东西,因为我的工作经常让我长时间远离家(和电脑、电信和......),而我的妻子对电脑不像我那么舒服,更容易使用远,好得多。

肯定有什么东西可以完成这项任务吗?

command-line
  • 4 4 个回答
  • 6525 Views

4 个回答

  • Voted
  1. Takkat
    2016-01-29T01:14:25+08:002016-01-29T01:14:25+08:00

    根据我自己的经验,限制对电脑游戏的访问是教育我们孩子的最具挑战性的任务之一。当然,我们父母希望他们主要将计算机用于学校,但这与孩子的意图严重冲突。他们会恨我们给他们只用于学校的硬件。

    当然,我们也希望他们学习如何以明智的方式使用他们的计算机,包括如何将其用于工作和休闲。这包括游戏和观看视频。

    不幸的是, Ubuntu 几乎无法使用维护良好且有效的家长控制来限制孩子的计算。另一个主要问题是,一旦他们是聪明的孩子,我们采取的所有措施都是徒劳的。他们总会想办法克服我们的限制,以防他们真的很聪明,我们甚至都无法注意到。

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

    因此,我们目前在某种程度上限制游戏的做法是结合以下所有内容:

    • 与他们交谈,教育他们如何以及何时使用电脑进行休闲,以及何时使用电脑上学。这是一个不断进行的、相当乏味的过程,会导致无休止的讨论和争论。但这是我们认为唯一能长期持续的东西。
    • 他们的帐户没有管理员权限。这是暂时的事情。sudo我们确实知道,他们迟早能够将自己加入团队中。计划是他们会要求我们这样做,而不是隐藏起来。
    • 为明确定义的计算时间签订合同。他们需要知道他们被允许使用机器的时间和时间。他们需要学习如何分配这段时间上学和休闲。
    • 在睡眠时间硬阻止所有互联网。

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

    • 使用受密码保护的路由器,允许结合硬件 (MAC) 和时间表限制互联网访问。只要他们不了解 MAC 欺骗,这将非常有效。它还将限制通过他们的智能手机和平板电脑访问。如果您附近有开放的无线网络,这当然行不通。
    • 在孩子的计算机上安装一个SSH 服务器,以防他们迷失在自己的意图中。这是针对紧急情况的,我们很高兴我们不需要太多。
    • 安装了一个DNS 黑名单(通过路由器,而不是计算机!),它应该阻止访问最坏的情况。

    如果游戏需要 Internet 访问(例如Steam、Minecraft或其他 gamig 服务器),则阻止 Internet 访问将有效地禁用游戏。但是,它对离线运行的游戏没有影响。

    • 4
  2. Best Answer
    Jacob Vlijm
    2016-01-29T08:37:05+08:002016-01-29T08:37:05+08:00

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

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

    下面的解决方案

    就是这么小的后台脚本。它将每天的使用限制为定义的分钟数,以在脚本的头部设置。一旦设置(这不是太难),它运行起来非常容易,之后不需要额外的操作。

    剧本

    #!/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.local,并在 5 分钟后检查脚本是否仍在运行。由于脚本是从(从启动应用程序中隐藏的)启动器运行的,/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 经验和创造性思维。

    • 3
  3. Raphael
    2016-01-28T23:31:11+08:002016-01-28T23:31:11+08:00

    这可以通过使用 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并将其添加到您的启动应用程序列表中。

    确保隐藏这些路径,以免您的儿子发现。

    • 0
  4. Croll
    2016-01-29T11:39:33+08:002016-01-29T11:39:33+08:00

    为什么不使用新的用户帐户(通过系统设置)。这是 Linux 上唯一一种用于“权限”的方法。

    1. 新用户“SteamUser”不应该在 sudoers 中(只是一个有限的帐户)。
    2. 然后创建名为“SuperAdmin”的第二个帐户并将其设为 sudoers 帐户(root 访问权限)。但只保留它的密码。
    3. 然后从 sudoers 中删除您儿子的帐户。(sudo组)。然后此帐户将没有 root 访问权限,将无法安装或删除软件,更改系统范围的设置。
    4. 登录到您的“SuperAdmin”帐户并更改Steam 二进制文件和Steam 游戏文件夹的所有权,以防止它们被“SteamUser”以外的任何人运行。这包括删除除“SteamUser”之外的任何人的读+写+执行权限

    几点注释..

    • 无法使用您儿子的帐户保留 root 访问权限,否则使用 chown/chmod 可以轻松绕过权限控制。
    • 基于后台脚本的其他建议只是不稳定的混乱。这意味着他们没有希望。但是,它们可能很容易设置。
    • 传输到“SteamAccount”的文件夹路径是:/home/son/.steam当然还有二进制文件/usr/games/steam
    • 要玩steam,需要“SteamUser”密码(您需要使用“SteamUser”登录并运行steam。您可以尝试寻找锁定一段时间后过期会话的方法,以防止播放时间过长。我是不确定是否有类似的工具,但在技术上可以设置时间限制,但对于会话,而不是程序。
    • 0

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve