如何阻止特定应用在特定帐户中打开

如何阻止某些应用程序在某些帐户上打开(例如:停止帐户John打开Firefox或Gimp)。 假设这是针对GUI而不是终端,并且仅适用于特定用户,因此例如用户X可以打开Gimp但不能打开Firefox,用户Z可以打开软件中心但不能打开VirtualBox。

对于Ubuntu的新用户来说,有什么好的和简单的方法呢。

A.配置选项

如果该块旨在阻止不那么有经验的用户使用某些应用程序,则编辑(本地副本)应用程序的桌面文件(如[1] )可能是最快速和最简单的方法。
可以做一些额外的事情来创建额外的障碍和/或防止用户太容易发现我们阻止应用程序所做的事实( [2][3] )。

该设置不适合有经验的用户无人值守的情况。 在普通用户的“家庭”情况下,在许多情况下就足够了。

1.通过编辑.desktop文件(本地版本)来阻止gedit的示例

  • /usr/share/applications的应用程序桌面文件复制到~/.local/share/applications

     cp /usr/share/applications/gedit.desktop ~/.local/share/applications/gedit.desktop 
  • 编辑文件:用gedit打开它(你还可以:))将它拖到一个打开的gedit窗口上。

    • 更换线

       Exec=gedit %U 

      通过:

       Exec=zenity --info --text 'You are not allowed to use this application' 
    • 删除(可能的)快捷方式,以防止从其中一个快捷方式启动应用程序:

      删除该行(对于gedit示例):

       Actions=Window;Document; 

      和以下部分:

       [Desktop Action Window] Name=Open a New Window Exec=gedit --new-window OnlyShowIn=Unity; 

    从那时起(注销/登录后),如果用户尝试从Dash打开gedit,或者尝试打开链接到应用程序的文件,用户将看到此消息:

    在此处输入图像描述

    • 隐藏Dash中的应用程序(可选措施)

      完成上述更改后,如果gedit.desktop文件仍然打开,我们可以添加一行:

       NoDisplay=true 

      通过添加此行, gedit甚至不会显示在Dash中。

    解开

    要撤消,只需从~/.local/share/applications删除本地.desktop文件

找出它有点困难

在编辑.desktop文件后,应用程序不再显示在Dash中,Dash 搜索仍会显示我们新创建的gedit.desktop文件,这可能会无意中提示如何转义应用程序块。

在此处输入图像描述

为避免这种情况,我们应该从Dash搜索中排除目录~/.local/share/applications并清除搜索历史记录。
打开系统设置>“安全和隐私”>“文件和应用程序”(选项卡)。 将目录~/.local/share/applications到列表中以从搜索中排除。

在此处输入图像描述

3.(不)使用终端/命令行

重定向gedit命令(1)

编辑.desktop文件会阻止使用Dash中的应用程序,但如果用户知道Alt F2组合和运行应用程序的命令,他或她仍然可以启动应用程序,就像使用终端一样。 一个好的,易于设置的额外措施是创建(如果它还不存在)目录~/bin并在目录中创建一个小脚本:

 #!/bin/bash zenity --info --text 'You are not allowed to use this application' 

使其可执行并在应用程序后命名; 在这种情况下gedit

由于~/binPATH ,运行该命令将调用脚本而不是“真正的” gedit应用程序。 因此,同样You are not allowed to use this application – 将出现消息

重定向gedit命令(2)

重定向应用程序命令的另一种方法(效果更有限,请参阅注释)是为.bashrc文件添加别名:

 gedit ~/.bashrc 

添加行(gedit示例):

 alias gedit='zenity --info --text "You are not allowed to use this application"' 

注意 :这仅用作额外的度量,因为它只能防止从终端直接调用应用程序。 但是,双击(例如) .txt文件仍将打开该应用程序。

完全使用终端很困难或根本不可能

为防止使用终端,您也可以在[1]gnome-terminal.desktop文件中执行相同的操作,和/或更改默认快捷键组合以运行终端(系统设置>“键盘” >“快捷方式”>“初学者”)


4.一个小工具,用于自动创建(或撤消) .desktop文件的编辑版本(如1.)

如果您使用参数blockunblock运行下面的脚本(您必须使用其中任何一个运行它),您将看到一个包含(全局)桌面文件的列表,代表您已安装的应用程序:

在此处输入图像描述

选择一个,您的应用程序将被阻止或取消阻止,具体取决于您运行它的参数。

注意

您可能必须注销/登录才能使其正常工作。

剧本

 #!/usr/bin/env python3 import os import shutil import sys mode = sys.argv[1] home = os.environ["HOME"] global_dir = "/usr/share/applications/" files = [file for file in os.listdir(global_dir) if file.endswith(".desktop")] relevant = [] for i in range(len(files)): file = files[i] with open(global_dir+file) as src: text = src.read() if not "NoDisplay=true" in text: relevant.append((file)) for i in range (len(relevant)): print(str(i+1)+".", relevant[i]) choice = int(input("\nplease enter the number of the corresponding .desktop file: ")) filename = relevant[choice-1] local_file = home+"/"+".local/share/applications/"+filename global_file = global_dir+filename def block_application(filename): if not os.path.exists(local_file): shutil.copyfile(global_file, local_file) with open(local_file) as src: lines = src.readlines() shortcuts_section = [i for i in range(len(lines)) if lines[i].startswith("Actions=")] if len(shortcuts_section) != 0: lines = lines[:shortcuts_section[0]] command = [i for i in range(len(lines)) if lines[i].startswith("Exec=")] if len(command) != 0: lines[command[0]] = 'Exec=zenity --info --text "You are not allowed to use this application"\n' with open(local_file, "wt") as out: for line in lines: out.write(line) if mode == "block": block_application(filename) elif mode == "unblock": os.remove(local_file) 

将脚本复制到空文件中,将其另存为block_apps.py并通过以下任一方式运行:

 python3 /path/to/block_apps.py block 

要么

 python3 /path/to/block_apps.py unblock 

B.脚本选项

阻止某些应用程序也可以通过在后台运行脚本来完成。 如果运行“禁止”应用程序之一,则脚本必须采取某些操作。

1.使用禁用应用程序时操作屏幕的脚本。

下面的脚本提供了一种阻止用户定义应用程序的灵活方法。 它运行一个简单的命令,禁止的应用程序作为参数,例如(假设您使脚本可执行):

  /path/to/block_apps.py firefox gedit gnome-terminal 

阻止这样的应用程序的优点是它很灵活; 即使在一个帐户中,也可以使用不同的设置,只需使用其他应用程序作为参数。

它能做什么

通过取消评论其中一条线:

 # action = "xrandr --output "+screen+" --brightness 0" 

要么

 # action = "xrandr --output "+screen+" --rotate inverted" 

该脚本要么:

黑屏( action = "xrandr --output "+screen+" --brightness 0" ):

在此处输入图像描述

或者将其颠倒( action = "xrandr --output "+screen+" --rotate inverted" ):
谁说Unity不允许将发射器放在右边?

在此处输入图像描述

剧本

 #!/usr/bin/env python3 import subprocess import getpass import sys import time applications = [] i = 1 while True: try: applications.append(sys.argv[i]) i = i+1 except IndexError: break cmd1 = "xrandr" get = subprocess.check_output(["/bin/bash", "-c", cmd1]).decode("utf-8").split() screen = [get[i-1] for i in range(len(get)) if get[i] == "connected"][0] #-- uncomment (only) one of the options below # action = "xrandr --output "+screen+" --brightness 0" action = "xrandr --output "+screen+" --rotate inverted" #-- while True: cmd2 = "ps -u "+getpass.getuser() applist = subprocess.check_output(["/bin/bash", "-c", cmd2]).decode("utf-8") for application in applications: if application in applist: subprocess.Popen(["/bin/bash", "-c", action]) time.sleep(5) 

如何使用

  • 将脚本复制到空文件中,将其另存为block_apps.py ,使其可执行
  • 通过命令运行它:

     /path/to/block_apps.py    etc... 
  • 重要
    block_apps.py脚本并恢复“正常”设置,请使用下面的脚本(使其在快捷键组合下可用):

 #!/usr/bin/env python3 import subprocess cmd = "ps -ef | grep block_apps.py" run = subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").split("\n") match = [line for line in run if "block_apps.py" in line] command = "kill "+match[0].split()[1] subprocess.Popen(["/bin/bash", "-c", command]) cmd1 = "xrandr" get = subprocess.check_output(["/bin/bash", "-c", cmd1]).decode("utf-8").split() screen = [get[i-1] for i in range(len(get)) if get[i] == "connected"][0] restore_1 = "xrandr --output "+screen+" --brightness 1" restore_2 = "xrandr --output "+screen+" --rotate normal" for item in [restore_1, restore_2]: subprocess.Popen(["/bin/bash", "-c", item]) 

与脚本一样,将其复制到空文件中,将其保存为kill_blockapps.py ,使其可执行并通过以下方式运行:

 /path/to/kill_blockapps.py 

您可能希望在快捷键下使用此选项:选择:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。 单击“+”并添加如上所示的命令。