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


13

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

对于Ubuntu的新用户,有什么简便的方法。


将ACL放在特定文件上?
mdpc

所需的安全级别是多少?将在这里出现是可用的答案:askubuntu.com/questions/447043/...
雅各布Vlijm

目前,安全级别是最低的。仅需要拒绝用户(以任何方式)访问任何类型的应用程序。我猜这些用户对Linux的了解很少,也许永远不会使用该终端,但是您可以添加有关它的任何信息。
Luis Alvarado 2014年

我还不了解实际要执行的操作,但是也许您可以将所有关键应用程序设置为只能由一组用户访问。然后,您可以将高级用户添加到该组以进行完全访问。对于受限用户,您可以使用sudo(而不是root用户)以及sudoers中的适当条目,以根据情况为他们提供对其他命令的密码保护访问。
2014年

我想这就是AppArmor的目的,但我认为这并不适合“简单”的方式。
大师

Answers:


15

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在这种情况下。

由于~/binin中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"): (
谁说团结不允许把发射器在右边

在此处输入图片说明

剧本

#!/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

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


伟大的杰克。极好的答案。继续改进它。
路易斯·阿尔瓦拉多

@EricCarvalho感谢您的编辑!想念那个。
Jacob Vlijm 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.