Прежде чем войти в систему, вы должны ответить мне на эти вопросы 3?

22

У меня есть двое детей, которые так любят Ubuntu, что они не выполняют свою домашнюю работу по математике. Итак, в духе Монти Пайтона, я хотел бы представить им что-то вроде:

«Стоп. Кто пересечет Мост Смерти, должен ответить на эти три вопроса, прежде чем он увидит другую сторону».

при входе в систему

Им придется решить несколько математических задач, прежде чем они смогут войти.

Мой вопрос: можно ли это сделать?

user187493
источник
Могу ли я сделать это, написав свой собственный модуль xscreensaver? Или, может быть, добавить его в / etc / profile?
user187493
1
Возможно, вы также захотите написать свой собственный подключаемый модуль аутентификации (PAM) и узнать, как его интегрировать с приветствующим lightdm.
ImaginaryRobots
Спасибо, это именно тот совет, который я искал :) Я не слишком боюсь сломать свою систему. Я полагаю, что если я что-то не сломал, я делаю это неправильно.
user187493

Ответы:

30

Следующее тестируется с Ubuntu 13.04 и системным Python с использованием привязок Gtk (PyGobject).

Вот один из способов немного грязный, и он требует дополнительного изучения:

Резюме

  • Добавьте .desktopфайл, /usr/share/xsessionsназовем егоcustom

  • Добавьте .xsessionфайл к нужному пользователю (вашим детям), мы назовем его пользователя какkid

  • Создайте приложение Python GUI для математической головоломки и запустите его .xsession, назовем его какpuzzle.py

Детали

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

Добавьте в файл следующее:

[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

Добавьте в файл следующее:

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

Добавьте в файл следующее:

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

Полученные результаты:

  • Если вы выйдете из системы, на экране входа в систему вы увидите новый сеанс с именем Custom.
  • Выбрав пользовательский сеанс и после успешного входа в систему, вы увидите маленькое окно PyGtk (с использованием pygobject), запрашивающее математическую головоломку. Там не будет верхней панели, панели запуска и остальных виджетов рабочего стола по умолчанию:

Пользовательский доступ к Unity

  • Если вы ответите правильно, Unity загрузит ...

Это требует дальнейшего исследования, но я надеюсь, что это поможет в качестве отправной точки.

Стеф К
источник
@ user187493 Если вы считаете, что ваша проблема решена, попробуйте принять ответ.
Stef K
Если вы не возражаете против текстового решения, не могли бы вы просто написать простой сценарий оболочки, который задает несколько вопросов и проверяет ответы. Если ответы верны, тогда запустите startx, иначе выйдите из системы. Затем отредактируйте / etc / passwd и сделайте этот скрипт своей оболочкой для входа. Это не так элегантно, как в приведенном выше решении, но проще в написании кода и обслуживании. Он также должен быть относительно независимым от дистрибутива и десктопа. Вам также необходимо проверить его, чтобы убедиться, что он обрабатывает такие вещи, как sigint (Ctrl_C) изящно.
Джо
Очень хорошо! это те вещи, которые мне действительно нравятся.
Джейкоб Влейм
3

Это можно сделать, но потребуется много технических ноу-хау. Самый простой способ сделать это, написав скрипт, который запускается от имени root и который:

  • автоматически изменяет свой пароль (пароли) на ответ на заданный вопрос,
  • меняет обои на рабочем столе, чтобы показать вопрос, на который они пытаются ответить

Скорее всего, вам потребуется сохранить список математических задач в текстовом файле (или базе данных) и использовать инструменты командной строки imagemagick для добавления текста проблемы на обои рабочего стола. Используйте cron, чтобы запланировать выполнение этого скрипта так часто (ежедневно?).

Получение экрана входа в систему с запросом на 3 различных вопроса потребует большого количества пользовательских взломов и, вероятно, потребует замены больших частей вашей системы, поэтому это не рекомендуется. Даже приведенный выше «простой» сценарий требует больших навыков и знаний и может привести к поломке вашей системы, если он будет сделан неправильно.

ImaginaryRobots
источник
Спасибо за Ваш ответ. Я собирался использовать мини-базу вопросов и ответов, и мне очень нравится идея использования imagemagik.
user187493