Sebelum Anda masuk, Anda harus menjawab pertanyaan saya 3 ini?

22

Saya punya dua anak yang sangat mencintai Ubuntu sehingga mereka tidak mengerjakan pekerjaan rumah Matematika mereka. Jadi dengan semangat Monty Python, saya ingin memberi mereka sesuatu seperti:

"Berhenti. Siapa yang akan menyeberangi Jembatan Kematian harus menjawab kepadaku tiga pertanyaan ini, sebelum sisi lain yang dilihatnya."

saat masuk.

Mereka harus menyelesaikan beberapa masalah matematika sebelum dapat masuk.

Pertanyaan saya adalah: bisakah hal semacam ini dilakukan?

pengguna187493
sumber
Bisakah saya melakukan ini dengan menulis modul xscreensaver saya sendiri? Atau mungkin menambahkannya ke / etc / profile?
user187493
1
Anda mungkin juga ingin melihat ke dalam menulis Modul Otentikasi Pluggable (PAM) Anda sendiri dan bagaimana mengintegrasikannya dengan penyapa lightdm.
ImaginaryRobots
Terima kasih, inilah jenis saran yang saya cari :) Saya tidak terlalu takut merusak sistem saya. Saya pikir jika saya tidak melanggar sesuatu, saya tidak melakukannya dengan benar.
user187493

Jawaban:

30

Berikut ini diuji dengan Ubuntu 13.04 dan sistem Python, menggunakan Gtk bindings (PyGobject).

Ini adalah salah satu cara yang agak kotor dan perlu penyelidikan lebih lanjut:

Ringkasan

  • Tambahkan .desktopfile di /usr/share/xsessionskami akan beri namacustom

  • Tambahkan .xsessionfile pada pengguna yang dipermasalahkan (anak-anak Anda) kami beri nama pengguna merekakid

  • Buat aplikasi Python GUI untuk puzzle matematika dan jalankan dari .xsession, kita akan menamainya sebagaipuzzle.py

Detail

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

Tambahkan yang berikut dalam file:

[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

Tambahkan yang berikut dalam file:

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

Tambahkan yang berikut dalam file:

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

Hasil:

  • Jika Anda keluar, pada layar masuk Anda akan melihat sesi baru bernama Kustom.
  • Dengan memilih sesi khusus dan setelah login berhasil, Anda akan disajikan oleh jendela PyGtk kecil (menggunakan pygobject) meminta puzzle matematika. Tidak akan ada bilah atas, peluncur, dan widget desktop default lainnya:

Akses khusus ke Unity

  • Jika Anda menjawab dengan benar, Unity akan memuat ...

Perlu penelitian lebih lanjut, tetapi saya harap ini membantu sebagai titik awal.

Stef K
sumber
@ user187493 Jika Anda menganggap bahwa masalah Anda sudah terpecahkan, pertimbangkan untuk menerima jawabannya.
Stef K
Jika Anda tidak keberatan dengan solusi berbasis teks, tidak bisakah Anda menulis skrip shell sederhana yang menanyakan beberapa pertanyaan dan memeriksa jawabannya. Jika jawabannya benar, maka lakukan startx, jika tidak, lakukan logout. Kemudian, edit / etc / passwd dan buat skrip ini sebagai shell login mereka. Ini jauh lebih elegan daripada solusi di atas, tetapi lebih sederhana untuk kode dan pemeliharaan. Itu juga harus relatif distro / desktop independen. Anda juga perlu mengujinya untuk memastikan itu menangani hal-hal seperti sigint (Ctrl_C) dengan anggun.
Joe
Sangat bagus! ini adalah hal-hal yang sangat saya sukai.
Jacob Vlijm
3

Itu bisa dilakukan, tetapi akan membutuhkan banyak pengetahuan teknis. Cara paling sederhana untuk melakukan ini dengan menulis skrip yang dijalankan sebagai root yang:

  • mengubah kata sandi mereka secara otomatis ke jawaban pertanyaan yang diberikan,
  • mengubah wallpaper desktop mereka untuk menampilkan pertanyaan yang mereka coba jawab

Anda mungkin perlu menyimpan daftar masalah matematika dalam file teks (atau database), dan menggunakan alat baris perintah imagemagick untuk menambahkan teks masalah ke wallpaper desktop. Gunakan cron untuk menjadwalkan skrip itu agar sering dijalankan (setiap hari?).

Mendapatkan layar masuk untuk menanyakan 3 pertanyaan berbeda akan membutuhkan banyak peretasan khusus dan mungkin melibatkan penggantian sebagian besar sistem Anda, sehingga tidak disarankan. Bahkan skrip "sederhana" di atas membutuhkan banyak keterampilan dan pengetahuan, dan berpotensi merusak sistem Anda jika melakukan kesalahan.

ImaginaryRobots
sumber
Terima kasih atas jawaban anda. Saya akan menggunakan database mini pertanyaan dan jawaban dan saya sangat suka ide menggunakan imagemagik.
user187493