Przed zalogowaniem musisz odpowiedzieć na te pytania 3?

22

Mam dwoje dzieci, które tak bardzo kochają Ubuntu, że nie odrabiają zadań domowych z matematyki. Tak więc w duchu Monty Pythona chciałbym przedstawić im coś takiego:

„Przestań. Kto przejdzie przez Most Śmierci, musi mi odpowiedzieć na trzy pytania, zanim zobaczy drugą stronę.”

przy logowaniu.

Musieliby rozwiązać kilka problemów matematycznych, zanim będą mogli się zalogować.

Moje pytanie brzmi: czy można tego dokonać?

użytkownik187493
źródło
Czy mogę to zrobić, pisząc własny moduł xscreensaver? A może dodać to do profilu / etc /?
user187493,
1
Możesz także zajrzeć do pisania własnego modułu z wtyczkowym modułem uwierzytelniającym (PAM) i tego, jak zintegrować go z modułem witającym lightdm.
ImaginaryRobots
Dzięki, to jest dokładnie taka rada, której szukałem :) Nie boję się zbytnio złamania mojego systemu. Wydaje mi się, że jeśli czegoś nie łamie, nie robię tego dobrze.
user187493,

Odpowiedzi:

30

Poniższe testy są testowane w systemie Ubuntu 13.04 i Pythonie systemowym przy użyciu powiązań Gtk (PyGobject).

Oto jeden sposób, który jest nieco brudny i wymaga więcej badań:

Podsumowanie

  • Dodaj .desktopplik /usr/share/xsessions, nadamy mu nazwęcustom

  • Dodaj .xsessionplik do danego użytkownika (twoich dzieci), my nazwiemy jego użytkownika jakokid

  • Utwórz aplikację GUI Pythona dla zagadki matematycznej i uruchom ją .xsession, nazwiemy ją jakopuzzle.py

Detale

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

Dodaj następujące pliki:

[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

Dodaj następujące pliki:

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

Dodaj następujące pliki:

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

Wyniki:

  • Jeśli się wylogujesz, na ekranie logowania zobaczysz nową sesję o nazwie Niestandardowy.
  • Wybierając sesję niestandardową i po udanym logowaniu zobaczysz małe okno PyGtk (używając pygobject) z prośbą o puzzle matematyczne. Nie będzie górnego paska, programu uruchamiającego i pozostałych domyślnych widżetów pulpitu:

Niestandardowy dostęp do Unity

  • Jeśli odpowiesz poprawnie, Unity załaduje się ...

Potrzebuje jednak dalszych badań, ale mam nadzieję, że pomoże to jako punkt wyjścia.

Stef K.
źródło
@ user187493 Jeśli uważasz, że problem został rozwiązany, rozważ zaakceptowanie odpowiedzi.
Stef K
Jeśli nie masz nic przeciwko rozwiązaniu tekstowemu, nie możesz po prostu napisać prostego skryptu powłoki, który zadaje kilka pytań i sprawdza odpowiedzi. Jeśli odpowiedzi są poprawne, wykonaj startx, w przeciwnym razie wyloguj się. Następnie edytuj / etc / passwd i ustaw ten skrypt jako powłokę logowania. Jest o wiele mniej elegancki niż powyższe rozwiązanie, ale o wiele prostszy w kodowaniu i utrzymaniu. Powinien również być względnie niezależny od dystrybucji / pulpitu. Trzeba też przetestować, aby upewnić się, że obsługuje z wdziękiem takie rzeczy jak sigint (Ctrl_C).
Joe
Bardzo dobrze! takie rzeczy naprawdę lubię.
Jacob Vlijm
3

To może być zrobione, ale zajęłoby dużo technicznego know-how. Najprostszym sposobem na to jest napisanie skryptu uruchamianego jako root, który:

  • automatycznie zmienia hasło (hasła) na odpowiedź na zadane pytanie,
  • zmienia tapetę pulpitu, aby pokazać pytanie, na które próbują odpowiedzieć

Prawdopodobnie będziesz musiał przechowywać listę problemów matematycznych w pliku tekstowym (lub bazie danych) i użyć narzędzi wiersza poleceń imagemagick, aby dodać tekst problemu do tapety pulpitu. Użyj crona, aby zaplanować uruchamianie tego skryptu tak często (codziennie?).

Uzyskanie ekranu logowania z pytaniem o 3 różne pytania wymagałoby dużo niestandardowego hakowania i prawdopodobnie wymagałoby wymiany dużych części systemu, więc nie jest to zalecane. Nawet powyższy „prosty” skrypt wymaga dużej umiejętności i wiedzy, a jeśli popełnisz błąd, może potencjalnie uszkodzić system.

ImaginaryRobots
źródło
Dzięki za odpowiedź. Zamierzałem użyć mini bazy danych pytań i odpowiedzi i bardzo podoba mi się pomysł użycia imagemagik.
user187493,