Fixer un délai pour un processus ou une demande
Avec un petit script d'arrière-plan, vous pouvez définir un délai pour un processus ou une application.
Tant que votre utilisateur ne connaît pas le mot de passe de l'administrateur , il n'est pas trop facilement dépassé.
La solution ci-dessous
Est-ce un si petit script d'arrière-plan. Il limite l'utilisation par jour à un nombre défini de minutes, à définir en tête du script. Une fois installé (ce qui n'est pas trop difficile), il fonctionne très facilement et aucune action supplémentaire n'est nécessaire par la suite.
Le script
#!/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
Comment utiliser
- Sur votre bureau (ou ailleurs), créez un dossier nommé:
limit
- Copiez le script dans un fichier vide, enregistrez-le sous
limit_use
(sans extension) dans le dossier et rendez-le exécutable
Modifiez dans la tête du script le nom du processus à limiter et le nombre maximum de minutes autorisées. Dans l'exemple:
#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"
Copiez le dossier dans le répertoire /opt
:
cp -r /path/to/limit /opt
Maintenant éditez /etc/rc.local
pour que le script s'exécute comme root
au démarrage:
sudo -i gedit /etc/rc.local
Juste avant la ligne
exit 0
une autre ligne:
/opt/limit/limit_use &
C'est ça
Lorsque quelqu'un essaie de tuer le script d'arrière-plan:
(action non autorisée)
Explication; Comment ça fonctionne
- Une fois toutes les 10 secondes, le script vérifie si le processus ciblé est en cours d'exécution. Si c'est le cas, il "ajoute" un "point" à une utilisation totale, à enregistrer dans un fichier (
/opt/limit/uselog
). Si la limite journalière est atteinte, le script ne permet plus au processus de s'exécuter, le tuant s'il existe.
- Lors du changement de jour (la date est enregistrée dans un fichier, donc le redémarrage n'aidera pas), le fichier journal est supprimé, ce qui permet à une nouvelle durée d'utilisation de s'accumuler.
- Étant donné que le script s'exécute au démarrage ,
rc.local
seuls les utilisateurs disposant des privilèges sudo peuvent arrêter le script, même si l'utilisateur ne connaît pas le nom du processus.
Arrêtez le script
Si vous souhaitez arrêter le script, utilisez la commande:
sudo kill "$(pgrep limit_use)"
Mais encore une fois, vous auriez besoin du mot de passe sudo pour le faire.
ÉDITER
Bien que le script ci-dessus devrait fournir un moyen raisonnablement sûr de limiter l'utilisation d'une application, comme mentionné par @Bytecommander, il peut être dépassé, mais pas très facilement. La combinaison avec la mesure ci-dessous rendra très peu probable que cela se produise, sauf si votre fils connaît la configuration et est assez expérimenté avec Linux / Ubuntu.
Mesure supplémentaire
Un peu plus loin d'une «solution simple», mais toujours pas trop difficile à mettre en place est la mesure supplémentaire ci-dessous. Si notre délinquant suspect découvre que le script est appelé /etc/rc.local
, parvient à devenir root et supprime la ligne /etc/rc.local
, ou peut arrêter le script de cette façon, nous pouvons le confronter au problème suivant: l'écran s'éteint après connectez-vous. De plus, la solution vérifie si le script d'arrière-plan s'exécute au bout de 5 minutes après le redémarrage, en noircissant sinon.
La mesure supplémentaire est une vérification de démarrage si la ligne /opt/limit/limit_use &
est présente dans /etc/rc.local
, et une vérification après 5 minutes si le script fonctionne toujours. Étant donné que le script s'exécute à partir d'un lanceur (caché des applications de démarrage), /etc/xdg/autostart
il sera assez difficile de savoir ce qui se passe, sauf si vous savez comment cela se fait. La combinaison de ces deux mesures fait qu'il est peu probable que votre fils le découvre, et s'il le fait, probablement rien ne l'arrêtera.
Comment installer
Deux étapes simples sont impliquées:
Copiez le code ci-dessous dans un fichier vide, enregistrez-le comme blackout.desktop
sur votre bureau:
[Desktop Entry]
Name=not allowed
Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
Type=Application
Terminal=false
NoDisplay=true
Copiez le fichier dans /etc/xdg/autostart
:
sudo cp /path/to/blackout.desktop /etc/xdg/autostart
Copiez le script ci-dessous dans un fichier vide, enregistrez-le comme blackout.py
sur votre bureau, rendez-le exécutable et copiez-le dans /usr/local/bin
:
cp /path/to/blackout.py /usr/local/bin
Le script
#!/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()
Explication
Les lanceurs en /etc/xdg/autostart
lanceront une application (dans ce cas le contrôle de sécurité supplémentaire) pour tous les utilisateurs. Cela pourrait être remplacé localement, mais vous devez connaître les vérifications. En mettant la ligne NoDisplay=true
dans notre lanceur, elle n'apparaîtra pas localement Startup Applications
, donc sans savoir qu'elle existe, il est peu probable qu'elle soit découverte.
De plus, votre fils n'a que 15 secondes pour le découvrir (puis l'écran est noirci), il aurait donc un problème grave, à moins qu'il ne soit génial, ait beaucoup d'expérience avec Ubuntu et un esprit créatif.