ก่อนที่คุณจะเข้าสู่ระบบคุณต้องตอบคำถามเหล่านี้ 3?


22

ฉันมีลูกสองคนที่รัก Ubuntu มากจนพวกเขาไม่ทำการบ้านคณิตศาสตร์ ดังนั้นด้วยจิตวิญญาณของ Monty Python ฉันต้องการนำเสนอสิ่งเหล่านี้ด้วย:

"หยุดใครจะข้ามสะพานแห่งความตายจะต้องตอบคำถามเหล่านี้ให้ฉันสามข้อก่อนที่เขาจะเห็น"

ที่เข้าสู่ระบบ

พวกเขาจะต้องแก้ปัญหาคณิตศาสตร์บางอย่างก่อนจึงจะสามารถลงชื่อเข้าใช้ได้

คำถามของฉันคือ: สามารถทำสิ่งนี้ได้ไหม?


ฉันสามารถทำได้โดยการเขียนโมดูล xscreensaver ของฉันเอง? หรืออาจเพิ่มลงในโปรไฟล์ / etc /?
user187493

1
คุณอาจต้องการเขียน Pluggable Authentication Module (PAM) ของคุณเองและวิธีการรวมเข้ากับ lightdm greeter
ImaginaryRobots

ขอบคุณนี่เป็นคำแนะนำที่ฉันกำลังมองหา :) ฉันไม่กลัวที่จะทำลายระบบของฉัน ฉันคิดว่าถ้าฉันไม่ทำอะไรบางอย่างที่ฉันทำไม่ถูก
user187493

คำตอบ:


30

ต่อไปนี้เป็นการทดสอบกับ Ubuntu 13.04 และ Python ของระบบโดยใช้ Gtk bindings (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 แบบกำหนดเอง

  • หากคุณตอบถูกต้องความสามัคคีจะโหลด ...

มันต้องการการวิจัยเพิ่มเติม แต่ฉันหวังว่ามันจะช่วยเป็นจุดเริ่มต้น


@ user187493 หากคุณพิจารณาว่าปัญหาของคุณได้รับการแก้ไขแล้วให้ลองยอมรับคำตอบ
Stef K

หากคุณไม่สนใจโซลูชันที่ใช้ข้อความคุณไม่สามารถเขียนเชลล์สคริปต์แบบง่าย ๆ ที่ถามคำถามสองสามข้อและตรวจสอบคำตอบได้ หากคำตอบนั้นถูกต้องให้ทำการ startx มิฉะนั้นให้ออกจากระบบ จากนั้นแก้ไข / etc / passwd และทำให้สคริปต์นี้เป็นเชลล์การเข้าสู่ระบบ เป็นวิธีที่น้อยกว่าวิธีที่กล่าวมาข้างต้น แต่วิธีที่ง่ายกว่าในการเขียนโค้ดและดูแลรักษา มันควรจะเป็นอิสระ distro / desktop คุณจะต้องทดสอบเพื่อให้แน่ใจว่ามันจัดการสิ่งต่าง ๆ เช่น sigint (Ctrl_C) ได้อย่างสง่างาม
โจ

ดีมาก! นี่คือสิ่งที่ฉันชอบ
Jacob Vlijm

3

มันสามารถทำได้ แต่จะใช้เวลามากของความรู้ทางด้านเทคนิค วิธีที่ง่ายที่สุดในการทำเช่นนี้โดยการเขียนสคริปต์ที่ทำงานเหมือนรูทที่:

  • เปลี่ยนรหัสผ่านโดยอัตโนมัติเป็นคำตอบของคำถามที่ได้รับ
  • เปลี่ยนรูปพื้นหลังของเดสก์ท็อปเพื่อแสดงคำถามที่พวกเขาพยายามตอบ

คุณอาจต้องเก็บรายการปัญหาทางคณิตศาสตร์ไว้ในไฟล์ข้อความ (หรือฐานข้อมูล) และใช้เครื่องมือบรรทัดคำสั่ง imagemagick เพื่อเพิ่มข้อความปัญหาลงในรูปพื้นหลังของเดสก์ท็อป ใช้ cron เพื่อกำหนดตารางเวลาให้สคริปต์ทำงานทุก ๆ ครั้ง (ทุกวัน?)

การรับหน้าจอเข้าสู่ระบบเพื่อถามคำถามที่แตกต่างกัน 3 ข้อจะต้องมีการแฮ็กที่กำหนดเองจำนวนมากและอาจเกี่ยวข้องกับการแทนที่ส่วนใหญ่ของระบบของคุณดังนั้นจึงไม่แนะนำ แม้แต่สคริปต์ "แบบง่าย" ด้านบนยังต้องการทักษะและความรู้มากมายและอาจทำลายระบบของคุณหากทำผิด


ขอบคุณสำหรับคำตอบ. ฉันจะใช้ฐานข้อมูลขนาดเล็กของคำถามและคำตอบและฉันชอบความคิดในการใช้ imagemagik
user187493
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.