在您登录之前您必须回答我这 3 个问题吗?

在您登录之前您必须回答我这 3 个问题吗?

我有两个孩子非常喜欢 Ubuntu,以至于他们不再做数学作业。因此,本着 Monty Python 的精神,我想向他们赠送一些东西:

“停。谁要穿过死亡之桥,必须回答我这三个问题,然后才能看到另一边。”

在登录时。

他们必须先解决一些数学问题才能登录。

我的问题是:这种事能做到吗?

答案1

以下内容使用 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()

结果:

  • 如果您注销,在登录屏幕上您将看到一个名为“自定义”的新会话。
  • 通过选择自定义会话,成功登录后,您将看到一个小的 PyGtk(使用 pygobject)窗口,要求您回答数学难题。将没有顶部栏、启动器和其余默认桌面小部件:

自定义访问 Unity

  • 如果您回答正确,Unity 将加载...

虽然它需要进一步研究,但我希望它能作为一个起点提供帮助。

答案2

可以完成,但需要很多技术知识。最简单的方法是编写一个以 root 身份运行的脚本,该脚本:

  • 自动将密码更改为给定问题的答案,
  • 更改桌面壁纸以显示他们正在尝试回答的问题

您可能需要将数学问题列表保存在文本文件(或数据库)中,并使用 imagemagick 命令行工具将问题文本添加到桌面壁纸。使用 cron 安排该脚本每隔一段时间(每天?)运行一次。

要让登录屏幕询问 3 个不同的问题,需要很多自定义黑客攻击,可能涉及替换系统的大部分内容,因此不建议这样做。即使是上述“简单”脚本也需要大量技能和知识,如果操作不当,可能会破坏您的系统。

相关内容