登录之前,您必须回答以下这些问题3?


22

我有两个孩子非常喜欢Ubuntu,以至于他们没有做数学作业。因此,本着Monty Python的精神,我想向他们介绍以下内容:

“停下来。谁能越过死亡之桥,就必须在我看到的另一边回答我这三个问题。”

在登录时。

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

我的问题是:可以做这种事情吗?


我可以通过编写自己的xscreensaver模块来做到这一点吗?还是将其添加到/ etc / profile?
2013年

1
您可能还需要研究编写自己的可插入身份验证模块(PAM),以及如何将其与lightdm迎宾程序集成。
ImaginaryRobots

谢谢,这正是我一直在寻找的建议:)我不太担心破坏系统。我认为,如果我没有破坏某件事,那我做错了。
user187493 2013年

Answers:


30

以下是使用Gtk绑定(PyGobject)在Ubuntu 13.04和系统的Python上进行的测试。

这是一种有点脏的方法,但需要更多调查:

摘要

  • 添加.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

如果您不介意基于文本的解决方案,那么您是否只能编写一个简单的shell脚本来询问一些问题并检查答案。如果答案正确,则执行startx,否则,注销。然后,编辑/ etc / passwd并将此脚本作为登录外壳。与上面的解决方案相比,它不那么优雅,但更易于编码和维护。它也应该相对独立于发行版/桌面。您还需要对其进行测试,以确保它能够正常处理sigint(Ctrl_C)之类的事情。

非常好!这是我真正喜欢的东西。
Jacob Vlijm 2014年

3

可以做,但需要占用大量的专有技术的。编写作为root用户运行的脚本的最简单方法是:

  • 自动将其密码更改为给定问题的答案,
  • 更改其桌面墙纸以显示他们试图回答的问题

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

要使登录屏幕询问3个不同的问题,将需要进行大量的自定义黑客操作,并且可能涉及更换系统的大部分内容,因此不建议这样做。即使上面的“简单”脚本也需要大量的技能和知识,并且如果操作不当,可能会破坏系统。


感谢您的回答。我打算使用一个小型的问题和答案数据库,我真的很喜欢使用imagemagik的想法。
user187493 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.