Antes de iniciar sesión, debe responderme estas preguntas 3?


22

Tengo dos hijos que aman tanto a Ubuntu que no hacen su tarea de matemáticas. Entonces, en el espíritu de Monty Python, me gustaría presentarles algo como:

"Detente. Quién cruzaría el Puente de la Muerte debe responderme estas tres preguntas, antes de que vea el otro lado".

en el inicio de sesión.

Tendrían que resolver algunos problemas matemáticos antes de poder iniciar sesión.

Mi pregunta es: ¿se puede hacer este tipo de cosas?


¿Podría hacer esto escribiendo mi propio módulo xscreensaver? ¿O tal vez agregarlo al perfil / etc /?
user187493

1
También puede considerar escribir su propio Módulo de autenticación conectable (PAM) y cómo integrarlo con el lightdm greeter.
ImaginaryRobots

Gracias, este es exactamente el tipo de consejo que estaba buscando :) No tengo demasiado miedo de romper mi sistema. Me imagino que si no estoy rompiendo algo, no lo estoy haciendo bien.
user187493

Respuestas:


30

Lo siguiente se prueba con Ubuntu 13.04 y Python del sistema, utilizando enlaces Gtk (PyGobject).

Sin embargo, aquí hay una manera un poco sucia y necesita más investigación:

Resumen

  • Agregue un .desktoparchivo en /usr/share/xsessionslo nombraremoscustom

  • Agregue un .xsessionarchivo al usuario en cuestión (sus hijos) nombraremos a su usuario comokid

  • Cree la aplicación Python GUI para el rompecabezas matemático y ejecútelo .xsession, lo llamaremos comopuzzle.py

Detalles

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

Agregue lo siguiente en el archivo:

[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

Agregue lo siguiente en el archivo:

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

Agregue lo siguiente en el archivo:

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

Resultados:

  • Si cierra sesión, en la pantalla de inicio de sesión verá una nueva sesión llamada Personalizada.
  • Al elegir la sesión personalizada y después de un inicio de sesión exitoso, se le presentará una pequeña ventana PyGtk (usando pygobject) pidiendo un rompecabezas matemático. No habrá barra superior, iniciador y el resto de los widgets de escritorio predeterminados:

Acceso personalizado a Unity

  • Si responde correctamente, Unity se cargará ...

Sin embargo, necesita más investigación, pero espero que ayude como punto de partida.


@ user187493 Si considera que su problema está resuelto, considere aceptar la respuesta.
Stef K

Si no le importa una solución basada en texto, ¿no podría simplemente escribir un script de shell simple que haga algunas preguntas y verifique las respuestas? Si las respuestas son correctas, haga un startx, de lo contrario, cierre la sesión. Luego, edite / etc / passwd y convierta este script en su shell de inicio de sesión. Es mucho menos elegante que la solución anterior, pero es mucho más simple de codificar y mantener. También debe ser relativamente independiente de la distribución / escritorio. También deberá probarlo para asegurarse de que maneja elementos como sigint (Ctrl_C) con gracia.
Joe

¡Muy agradable! Este es el tipo de cosas que realmente me gustan.
Jacob Vlijm

3

se puede hacer, pero requeriría muchos conocimientos técnicos. La forma más sencilla de hacerlo escribiendo un script que se ejecute como root que:

  • cambia su (s) contraseña (s) automáticamente a la respuesta de una pregunta dada,
  • cambia el fondo de escritorio para mostrar la pregunta que intentan responder

Es probable que necesite mantener la lista de problemas matemáticos en un archivo de texto (o base de datos) y usar las herramientas de línea de comandos de imagemagick para agregar el texto del problema al fondo de escritorio. Use cron para programar ese script para que se ejecute cada cierto tiempo (¿diariamente?).

Hacer que la pantalla de inicio de sesión haga 3 preguntas diferentes requeriría una gran cantidad de piratería personalizada y probablemente implicaría reemplazar grandes partes de su sistema, por lo que no se recomienda. Incluso el script "simple" anterior requiere mucha habilidad y conocimiento, y podría dañar su sistema si se hace mal.


Gracias por tu respuesta. Iba a usar una mini base de datos de preguntas y respuestas y realmente me gusta la idea de usar imagemagik.
user187493
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.