Перш ніж увійти, ви повинні відповісти на ці 3 питання?


22

У мене є двоє дітей, які так люблять Ubuntu, що вони не виконують домашні завдання з математики. Тож, в дусі Монті Пітона, я хотів би представити їм щось на кшталт:

"Зупиніться. Хто перейшов би Міст смерті, повинен відповісти мені на ці три питання, будь-яка інша сторона, яку він бачить".

при вході в.

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

Моє запитання: чи можна таке робити?


Чи можу я це зробити, написавши власний модуль xscreensaver? Чи, можливо, додати його до / etc / profile?
користувач187493

1
Ви також можете розглянути можливість написання власного модуля аутентифікації, що підключається (PAM), і як його інтегрувати з привітанням lightdm.
ImaginaryRobots

Дякую, це саме та порада, яку я шукав :) Я не надто боюся зламати свою систему. Я рахую, якщо я щось не ламаю, я не роблю це правильно.
користувач187493

Відповіді:


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 Якщо ви вважаєте, що ваша проблема вирішена, подумайте про прийняття відповіді.
Стеф К

Якщо ви не заперечуєте над текстовим рішенням, не могли б ви просто написати простий скрипт оболонки, який задає кілька питань і перевіряє відповіді. Якщо відповіді правильні, тоді робіть старткс, інакше зробіть вихід. Потім відредагуйте / etc / passwd і зробіть цей сценарій своєю вхідною оболонкою. Це менш елегантно, ніж вищезазначене рішення, але простіше кодувати та підтримувати. Він також повинен бути відносно дистрибутивом / робочим столом. Вам також потрібно перевірити його, щоб переконатися, що він граціозно обробляє такі речі, як sigint (Ctrl_C).
Джо

Дуже хороша! це такі речі, які мені дуже подобаються.
Яків Влійм

3

Це можна зробити, але знадобиться багато технічних ноу-хау. Найпростіший спосіб зробити це, написавши сценарій, який запускається як root, який:

  • автоматично змінює свої паролі на відповідь на задане питання,
  • змінюють шпалери для робочого столу, щоб відобразити питання, на які вони намагаються відповісти

Вам, ймовірно, доведеться зберігати список математичних проблем у текстовому файлі (або базі даних) та використовувати інструменти командного рядка imagemagick для додавання проблемного тексту на шпалери робочого столу. Використовуйте cron для планування цього сценарію для запуску кожного так часто (щодня?).

Отримання екрана для входу, щоб задати 3 різні запитання, потребує великої кількості користувацьких злому і, ймовірно, передбачає заміну великих частин вашої системи, тому це не рекомендується. Навіть описаний вище "простий" сценарій вимагає багато навичок і знань, і він може зламати вашу систему, якщо зробити це неправильно.


Дякую за вашу відповідь. Я збирався використовувати міні-базу запитань і відповідей, і мені дуже подобається ідея використання imagemagik.
користувач187493
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.