ログインする前に、これらの質問に答えてください3?


22

Ubuntuが大好きな2人の子供がいるので、数学の宿題をしていません。モンティパイソンの精神で、次のようなものを提示したいと思います。

「やめなさい。死の橋を渡るのは、彼が見る反対側から、これらの質問3に答えなければならない。」

ログイン時に。

ログインする前に、いくつかの数学の問題を解決する必要があります。

私の質問はこういうことです。


独自のxscreensaverモジュールを作成してこれを行うことはできますか?それとも/ etc / profileに追加しますか?
user187493

1
また、独自のPluggable Authentication Module(PAM)を作成し、それをlightdm greeterと統合する方法を検討することもできます。
ImaginaryRobots

ありがとう、これはまさに私が探していた種類の助言です:)私は自分のシステムを壊すことを恐れていません。何かを壊していないのか、正しくしていないのかを考えます。
user187493

回答:


30

以下は、Gtkバインディング(PyGobject)を使用して、Ubuntu 13.04とシステムのPythonでテストされています。

これは少し汚い方法の1つであり、さらに調査が必要です。

概要

  • 名前を付けて.desktopファイルを追加します/usr/share/xsessionscustom

  • .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()

結果:

  • ログアウトすると、ログイン画面にカスタムという名前の新しいセッションが表示されます。
  • カスタムセッションを選択し、ログインに成功すると、小さなPyGtk(pygobjectを使用)ウィンドウが表示され、数学パズルを要求されます。トップバー、ランチャー、およびその他のデフォルトのデスクトップウィジェットはありません。

Unityへのカスタムアクセス

  • 正解すると、Unityがロードされます...

ただし、さらに調査する必要がありますが、出発点として役立つことを願っています。


@ user187493問題が解決したと思われる場合は、回答を受け入れることを検討してください。
Stef K

テキストベースのソリューションを気にしないのであれば、いくつかの質問をして答えを確認する簡単なシェルスクリプトを書くことはできません。答えが正しければ、startxを実行し、そうでなければログアウトを実行します。次に、/ etc / passwdを編集し、このスクリプトをログインシェルにします。上記のソリューションほどエレガントではありませんが、コーディングと保守が簡単です。また、比較的ディストリビューション/デスクトップから独立している必要があります。また、それをテストして、sigint(Ctrl_C)などが適切に処理されることを確認する必要があります。
ジョー

非常に素晴らしい!これは私が本当に好きなものです。
ジェイコブVlijm 14

3

それはできますが、多くの技術的ノウハウが必要です。これを行う最も簡単な方法は、rootとして実行されるスクリプトを記述することです。

  • 指定された質問の答えにパスワードを自動的に変更します。
  • デスクトップの壁紙を変更して、回答しようとしている質問を表示します

数学の問題のリストをテキストファイル(またはデータベース)に保存し、imagemagickコマンドラインツールを使用して、問題のテキストをデスクトップの壁紙に追加する必要があります。cronを使用して、そのスクリプトを頻繁に(毎日?)実行するようにスケジュールします。

ログイン画面に3つの異なる質問を入力するには、多くのカスタムハッキングが必要であり、おそらくシステムの大部分を交換する必要があるため、お勧めしません。上記の「単純な」スクリプトでさえ、多くのスキルと知識を必要とし、間違った方法でシステムを破壊する可能性があります。


ご回答有難うございます。質問と回答のミニデータベースを使用するつもりでしたが、imagemagikを使用するというアイデアが本当に好きです。
user187493
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.