Prima di accedere devi rispondere a queste domande 3?


22

Ho due figli che amano così tanto Ubuntu da non fare i compiti di matematica. Quindi, nello spirito di Monty Python, vorrei presentarli con qualcosa del tipo:

"Fermati. Chi attraverserebbe il Ponte della Morte deve rispondermi a queste tre domande, prima che veda dall'altra parte."

al login in.

Dovrebbero risolvere alcuni problemi matematici prima di poter accedere.

La mia domanda è: si può fare questo tipo di cose?


Potrei farlo scrivendo il mio modulo xscreensaver? O forse aggiungerlo al profilo / etc /?
user187493,

1
Potresti anche cercare di scrivere il tuo Pluggable Authentication Module (PAM) e come integrarlo con il programma di benvenuto lightdm.
ImaginaryRobots,

Grazie, questo è esattamente il tipo di consiglio che stavo cercando :) Non ho troppa paura di rompere il mio sistema. Immagino che se non sto rompendo qualcosa non lo sto facendo bene.
user187493,

Risposte:


30

Quanto segue viene testato con Ubuntu 13.04 e Python di sistema, usando i collegamenti Gtk (PyGobject).

Qui c'è un modo un po 'sporco e ha bisogno di ulteriori indagini:

Sommario

  • Aggiungi un .desktopfile a /usr/share/xsessionsnoi lo nomineremocustom

  • Aggiungi un .xsessionfile all'utente in questione (i tuoi figli) che chiameremo il loro utente comekid

  • Crea l'applicazione Python GUI per il puzzle matematico ed eseguilo .xsession, lo chiameremo comepuzzle.py

Dettagli

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

Aggiungi quanto segue nel file:

[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

Aggiungi quanto segue nel file:

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

Aggiungi quanto segue nel file:

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

risultati:

  • Se esci, nella schermata di accesso vedrai una nuova sessione chiamata Personalizzata.
  • Scegliendo la sessione personalizzata e dopo aver effettuato l'accesso con successo, ti verrà presentata una piccola finestra di PyGtk (usando pygobject) che chiede un puzzle matematico. Non ci saranno barra in alto, launcher e il resto dei widget desktop predefiniti:

Accesso personalizzato a Unity

  • Se rispondi correttamente, Unity caricherà ...

Ha bisogno di ulteriori ricerche, ma spero che aiuti come punto di partenza.


@ user187493 Se ritieni che il tuo problema sia risolto, considera di accettare la risposta.
Stef K,

Se non ti dispiace una soluzione testuale, non potresti semplicemente scrivere un semplice script shell che fa alcune domande e controlla le risposte. Se le risposte sono corrette, allora fai un startx, altrimenti fai un logout. Quindi, modifica / etc / passwd e trasforma questo script nella loro shell di login. È molto meno elegante della soluzione di cui sopra, ma molto più semplice da programmare e mantenere. Dovrebbe anche essere relativamente distro / indipendente dal desktop. Dovresti anche testarlo per assicurarti che gestisca le cose come Sigint (Ctrl_C) con grazia.
Joe,

Molto bella! questo è il tipo di cose che mi piacciono molto.
Jacob Vlijm,

3

Si può fare, ma richiederebbe molto know-how tecnico. Il modo più semplice per farlo scrivendo uno script che viene eseguito come root che:

  • cambia automaticamente la / le password / e alla risposta di una determinata domanda,
  • cambia lo sfondo del desktop per mostrare la domanda a cui stanno cercando di rispondere

Probabilmente avresti bisogno di mantenere l'elenco dei problemi matematici in un file di testo (o database) e utilizzare gli strumenti della riga di comando di imagemagick per aggiungere il testo del problema allo sfondo del desktop. Usa cron per pianificare l'esecuzione dello script ogni tanto (ogni giorno?).

Ottenere la schermata di accesso per porre 3 domande diverse richiederebbe un sacco di hacking personalizzato e probabilmente implicherebbe la sostituzione di grandi parti del sistema, quindi non è raccomandato. Anche lo script "semplice" sopra richiede molta abilità e conoscenza e potrebbe potenzialmente rompere il sistema se fatto male.


Grazie per la tua risposta. Stavo per usare un mini database di domande e risposte e mi piace molto l'idea di usare imagemagik.
user187493,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.