Как заблокировать открытие определенных приложений в определенных аккаунтах

Как заблокировать определенные приложения от открытия на определенных счетах (например: Остановить учетную запись Джона при открытии 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

Возможно, вы захотите, чтобы это было под сочетанием клавиш: Выберите: "Системные настройки" > "Клавиатура" > "Ярлыки" > "Пользовательские ярлыки". Нажмите "+" и добавьте команду, как указано выше.

Другие вопросы по тегам