로그인하기 전에이 질문들에 답해야합니다 3?


22

나는 수학 숙제를하지 않도록 우분투를 너무 좋아하는 두 아이가 있습니다. Monty Python의 정신으로 다음과 같은 것을 제시하고 싶습니다.

"중지하십시오. 죽음의 다리를 건너는 사람은 저에게 보이는 세 가지 질문에 답해야합니다."

로그인 할 때

로그인하기 전에 몇 가지 수학 문제를 해결해야합니다.

내 질문은 :이 유형의 일을 할 수 있습니까?


자체 xscreensaver 모듈을 작성하여이 작업을 수행 할 수 있습니까? 아니면 / etc / profile에 추가 하시겠습니까?
user187493

1
자신 만의 PAM (Pluggable Authentication Module)을 작성하고이를 lightdm greeter와 통합하는 방법을 살펴볼 수도 있습니다.
ImaginaryRobots

고마워 이것은 내가 찾고있는 조언의 종류입니다 :) 나는 내 시스템을 깨뜨리는 것을 두려워하지 않습니다. 내가 무언가를 깨뜨리지 않는다면 제대로하고 있지 않다고 생각합니다.
user187493

답변:


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

텍스트 기반 솔루션이 마음에 들지 않으면 몇 가지 질문을하고 간단한 답변을 확인하는 간단한 쉘 스크립트를 작성할 수는 없습니다. 대답이 정확하면 startx를 수행하고 그렇지 않으면 로그 아웃하십시오. 그런 다음 / etc / passwd를 편집하고이 스크립트를 로그인 쉘로 만드십시오. 위의 솔루션보다 덜 우아하지만 코딩 및 유지 관리가 더 간단합니다. 또한 비교적 배포판 / 데스크톱에 독립적이어야합니다. 또한 sigint (Ctrl_C)와 같은 것을 정상적으로 처리하는지 테스트해야합니다.
Joe

아주 좋아요! 이것이 제가 정말 좋아하는 종류입니다.
Jacob Vlijm

3

할 수 있지만, 기술적 인 노하우를 많이 걸릴 것이다. 루트로 실행되는 스크립트를 작성하여이를 수행하는 가장 간단한 방법은 다음과 같습니다.

  • 주어진 질문에 대한 답변으로 비밀번호를 자동 변경합니다.
  • 그들이 답변하려고하는 질문을 표시하기 위해 바탕 화면 배경 무늬를 변경

수학 문제 목록을 텍스트 파일 (또는 데이터베이스)로 유지하고 imagemagick 명령 줄 도구를 사용하여 문제 텍스트를 데스크탑 배경 무늬에 추가해야합니다. cron을 사용하여 스크립트가 너무 자주 실행되도록 예약하십시오 (매일?).

로그인 화면에 3 가지 다른 질문을하려면 많은 사용자 지정 해킹 이 필요하며 시스템의 많은 부분을 교체해야 할 수 있으므로 권장하지 않습니다. 위의 "간단한"스크립트조차 많은 기술과 지식이 필요하며 잘못 수행하면 시스템이 손상 될 수 있습니다.


답변 주셔서 감사합니다. 나는 질문과 답변의 미니 데이터베이스를 사용하려고했고 imagemagik을 사용하는 아이디어를 정말 좋아합니다.
user187493
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.