Ustaw limit czasu dla procesu lub aplikacji
Za pomocą małego skryptu w tle możesz ustawić limit czasu dla procesu lub aplikacji.
Tak długo, jak użytkownik nie zna hasła administratora , nie jest ono zbyt łatwe do przekroczenia.
Rozwiązanie poniżej
To taki mały skrypt w tle. Ogranicza dzienne użycie do określonej liczby minut, które można ustawić w skrypcie. Po skonfigurowaniu (co nie jest zbyt trudne) działa bardzo łatwo i nie wymaga żadnych dodatkowych działań.
Scenariusz
#!/usr/bin/python3
import subprocess
import os
import sys
import time
#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"
uselog = "/opt/limit/uselog"
datefile = "/opt/limit/currdate"
def read(f):
try:
return int(open(f).read().strip())
except FileNotFoundError:
pass
currday1 = read(datefile)
while True:
time.sleep(10)
currday2 = int(time.strftime("%d"))
# check if the day has changed, to reset the used quantum
if currday1 != currday2:
open(datefile, "wt").write(str(currday2))
try:
os.remove(uselog)
except FileNotFoundError:
pass
try:
# if the pid of the targeted process exists, add a "tick" to the used quantum
pid = subprocess.check_output(["pgrep", app]).decode("utf-8").strip()
n = read(uselog)
n = n + 1 if n != None else 0
# when time exceeds the permitted amount, kill the process
if n > minutes*6:
subprocess.Popen(["kill", pid])
open(uselog, "wt").write(str(n))
except subprocess.CalledProcessError:
pass
currday1 = currday2
Jak używać
- Na pulpicie (lub w dowolnym innym miejscu) utwórz folder o nazwie:
limit
- Skopiuj skrypt do pustego pliku, zapisz go jako
limit_use
(bez rozszerzenia) w folderze i spraw, aby był wykonywalny
Edytuj w nagłówku skryptu nazwę procesu do ograniczenia i maksymalną liczbę dozwolonych minut. W przykładzie:
#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"
Skopiuj folder do katalogu /opt
:
cp -r /path/to/limit /opt
Teraz edytuj, /etc/rc.local
aby skrypt działał tak, jak root
podczas uruchamiania:
sudo -i gedit /etc/rc.local
Tuż przed linią
exit 0
inna linia:
/opt/limit/limit_use &
Otóż to
Gdy ktoś próbuje zabić skrypt w tle:
(działanie niedozwolone)
Wyjaśnienie; jak to działa
- Raz na 10 sekund skrypt sprawdza, czy proces docelowy jest uruchomiony. Jeśli tak, „dodaje” jeden „punkt” do całkowitego zużycia, co ma zostać zapisane w pliku (
/opt/limit/uselog
). Jeśli dzienny limit zostanie osiągnięty, skrypt nie pozwala już na uruchomienie procesu, zabijając go, jeśli istnieje.
- Po zmianie dnia (data jest zapisywana w pliku, więc ponowne uruchomienie nie pomoże), plik dziennika jest usuwany, co pozwala na nagromadzenie nowego czasu użytkowania.
- Ponieważ skrypt uruchamia się przy uruchamianiu ,
rc.local
tylko użytkownicy z uprawnieniami sudo mogą zatrzymać skrypt, nawet jeśli użytkownik zna nazwę procesu.
Zatrzymaj skrypt
Jeśli chcesz zatrzymać skrypt, użyj polecenia:
sudo kill "$(pgrep limit_use)"
Ale ponownie potrzebujesz do tego hasła sudo.
EDYTOWAĆ
Chociaż powyższy skrypt powinien zapewniać względnie bezpieczny sposób ograniczania użycia aplikacji, jak wspomniano w @Bytecommander, można go przekroczyć, choć nie bardzo łatwo. Połączenie z poniższą miarą sprawi, że jest bardzo mało prawdopodobne, że tak się stanie, chyba że twój syn wie konfigurację i jest dość doświadczony w Linuksie / Ubuntu.
Dodatkowa miara
Nieco dalej od „prostego rozwiązania”, ale wciąż niezbyt trudnego do skonfigurowania, jest dodatkowy środek poniżej. Jeśli nasza podejrzewany przestępca dowie skrypt jest wywoływany /etc/rc.local
, że uda się uzyskać uprawnienia administratora i usunąć linię /etc/rc.local
, czy będzie w stanie zatrzymać skrypt w ten sposób, możemy skonfrontować go z kolejnym problemem: czarni odfiltrować po zaloguj się. Ponadto rozwiązanie sprawdza, czy skrypt w tle działa po 5 minutach od ponownego uruchomienia, aw razie potrzeby wygasa.
Dodatkową miarą jest uruchomienie - sprawdzenie, czy linia /opt/limit/limit_use &
jest obecna /etc/rc.local
, i sprawdzenie po 5 minutach, czy skrypt nadal działa. Ponieważ skrypt działa w programie uruchamiającym (ukrytym przed aplikacjami startowymi), /etc/xdg/autostart
trudno będzie dowiedzieć się, co się dzieje, chyba że wiesz, jak to zrobić. Połączenie tych dwóch środków sprawia, że jest mało prawdopodobne, że twój syn się dowie, a jeśli to zrobi, prawdopodobnie nic go nie powstrzyma.
Jak skonfigurować
W grę wchodzą dwa proste kroki:
Skopiuj poniższy kod do pustego pliku i zapisz go jak blackout.desktop
na pulpicie:
[Desktop Entry]
Name=not allowed
Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
Type=Application
Terminal=false
NoDisplay=true
Skopiuj plik do /etc/xdg/autostart
:
sudo cp /path/to/blackout.desktop /etc/xdg/autostart
Skopiuj poniższy skrypt do pustego pliku, zapisz go jak blackout.py
na pulpicie, ustaw go jako wykonywalny i skopiuj do /usr/local/bin
:
cp /path/to/blackout.py /usr/local/bin
Scenariusz
#!/usr/bin/env python3
import subprocess
import time
def dim_screen():
screen = [
l.split()[0] for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()\
if " connected" in l
]
for scr in screen:
subprocess.Popen(["xrandr", "--output", scr, "--brightness", "0"])
if not "/opt/limit/limit_use &" in open("/etc/rc.local").read():
dim_screen()
time.sleep(300)
try:
pid = subprocess.check_output(["pgrep", "limit_use"]).decode("utf-8").strip()
except subprocess.CalledProcessError:
dim_screen()
Wyjaśnienie
Program uruchamiający w /etc/xdg/autostart
uruchomi aplikację (w tym przypadku dodatkowe sprawdzenie bezpieczeństwa) dla wszystkich użytkowników. To mógłby być zastąpiony lokalnie, ale trzeba znać się sprawdzać przebiegów. Umieszczając linię NoDisplay=true
w naszym programie uruchamiającym, nie pojawi się ona lokalnie Startup Applications
, więc bez wiedzy, że istnieje, jest mało prawdopodobne, aby została odkryta.
Co więcej, twój syn ma tylko 15 sekund, aby się dowiedzieć (wtedy ekran jest zaciemniony), więc miałby poważny problem, chyba że jest genialny, ma duże doświadczenie z Ubuntu i kreatywnym umysłem.