로그인하기 전에이 질문들에 답해야합니다 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.