Avant de vous connecter, vous devez me répondre à ces questions 3?

22

J'ai deux enfants qui aiment tellement Ubuntu qu'ils ne font pas leurs devoirs de mathématiques. Donc, dans l'esprit de Monty Python, je voudrais leur présenter quelque chose comme:

"Arrête. Qui traverserait le Pont de la Mort doit me répondre à ces trois questions, avant l'autre côté qu'il voit."

à la connexion.

Ils devraient résoudre quelques problèmes mathématiques avant de pouvoir se connecter.

Ma question est: ce genre de chose peut-il être fait?

user187493
la source
Puis-je le faire en écrivant mon propre module xscreensaver? Ou peut-être l'ajouter au profil / etc /?
user187493
1
Vous pouvez également envisager d'écrire votre propre module d'authentification enfichable (PAM) et comment l'intégrer à l'accueilleur lightdm.
ImaginaryRobots
Merci c'est exactement le genre de conseil que je cherchais :) Je n'ai pas trop peur de casser mon système. Je suppose que si je ne casse pas quelque chose, je ne le fais pas correctement.
user187493

Réponses:

30

Ce qui suit est testé avec Ubuntu 13.04 et Python du système, en utilisant les liaisons Gtk (PyGobject).

Voici cependant un moyen un peu sale et qui nécessite plus d'investigation:

Sommaire

  • Ajoutez un .desktopfichier à /usr/share/xsessionsnous le nommeronscustom

  • Ajoutez un .xsessionfichier à l'utilisateur en question (vos enfants), nous nommerons leur utilisateur commekid

  • Créez l'application graphique Python pour le casse-tête mathématique et exécutez-la .xsession, nous la nommeronspuzzle.py

Détails

  • sudo vi /usr/share/xsessions/custom.desktop

Ajoutez les éléments suivants dans le fichier:

[Desktop Entry]
Name=Custom
Comment=This session logs you into your managed desktop environment
Exec=/etc/X11/Xsession
X-Ubuntu-Gettext-Domain=gnome-session-3.0
  • vi /home/kid/.xsession

Ajoutez les éléments suivants dans le fichier:

#!/bin/bash
lightdm &
exec /home/kid/puzzle.py
  • vi /home/kid/puzzle.py

Ajoutez les éléments suivants dans le fichier:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import subprocess
import random
from gi.repository import Gtk


#----------------------------------------------------------------------
class PuzzleWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Math Puzzle", resizable=False)

        super(PuzzleWindow, self).set_position(Gtk.WindowPosition.CENTER)
        super(PuzzleWindow, self).maximize()

        self.a_number = random.randint(1, 5)
        self.b_number = random.randint(1, 5)
        self.result = self.a_number + self.b_number

        self.vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)

        self.label = Gtk.Label("What is the sum of the numbers bellow?")
        self.number_label = Gtk.Label("{num_a} + {num_b}".format(
            num_a=self.a_number, num_b=self.b_number))

        self.entry = Gtk.Entry()
        self.button = Gtk.Button(label="Check answer!")
        self.button.connect("clicked", self.on_button_clicked)

        self.vbox.pack_start(self.label, True, True, 0)
        self.vbox.pack_start(self.number_label, True, True, 0)
        self.vbox.pack_start(self.entry, True, True, 0)
        self.vbox.pack_start(self.button, True, True, 0)
        self.add(self.vbox)

    def on_button_clicked(self, widget):

        if int(self.entry.get_text()) == self.result:
            subprocess.call("unity &", shell=True)
        else:
            self.label.set_text("Wrong answer, try again.")
#----------------------------------------------------------------------
def main():
    """Application's entry point"""
    win = PuzzleWindow()
    win.connect("delete-event", Gtk.main_quit)
    win.show_all()
    Gtk.main()

if __name__ == "__main__":
    main()

Résultats:

  • Si vous vous déconnectez, sur l'écran de connexion, vous verrez une nouvelle session nommée Custom.
  • En choisissant la session personnalisée et après une connexion réussie, vous serez présenté par une petite fenêtre PyGtk (utilisant pygobject) demandant un puzzle mathématique. Il n'y aura pas de barre supérieure, de lanceur et le reste des widgets de bureau par défaut:

Accès personnalisé à Unity

  • Si vous répondez correctement, Unity se chargera ...

Il a besoin de recherches supplémentaires mais j'espère que cela aidera comme point de départ.

Stef K
la source
@ user187493 Si vous considérez que votre problème est résolu, pensez à accepter la réponse.
Stef K
Si cela ne vous dérange pas une solution basée sur du texte, ne pourriez-vous pas simplement écrire un script shell simple qui pose quelques questions et vérifie les réponses. Si les réponses sont correctes, faites un startx, sinon, déconnectez-vous. Ensuite, éditez / etc / passwd et faites de ce script leur shell de connexion. C'est beaucoup moins élégant que la solution ci-dessus, mais beaucoup plus simple à coder et à maintenir. Il devrait également être relativement indépendant de la distribution / du bureau. Vous devrez également le tester pour vous assurer qu'il gère des éléments comme sigint (Ctrl_C) avec élégance.
Joe
Très agréable! c'est le genre de choses que j'aime vraiment.
Jacob Vlijm
3

Cela peut être fait, mais nécessiterait beaucoup de savoir-faire technique. La façon la plus simple de le faire en écrivant un script exécuté en tant que root qui:

  • change automatiquement son ou ses mots de passe en réponse à une question donnée,
  • modifie son fond d'écran pour afficher la question à laquelle il essaie de répondre

Vous devrez probablement conserver la liste des problèmes mathématiques dans un fichier texte (ou une base de données) et utiliser les outils de ligne de commande imagemagick pour ajouter le texte du problème au papier peint du bureau. Utilisez cron pour planifier l'exécution de ce script de temps en temps (quotidiennement?).

Obtenir l'écran de connexion pour poser 3 questions différentes nécessiterait beaucoup de piratage personnalisé et impliquerait probablement de remplacer de grandes parties de votre système, donc ce n'est pas recommandé. Même le script "simple" ci-dessus nécessite beaucoup de compétences et de connaissances, et pourrait potentiellement casser votre système s'il est mal fait.

ImaginaryRobots
la source
Merci pour votre réponse. J'allais utiliser une mini base de données de questions et réponses et j'aime vraiment l'idée d'utiliser imagemagik.
user187493