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

Как заблокировать определенные приложения от открытия на определенных учетных записях (например: Остановитесь считают John от открытия Firefox или Gimp). Предполагается, что это для GUI а не терминала и только относилось бы к определенным пользователям, таким образом, например, пользователь X может открыть Gimp, но не Firefox, пользователь Z может открыть Software Center, но не VirtualBox.

Что хороший и простой способ там, чтобы сделать это для нового пользователя Ubuntu.

13
задан 12 November 2014 в 05:47

1 ответ

A. Конфигурационные опции

Если блок предназначен для блокирования not-so-experienced пользователей от использования определенных приложений, редактируя (локальная копия) файл на рабочем столе приложения (как описано в [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 от Тире или попытается открыть файл, который связан с приложением:

    enter image description here

    • Сокрытие приложения от Тире (дополнительная мера)

      После того, как мы внесли изменения выше, имея gedit.desktop файл все еще открывается, мы можем добавить дополнительную строку:

      NoDisplay=true
      

      Путем добавления этой строки, gedit даже не обнаружится в Тире.

    Undo

    Для отмены просто удалите локальное .desktop файл от ~/.local/share/applications

2. Создание его немного более трудный узнать

В то время как, после редактирования .desktop файл, приложение не будет больше обнаруживаться в Тире, поиск Тире все еще покажет наш недавно созданный gedit.desktop файл, который мог бы неумышленно дать подсказку, как выйти из блока приложений.

enter image description here

Избегать, чтобы, мы исключили каталог ~/.local/share/applications от Тире ищут и очищают историю поиска.
Настройки Открытой системы> "безопасность и Конфиденциальность"> "Файлы и Приложения" (вкладка). Добавьте каталог ~/.local/share/applications к списку для исключения из поиска.

enter image description here

3. (Не) использование терминала / командная строка

Перенаправление gedit команда (1)

Редактирование .desktop файл предотвращает использование приложения от Тире, но если пользователь будет знать, что AltF2combination и команда запускают приложение, то он все еще сможет запустить приложение, точно так же, как с терминалом. Хорошее и легкое для установки дополнительной меры должны создать (если она еще не существует), каталог ~/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 (необходимо выполнить его с любой одним), Вам подарят список с (глобальными) файлами на рабочем столе, представляя Ваши установленные приложения:

enter image description here

Выберите один, и Ваше приложение заблокировано или разблокировано, в зависимости от аргумента, с которым Вы выполняете его.

Примечание:

Вам, вероятно, придется выйти из системы / входят в систему, заставляют его работать.

Сценарий

#!/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"):

enter image description here

или переворачивает его вверх дном (action = "xrandr --output "+screen+" --rotate inverted"):
(кто сказал, что Единица не позволяет помещать средство запуска справа?)

enter image description here

Сценарий

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

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

15
ответ дан 16 November 2019 в 14:06

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

Похожие вопросы: