特定のアプリが特定のアカウントで開くのをブロックする方法


13

特定のアプリケーションが特定のアカウントで開くのをブロックする方法(例:アカウントJohnがFirefoxまたはGimpを開くのを停止する)。これはGUIではなくターミナル用であり、特定のユーザーにのみ適用されると想定されているため、たとえば、ユーザーXはGimpを開くことができますが、Firefoxは開けません、ユーザーZはSoftware Centerを開けますがVirtualBoxは開けません。

Ubuntuの新しいユーザーのためにこれを行うための良い簡単な方法があります。


特定のファイルにACLを配置しますか?
mdpc 14年

必要なセキュリティレベルは?ここで使用可能な答えがあるでしょう:askubuntu.com/questions/447043/...
ジェイコブVlijm

現在、セキュリティレベルは最小限です。ユーザーは、あらゆるタイプのアプリへのアクセスを(何らかの方法で)拒否するだけで済みます。私が推測するユーザーはLinuxの知識が低く、おそらく端末を使用することはないでしょうが、それについての情報を追加することはできます。
ルイスアルバラード14年

実際にそれを行うのに十分な知識はありませんが、グループだけがアクセスできるようにすべての重要なアプリケーションをセットアップできます。その後、完全なアクセスのためにそのグループに上級ユーザーを追加できます。制限されたユーザーの場合、sudoersの適切なエントリとともにsudo(root以外)を使用して、ケースバイケースで他のコマンドへのパスワード保護されたアクセスを与えることができます。
ジョー14年

これがAppArmorの目的だと思いますが、「簡単な」方法として適格だとは思いません。
ムル

回答:


15

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;
      

    それ以降(ログアウト/ログイン後)、ユーザーがダッシュからgeditを開こうとするか、アプリケーションにリンクされているファイルを開こうとすると、このメッセージが表示されます。

    ここに画像の説明を入力してください

    • 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からアプリケーションを使用できなくなりますが、ユーザーが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 -messageが表示されます

リダイレクト 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つが実行された場合、スクリプトは特定のアクションを実行する必要があります。

1.禁止されているアプリケーションを使用するときに画面を操作するスクリプト。

以下のスクリプトは、ユーザー定義のアプリケーションをブロックする柔軟な方法を提供します。禁止されたアプリケーションを引数として、単純なコマンドで実行されます(例:スクリプトを実行可能にした場合):

    /path/to/block_apps.py firefox gedit gnome-terminal

このようなアプリケーションをブロックする利点は、柔軟性があることです。1つのアカウント内であっても、他のアプリケーションを引数として使用するだけで、異なる設定を使用できます。

何をする

行のいずれかをコメント解除することにより:

# 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

おそらく、これをショートカットキーの下に配置する必要があります。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。「+」をクリックして、上記のようにコマンドを追加します。


素晴らしい仕事ジェイコブ。素晴らしい答え。改善し続けてください。
ルイスアルバラード

@EricCarvalho編集ありがとうございます!それを逃した。
ジェイコブVlijm 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.