Как заблокировать открытие определенных приложений в определенных аккаунтах
Как заблокировать определенные приложения от открытия на определенных счетах (например: Остановить учетную запись Джона при открытии Firefox или Gimp). Предполагается, что это для графического интерфейса, а не для терминала, и будет применяться только для определенных пользователей, поэтому, например, пользователь X может открывать Gimp, но не Firefox, пользователь Z может открывать Центр программного обеспечения, но не VirtualBox.
Какой хороший и простой способ сделать это для нового пользователя Ubuntu.
1 ответ
А. Варианты конфигурации
Если блокировка предназначена для блокировки неопытных пользователей от использования определенных приложений, отредактируйте (локальную копию) файл рабочего стола приложения (как описано в [1]
), вероятно, самый быстрый и простой способ.
Некоторые дополнительные действия могут быть сделаны для создания дополнительного барьера и / или предотвращения того факта, что пользователь слишком легко узнает, что мы сделали, чтобы заблокировать приложение ([2]
а также [3]
).
Установка не подходит для ситуаций, в которых не принимают участия опытные пользователи. В "домашних" ситуациях со средними пользователями этого будет достаточно во многих случаях.
1. Пример блокировки gedit путем редактирования (локальной версии) файла.desktop.
Скопируйте файл рабочего стола приложения в
/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;
С этого момента (после выхода из системы / входа в систему) пользователь увидит это сообщение, если попытается открыть gedit из Dash или попытается открыть файл, связанный с приложением:
Скрытие приложения от Dash (необязательная мера)
После того, как мы внесли изменения выше, имея
gedit.desktop
файл еще открыт, мы можем добавить дополнительную строку:NoDisplay=true
Добавив эту строку,
gedit
даже не появится в Dash.
расстегивать
Чтобы отменить, просто удалите местный
.desktop
файл из~/.local/share/applications
2. Делать это немного сложнее, чтобы узнать
Хотя после редактирования .desktop
файл, приложение больше не будет отображаться в Dash, поиск Dash все равно покажет наш недавно созданный gedit.desktop
файл, который может непреднамеренно дать подсказку, как выйти из блока приложения.
Чтобы избежать этого, мы должны исключить каталог ~/.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
в этом случае.
поскольку ~/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
Возможно, вы захотите, чтобы это было под сочетанием клавиш: Выберите: "Системные настройки" > "Клавиатура" > "Ярлыки" > "Пользовательские ярлыки". Нажмите "+" и добавьте команду, как указано выше.