如何阻止某些应用程序在某些帐户上打开(例如:阻止帐户John打开Firefox或Gimp)。假定这是针对GUI的,而不是针对终端的,并且仅适用于特定用户,因此,例如,用户X可以打开Gimp但不能打开Firefox,用户Z可以打开Software Center但不能打开VirtualBox。
对于Ubuntu的新用户,有什么简便的方法。
如何阻止某些应用程序在某些帐户上打开(例如:阻止帐户John打开Firefox或Gimp)。假定这是针对GUI的,而不是针对终端的,并且仅适用于特定用户,因此,例如,用户X可以打开Gimp但不能打开Firefox,用户Z可以打开Software Center但不能打开VirtualBox。
对于Ubuntu的新用户,有什么简便的方法。
Answers:
如果该阻止是为了阻止不太有经验的用户使用某些应用程序,则编辑该应用程序的桌面文件(如所述)的本地副本(如中所述[1]
)可能是最快,最简单的方法。
可以做一些额外的事情来创建额外的障碍和/或防止用户过于容易地发现我们为阻止应用程序([2]
和[3]
)所做的事情。
该设置不适用于有经验用户的无人值守情况。在普通用户的“家庭”情况下,在许多情况下就足够了。
将应用程序的桌面文件复制/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
虽然在编辑.desktop
文件后,该应用程序将不再显示在Dash中,但Dash 搜索仍将显示我们新创建的gedit.desktop
文件,这可能无意中提示了如何逃避应用程序块。
为了避免这种情况,我们应该~/.local/share/applications
从Dash搜索中排除该目录,并清除搜索历史记录。
打开系统设置>“安全和隐私”>“文件和应用程序”(选项卡)。将目录添加~/.local/share/applications
到列表以从搜索中排除。
重定向gedit
命令(1)
编辑.desktop
文件会阻止从Dash使用应用程序,但是如果用户知道AltF2组合信息和运行应用程序的命令,则他或她将仍然能够像在终端上一样启动应用程序。一个容易设置的好方法是创建目录(如果尚不存在),~/bin
并在目录中创建一个小脚本:
#!/bin/bash
zenity --info --text 'You are not allowed to use this application'
使它可执行并以应用程序命名。gedit
在这种情况下。
由于~/bin
in中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]
,和/或更改默认的快捷键组合以运行终端(“系统设置”>“键盘”>“快捷方式”>“启动器” )
.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
阻止某些应用程序也可以通过在后台运行脚本来完成。如果运行“禁止”应用程序之一,则脚本必须采取某些措施。
下面的脚本提供了一种阻止用户定义的应用程序的灵活方法。它以一个简单的命令运行,以禁止的应用程序作为参数,例如(假设您使脚本可执行):
/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
您可能希望在快捷键下使用此选项:选择:“系统设置”>“键盘”>“快捷方式”>“自定义快捷方式”。单击“ +”并添加上面的命令。