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

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

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

对于 Ubuntu 新用户来说,有什么好的、简单的方法可以做到这一点?

答案1

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 中。

    撤消

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

2. 让发现变得更加困难

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

在此处输入图片描述

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

在此处输入图片描述

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

重定向gedit命令(1)

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

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

使其可执行,并以应用程序的名字命名;gedit在本例中。

由于~/bin在 中PATH,运行该命令将调用脚本而不是“真实”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但是,双击(例如)文件仍会打开应用程序。

使终端的使用变得困难或根本不可能

为了防止使用终端,您也可以对gnome-terminal.desktop- 文件执行与 中相同的技巧[1],和/或更改运行终端的默认快捷键组合(系统设置 > “键盘” > “快捷方式” > “启动器”)


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 <application_1> <application_2> <application_3> 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

您可能希望将其放在快捷键下:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并添加上述命令。

相关内容