排除用户使用系统范围内安装的程序

排除用户使用系统范围内安装的程序

我最近创建了一个新用户。我想允许此用户仅使用一两个程序,但我系统内安装了许多应用程序。有没有一种简单的方法可以排除特定用户使用应用程序(无需重新安装所有内容)?

答案1

您可以采取以下措施来限制用户本地使用定义的应用程序。它们不适合(也不适合)无人值守使用,例如在公共场所,但确实会创建一个可用的受限桌面。它主要是组合措施,使得绕过变得更加困难。此外如果如果有人设法启动“禁止”的应用程序,它将被记录下来。

答案有点太详细了。设置并不复杂,有两个脚本可以帮你完成。

存在什么设置

  • 通过使用脚本编辑本地桌面文件,使所选软件无法从界面上使用(见下文)
  • 使终端只能通过密码使用,因此从终端运行应用程序变得更加困难。
  • 更改打开终端的默认组合键,而不是ctrlaltt
  • 记录您定义的软件“黑名单”的使用情况,以防某些聪明的用户可能超越您的设置

如何设置

设置界面上无法提供的多种软件选择。

  • 登录您想要限制的用户账户
  • 创建一个(临时)文件夹(无论在哪里,例如在桌面上)来编辑一些文件。
  • 浏览目录/usr/share/applications选择您希望用户排除的所有应用程序(桌面文件)(不要不看就选择所有应用程序,其中一些对于设置您的桌面是必需的)
  • 将这些桌面文件复制到您创建的临时目录中,以进行批量编辑。
  • 复制以下文本,粘贴到一个空文件中,并将其保存在与 相同的临时文件夹中no_openapp.py
  • CD 进入目录(!)并使用命令运行它:python3 no_openapp.py

该脚本做了几件事:

1] 创建命令黑名单(供以后使用,见下文)2] 编辑桌面文件以显示消息而不是运行应用程序。如果您将桌面文件移动到~/.local/share/applications,下次登录时应用程序将不会从 Unity 或 Dash 运行。

#!/usr/bin/python3

import os
import getpass
import subprocess


desktopfile_dir = os.getcwd()
file_list = os.listdir(os.getcwd())
edit_subjects = [desktopfile_dir+"/"+item for item in file_list]

def create_blacklist():
    command_list = []
    for item in edit_subjects:
        with open(item) as blacklist_source:
            searchlines = blacklist_source.readlines()
        try:
            native_command = [
                line for line in searchlines if line.startswith("Exec=")
                ][0].replace("Exec=", "").replace("\n", "")
            cleaned_command = native_command.split(" ")[0]
            command_list.append(cleaned_command)
        except IndexError:
            pass

    with open(desktopfile_dir+"/blacklist.txt", "wt") as created_blacklist:
        created_blacklist.write(str(command_list))

def make_unavailable():
    for item in edit_subjects:
        try:
            with open(item, "r") as make_unav:
                lines = make_unav.readlines()
                line_range = range(0, len(lines))
                for index in line_range:
                    if lines[index].startswith("Exec="):
                        lines[index] = 'Exec=zenity --info --text="You are not allowed to use this application"\n'
                    else:
                        pass
            with open(item, "wt") as make_unav:
                for line in lines:
                    make_unav.write(line)
        except (IsADirectoryError, IndexError, PermissionError):
            pass


create_blacklist()
make_unavailable()

限制终端的使用

  • 使用密码使终端可访问,例如这个帖子
  • 如果用户熟悉 的组合键ctrlaltt,请更改默认组合键:

    系统>首选项>键盘快捷键>组合键(选项卡)。

万一有小鬼绕过你的措施,抓住他

  • 如果用户设法运行被禁止的应用程序,请务必抓住他。为此,我们使用在第一步中创建的黑名单。
  • 在隐藏位置创建一个文件夹。将第一步中创建的“blacklist.txt”复制到该目录中。
  • 复制以下文本,粘贴到一个空的文本文件中,并将其保存到与黑名单相同的目录中processes.py
  • 打开一个终端窗口,输入crontab -e。将以下行添加到 crontab 文件:

    * * * * * cd /path/to/script; python3 processes.py

黑名单是进程名称的列表。脚本每分钟检查一次黑名单上的某个应用程序是否正在运行,并将记录保存在日志文件中(与脚本所在的目录相同)。日志文件的名称是 log.txt。或者,您可以让脚本终止被禁止的应用程序(不是默认的)。要使其终止应用程序,请将行更改kill_apps = "no"kill_apps = "yes"(在脚本的头部部分)。

#!/usr/bin/python3

import os
import datetime
import subprocess
import getpass

curr_dir = os.getcwd()
curruser = getpass.getuser()

# should forbidden applications be killed?
kill_apps = "yes"

def produce_commands_ofapp():
    with open(curr_dir+"/blacklist.txt", "r") as blacklist:
        blacklist = eval(blacklist.read())
    return blacklist

def createlist_runningprocs():
    processesb = subprocess.Popen(["ps", "-u", curruser], stdout=subprocess.PIPE)
    process_listb = (processesb.communicate()[0].decode("utf-8")).split("\n")
    return process_listb

def runsornot():
    check_blacklist = produce_commands_ofapp()
    runningprocs_list = createlist_runningprocs()
    found_matches = [item for item in check_blacklist
                       if item[:15] in str(runningprocs_list)]
    if len(found_matches) != 0:
        with open(curr_dir+"/log.txt", "a+") as logfile:
            logfile.write(str(found_matches)+" "+str(datetime.datetime.now())+"\n")
    else:
        pass
    if kill_apps == "yes":
        for application in found_matches:
            kill_forbidden(application)
    else:
        pass

def kill_forbidden(app_command):
    # get the pid length of system
    get_size = subprocess.Popen(
        ["cat", "/proc/sys/kernel/pid_max"],
        stdout=subprocess.PIPE
        )
    size = len((get_size.communicate()[0].decode("utf-8")).replace("\n", ""))
    # get the appropriate pid line & pid
    process_list = createlist_runningprocs()
    appr_pid = [
        line for line in process_list if \
        app_command[:15] in line][0][:size+1].replace(" ", "")
    # kill the found process
    subprocess.Popen(["kill", "-9", appr_pid])

runsornot()

如上所述,该设置可以被绕过。但是,这些措施的组合以及您必须知道它们是什么的事实使其成为一种合理的防御措施,以防普通用户对如何操纵系统具有一般知识。

答案2

感谢您的回答。我已经通过操纵程序 bin 文件的权限来实现这一点。我安装了旧的 gnome 用户管理工具,它允许管理组。取消选中不允许打开某些程序的用户的组游戏。然后更改了 bin 文件的组和权限:

sudo chgrp 游戏/路径/到/游戏

sudo chmod 750 /path/to/game

现在用户可以在 Dash 中看到桌面文件,但是点击后它们不会运行。

问候

答案3

这非常非常困难。我从未见过任何设置能做到这一点,而且大多数时候,当人们需要这样做时,我能够提供更好的解决方案,因为一开始就没有必要限制用户——他们只是不知道 Ubuntu 还有什么其他选择。

但是,您可以通过在运行 Xspice 的 lxc 容器中运行整个用户会话来实现这一点,而该容器中根本没有安装任何其他应用程序。这将是一个相当大的项目,但如果它能正常工作,那么它可能是您可以获得的最佳隔离。这个想法基于 Serge Hallyn 最近在 Planet Ubuntu 上发现的一篇博客文章,您一定会想读一读:http://s3hh.wordpress.com/2014/04/18/xspice-in-containers/

它很复杂,基于尚未发布的新技术,我不知道有谁真正尝试过将其用于此类目的 - 但从理论上讲,它应该可行。:)

我当然会建议您研究其他方法来实现您的真正目标,而这很可能实际上并不是阻止使用应用程序,而是其他东西。

相关内容