如何阻止某些应用程序在某些帐户上打开(例如:阻止帐户 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所示)
如果你使用参数block
或unblock
(你必须使用其中任一个运行它),你将看到一个包含(全局)桌面文件的列表,代表你安装的应用程序:
选择一个,您的应用程序将被阻止或解除阻止,具体取决于您运行它时使用的参数。
笔记
您可能需要注销/登录才能使其正常工作。
剧本
#!/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
您可能希望将其放在快捷键下:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并添加上述命令。