Trước khi đăng nhập bạn phải trả lời tôi 3 câu hỏi này?


22

Tôi có hai đứa trẻ yêu Ubuntu rất nhiều đến nỗi chúng không làm bài tập Toán. Vì vậy, theo tinh thần của Monty Python, tôi muốn trình bày với họ một cái gì đó như:

"Dừng lại. Ai đi qua Cầu tử thần phải trả lời tôi ba câu hỏi này, đây là mặt khác mà anh ta thấy."

lúc đăng nhập

Họ sẽ phải giải một vài bài toán trước khi có thể đăng nhập.

Câu hỏi của tôi là: loại điều này có thể được thực hiện?


Tôi có thể làm điều này bằng cách viết mô-đun xscreenaver của riêng tôi không? Hoặc có thể thêm nó vào / etc / profile?
dùng187493

1
Bạn cũng có thể muốn xem xét việc viết Mô-đun xác thực có thể cắm (PAM) của riêng bạn và cách tích hợp nó với công cụ chào mừng lightdm.
ImaginaryRobots

Cảm ơn đây chính xác là loại lời khuyên mà tôi đang tìm kiếm :) Tôi không quá sợ phá vỡ hệ thống của mình. Tôi nghĩ rằng nếu tôi không phá vỡ một cái gì đó tôi không làm đúng.
dùng187493

Câu trả lời:


30

Sau đây được thử nghiệm với Ubuntu 13.04 và Python của hệ thống, sử dụng các liên kết Gtk (PyGobject).

Đây là một cách hơi bẩn và nó cần được điều tra nhiều hơn:

Tóm lược

  • Thêm một .desktoptập tin tại /usr/share/xsessionschúng tôi sẽ đặt tên cho nócustom

  • Thêm một .xsessiontệp tại người dùng trong câu hỏi (con bạn), chúng tôi sẽ đặt tên người dùng của họ làkid

  • Tạo ứng dụng GUI Python cho câu đố toán học và chạy nó từ đó .xsession, chúng tôi sẽ đặt tên cho nó làpuzzle.py

Chi tiết

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

Thêm vào sau đây trong tập tin:

[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

Thêm vào sau đây trong tập tin:

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

Thêm vào sau đây trong tập tin:

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

Các kết quả:

  • Nếu bạn đăng xuất, tại màn hình đăng nhập, bạn sẽ thấy một phiên mới có tên Tùy chỉnh.
  • Bằng cách chọn phiên tùy chỉnh và sau khi đăng nhập thành công, bạn sẽ thấy một cửa sổ PyGtk (sử dụng pygobject) nhỏ yêu cầu một câu đố toán học. Sẽ không có thanh trên cùng, trình khởi chạy và phần còn lại của các tiện ích máy tính để bàn mặc định:

Truy cập tùy chỉnh vào Unity

  • Nếu bạn trả lời đúng, Unity sẽ tải ...

Nó cần nghiên cứu thêm mặc dù tôi hy vọng rằng nó sẽ giúp như một điểm khởi đầu.


@ user187493 Nếu bạn cho rằng vấn đề của mình đã được giải quyết, hãy cân nhắc chấp nhận câu trả lời.
Stef K

Nếu bạn không quan tâm đến một giải pháp dựa trên văn bản, bạn không thể viết một tập lệnh shell đơn giản hỏi một vài câu hỏi và kiểm tra câu trả lời. Nếu câu trả lời là chính xác, thì hãy bắt đầu, nếu không, hãy đăng xuất. Sau đó, chỉnh sửa / etc / passwd và biến tập lệnh này thành vỏ đăng nhập của chúng. Đó là cách ít thanh lịch hơn so với giải pháp trên, nhưng cách đơn giản hơn để mã hóa và bảo trì. Nó cũng nên tương đối distro / desktop. Bạn cũng sẽ cần phải kiểm tra nó để đảm bảo nó xử lý những thứ như sigint (Ctrl_C) một cách duyên dáng.
Joe

Rất đẹp! đây là những thứ mà tôi thực sự thích
Jacob Vlijm

3

có thể được thực hiện, nhưng sẽ mất rất nhiều bí quyết kỹ thuật. Cách đơn giản nhất để làm điều này bằng cách viết một tập lệnh chạy dưới quyền root:

  • tự động thay đổi mật khẩu của họ thành câu trả lời của một câu hỏi nhất định,
  • thay đổi hình nền máy tính để hiển thị câu hỏi họ đang cố gắng trả lời

Bạn có thể cần phải giữ danh sách các vấn đề toán học trong một tệp văn bản (hoặc cơ sở dữ liệu) và sử dụng các công cụ dòng lệnh fantemagick để thêm văn bản vấn đề vào hình nền máy tính. Sử dụng cron để lên lịch cho tập lệnh đó để chạy thường xuyên (hàng ngày?).

Bắt màn hình đăng nhập để hỏi 3 câu hỏi khác nhau sẽ đòi hỏi rất nhiều hack tùy chỉnh và có thể sẽ liên quan đến việc thay thế các phần lớn trong hệ thống của bạn, vì vậy nó không được khuyến khích. Ngay cả kịch bản "đơn giản" ở trên cũng đòi hỏi nhiều kỹ năng và kiến ​​thức và có khả năng phá vỡ hệ thống của bạn nếu làm sai.


Cảm ơn câu trả lời của bạn. Tôi sẽ sử dụng một cơ sở dữ liệu nhỏ các câu hỏi và câu trả lời và tôi thực sự thích ý tưởng sử dụng hình ảnh.
dùng187493
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.