Antes de fazer o login, você deve me responder estas perguntas 3?


22

Eu tenho dois filhos que amam tanto o Ubuntu que não estão fazendo o dever de matemática. Então, no espírito de Monty Python, eu gostaria de apresentar a eles algo como:

"Pare. Quem atravessaria a Ponte da Morte deve me responder essas perguntas três, antes do outro lado que ele vê."

no login.

Eles teriam que resolver alguns problemas de matemática antes de poderem fazer login.

Minha pergunta é: esse tipo de coisa pode ser feito?


Eu poderia fazer isso escrevendo meu próprio módulo xscreensaver? Ou talvez adicione-o ao perfil / etc /?
user187493

1
Você também pode querer escrever seu próprio PAM (Pluggable Authentication Module) e como integrá-lo ao lightdm greeter.
ImaginaryRobots

Obrigado, este é exatamente o tipo de conselho que eu estava procurando :) Não tenho muito medo de quebrar meu sistema. Eu acho que se não estou quebrando algo, não estou fazendo certo.
user187493

Respostas:


30

O seguinte é testado com o Ubuntu 13.04 e o Python do sistema, usando as ligações Gtk (PyGobject).

Aqui está uma maneira um pouco suja e precisa de mais investigação:

Sumário

  • Adicione um .desktoparquivo no /usr/share/xsessionsnome delecustom

  • Adicione um .xsessionarquivo ao usuário em questão (seus filhos) e nomearemos o usuário comokid

  • Crie o aplicativo GUI do Python para o quebra-cabeça matemático e execute-o .xsession, nomearemos comopuzzle.py

Detalhes

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

Adicione o seguinte no arquivo:

[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

Adicione o seguinte no arquivo:

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

Adicione o seguinte no arquivo:

#!/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:

  • Se você sair, na tela de login, você verá uma nova sessão chamada Personalizada.
  • Ao escolher a sessão personalizada e após o login bem-sucedido, você será apresentado por uma pequena janela do PyGtk (usando o pygobject) solicitando um quebra-cabeça matemático. Não haverá barra superior, iniciador e o restante dos widgets da área de trabalho padrão:

Acesso personalizado ao Unity

  • Se você responder corretamente, o Unity será carregado ...

Ele precisa de mais pesquisas, mas espero que ajude como ponto de partida.


@ user187493 Se considerar que o seu problema foi resolvido, aceite a resposta.
precisa

Se você não se importa com uma solução baseada em texto, não poderia simplesmente escrever um shell script simples que faça algumas perguntas e verifique as respostas. Se as respostas estiverem corretas, faça um startx, caso contrário, faça um logout. Em seguida, edite o arquivo / etc / passwd e torne esse script seu shell de login. É muito menos elegante que a solução acima, mas muito mais simples de codificar e manter. Também deve ser relativamente independente de distribuição / área de trabalho. Você também precisaria testá-lo para garantir que ele lida com coisas como sigint (Ctrl_C) normalmente.
31813 Joe

Muito agradável! esse é o tipo de coisa que eu realmente gosto.
Jacob Vlijm

3

Isso pode ser feito, mas seria necessário muito conhecimento técnico. A maneira mais simples de fazer isso escrevendo um script que é executado como root e que:

  • altera suas senhas automaticamente para a resposta de uma determinada pergunta,
  • altera o papel de parede da área de trabalho para mostrar a pergunta que está tentando responder

Você provavelmente precisará manter a lista de problemas de matemática em um arquivo de texto (ou banco de dados) e usar as ferramentas de linha de comando imagemagick para adicionar o texto do problema ao papel de parede da área de trabalho. Use cron para agendar esse script para ser executado de vez em quando (diariamente?).

Conseguir que a tela de login faça três perguntas diferentes exigiria muitos hackers personalizados e provavelmente envolveria a substituição de grandes partes do seu sistema, portanto não é recomendado. Mesmo o script "simples" acima requer muita habilidade e conhecimento e pode potencialmente danificar seu sistema se for feito errado.


Obrigado pela sua resposta. Eu usaria um mini banco de dados de perguntas e respostas e realmente gosto da ideia de usar o imagemagik.
user187493
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.