画面全体をロックせずに、特定のアプリケーションのインターフェースをロックできますか? 同僚が頻繁に私のデスクトップにアクセスして変更を加えるため、デスクを離れるときに特定のアプリケーションを開いたままにできると職場では非常に便利です。ただし、pidgin/skype/firefox/thunderbird をロックアウトして、別のパスワードがないとログインしたまま使用/表示できないようにしたいと考えています。
答え1
アプリケーションのウィンドウを非表示にし、パスワードを入力して再度表示できるようにする
編集版このスクリプトインターフェース(ウィンドウ)を(完全に)非表示/表示しますどれでもアプリケーション、スクリプトのヘッド セクションにリストされます (切り替え)。
パスワードはスクリプト内に保存されるため、パスワード保護は「軽度」です。スクリプトを実行するためのキーの組み合わせは、アクセスを簡単に防ぐもう 1 つの障壁になります。これは、あなたが言及した状況ではおそらく十分ですが、決定する必要があります。
使い方
スクリプトで
xdotool
は と の両方を使用しますwmctrl
。sudo apt-get install xdotool wmctrl
次に、以下のスクリプトを空のファイルにコピーし、 として保存し
password_app.py
、行の現在のパスワード「Monkey」を変更するだけです。if passw == "Monkey":
スクリプトのヘッド セクションに、インターフェイスを非表示にする必要があるアプリケーションを追加します。例として、次のように設定します。
applications = ["gedit", "thunderbird"]
次のコマンドでテスト実行します。
python3 /path/to/password_app.py
インターフェースを非表示にする場合も表示する場合もパスワードが必要です:
すべて正常に動作する場合は、ショートカット キーの組み合わせに追加します。システム設定 > 「キーボード」 > 「ショートカット」 > 「カスタム ショートカット」を選択します。「+」をクリックして、次のコマンドを追加します。
python3 /path/to/password_app.py
スクリプト
#!/usr/bin/env python3
import subprocess
import getpass
import os
import time
#---
applications = ["gedit", "thunderbird"]
#---
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").strip()
def toggle():
windowlist = os.environ["HOME"]+"/"+".windowlist.txt"
user = getpass.getuser()
wlist = [l for l in get("wmctrl -lp").splitlines()]
procs = sum([[p.split()[0] for p in get("ps -u "+user).splitlines() if app in p] for app in applications], [])
matches = sum([[l.split()[0] for l in wlist if p in l] for p in procs], [])
if len(matches) != 0:
with open(windowlist, "a+") as out:
for match in matches:
out.write(match+"\n")
subprocess.Popen(["/bin/bash", "-c", "xdotool windowunmap "+match])
else:
try:
with open(windowlist) as r:
for l in r.readlines():
subprocess.Popen(["/bin/bash", "-c", "xdotool windowmap "+l])
os.remove(windowlist)
except FileNotFoundError:
pass
try:
cmd = "zenity --entry --title='Restricted!' --text='Enter your _password:'"
passw = subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").strip()
if passw == "Monkey":
time.sleep(1)
toggle()
except subprocess.CalledProcessError:
pass
ノート
- これにより、ユーザーは新しいインスタンスアプリケーションによっては、現在のアプリケーションが非表示になります。ただし、追加のコーディングですべて実行できます :)。
- 別のユーザーがリストされているアプリケーションの新しいインスタンスを開く可能性がある場合、スクリプトを実行すると、まずそれらのウィンドウが非表示ウィンドウに追加されます。全て次回のスクリプト実行時にウィンドウが表示されます。
答え2
次のような追加のユーザー権限を活用するように設計されたアプリケーションSystem Settings-User accounts できるこれを行う。
Thunderbird のような、そのように設計されていないアプリケーションは、そのままでは動作しません。そのため、次の 2 つの可能性があります。
- プログラミングスキルを磨き、自分で機能を追加しましょう
- Thunderbird 用に別のユーザーを作成し、
su
メールを読む必要があるときにそのユーザーにログインし、必要がないときは閉じておきます...