Bevor Sie sich einloggen, müssen Sie mir diese Fragen beantworten 3?

22

Ich habe zwei Kinder, die Ubuntu so lieben, dass sie ihre Mathe-Hausaufgaben nicht machen. Im Geiste von Monty Python möchte ich ihnen etwas präsentieren wie:

"Hör auf. Wer die Brücke des Todes überqueren möchte, muss mir diese drei Fragen beantworten, bevor er die andere Seite sieht."

beim einloggen in.

Sie müssten einige mathematische Probleme lösen, bevor sie sich anmelden können.

Meine Frage ist: Kann so etwas getan werden?

user187493
quelle
Kann ich dazu mein eigenes xscreensaver-Modul schreiben? Oder vielleicht zum / etc / profile hinzufügen?
user187493
1
Vielleicht möchten Sie auch Ihr eigenes Pluggable Authentication Module (PAM) schreiben und erfahren, wie Sie dies in den lightdm-Begrüßer integrieren können.
ImaginaryRobots
Danke, das ist genau der Rat, den ich gesucht habe :) Ich habe keine Angst davor, mein System zu beschädigen. Ich denke, wenn ich etwas nicht kaputt mache, mache ich es nicht richtig.
User187493

Antworten:

30

Das Folgende wird mit Ubuntu 13.04 und Python des Systems unter Verwendung von Gtk-Bindungen (PyGobject) getestet.

Hier ist ein Weg, der ein bisschen schmutzig ist und weitere Nachforschungen erfordert:

Zusammenfassung

  • Fügen Sie eine .desktopDatei hinzu, unter der /usr/share/xsessionswir sie benennencustom

  • Fügen Sie .xsessiondem betreffenden Benutzer (Ihren Kindern) eine Datei hinzu, deren Benutzer wir als benennenkid

  • Erstellen Sie die Python-GUI-Anwendung für das Mathematik-Puzzle und führen Sie sie aus .xsession. Wir nennen sie wie folgtpuzzle.py

Einzelheiten

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

Fügen Sie der Datei Folgendes hinzu:

[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

Fügen Sie der Datei Folgendes hinzu:

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

Fügen Sie der Datei Folgendes hinzu:

#!/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()

Ergebnisse:

  • Wenn Sie sich abmelden, wird auf dem Anmeldebildschirm eine neue Sitzung mit dem Namen Benutzerdefiniert angezeigt.
  • Durch Auswahl der benutzerdefinierten Sitzung und nach erfolgreicher Anmeldung wird ein kleines PyGtk-Fenster (mit Pygobject) angezeigt, in dem Sie nach einem mathematischen Rätsel gefragt werden. Es gibt keine obere Leiste, keinen Starter und keine weiteren Standard-Desktop-Widgets:

Benutzerdefinierter Zugriff auf Unity

  • Wenn Sie richtig antworten, wird Unity geladen ...

Es bedarf weiterer Forschung, aber ich hoffe, dass es als Ausgangspunkt hilft.

Stef K
quelle
@ user187493 Wenn Sie der Meinung sind, dass Ihr Problem behoben ist, akzeptieren Sie die Antwort.
Stef K
Wenn Ihnen eine textbasierte Lösung nichts ausmacht, können Sie nicht einfach ein einfaches Shell-Skript schreiben, das einige Fragen stellt und die Antworten überprüft. Wenn die Antworten korrekt sind, führen Sie einen startx durch, andernfalls führen Sie eine Abmeldung durch. Bearbeiten Sie dann / etc / passwd und machen Sie dieses Skript zu ihrer Login-Shell. Es ist viel weniger elegant als die oben genannte Lösung, aber viel einfacher zu programmieren und zu warten. Es sollte auch relativ distro- / desktopunabhängig sein. Sie müssen es auch testen, um sicherzustellen, dass es ordnungsgemäß mit Sigint (Ctrl_C) umgehen kann.
Joe
Sehr schön! Das ist die Art von Dingen, die ich wirklich mag.
Jacob Vlijm
3

Es kann getan werden, aber würde eine Menge technischer Know - how nehmen. Der einfachste Weg, dies zu tun, besteht darin, ein Skript zu schreiben, das als root ausgeführt wird:

  • ändert ihr Passwort (e) automatisch zur Beantwortung einer bestimmten Frage,
  • Ändert das Desktop-Hintergrundbild, um die Frage anzuzeigen, die sie zu beantworten versuchen

Wahrscheinlich müssen Sie die Liste der mathematischen Probleme in einer Textdatei (oder Datenbank) aufbewahren und die Befehlszeilentools von imagemagick verwenden, um den Problemtext zum Desktop-Hintergrund hinzuzufügen. Verwenden Sie cron, um dieses Skript so zu planen, dass es von Zeit zu Zeit (täglich?) Ausgeführt wird.

Um den Anmeldebildschirm für drei verschiedene Fragen zu öffnen, ist viel benutzerdefiniertes Hacken erforderlich, und wahrscheinlich müssen große Teile Ihres Systems ausgetauscht werden. Daher wird dies nicht empfohlen. Sogar das "einfache" obige Skript erfordert viel Geschick und Wissen und kann möglicherweise Ihr System beschädigen, wenn es falsch gemacht wird.

ImaginaryRobots
quelle
Danke für deine Antwort. Ich wollte eine kleine Datenbank mit Fragen und Antworten benutzen und ich mag die Idee, imagemagik zu benutzen.
user187493