0

我编写了一个简单的 python 脚本,只要我的 linux 系统上的某个用户登录,它就会运行。它要求输入密码……但是问题是他们只是退出终端或将其最小化并继续使用计算机。所以基本上它是一个密码认证脚本。所以我很好奇的是如何让python脚本保持运行,在输入正确密码之前不让它们退出或做任何其他事情。是否有一些我需要导入的模块或一些可以暂停系统功能的命令,直到我的 python 脚本完成?

谢谢

我这样做只是出于兴趣,我知道很多事情可能会出错,但我认为这将是一件有趣的事情。它甚至可以保护 1 个特定的系统进程。我只是好奇如何暂停系统并让用户先执行 python 脚本。

4

3 回答 3

3

用户总会有办法通过您的脚本。

让我们假设您实际上设法阻止了 X 服务器,而没有阻止对程序的输入(因此用户仍然可以输入密码)。用户可以从 X-server 到控制台的 alt-f1 并杀死“你奇怪的应用程序”。如果你也设法阻止它,他可以通过 ssh 连接到盒子并杀死你的应用程序。

肯定没有通用的方法来做这样的事情;这就是控制台的登录命令和图形显示的会话管理器(如 gdm)的用途:它们要求用户在给他某种形式的交互式会话之前输入他的密码。在那之后,你为什么还要另一个密码来做同样的事情?该系统旨在不允许用户在没有密码(或其他形式的身份验证)的情况下使用它,但没有 API 可以让程序在他们愿意时阻止系统。

于 2012-08-26T21:20:16.843 回答
2

您想要等效于“模态”窗口,但这在多用户、多任务环境中(直接)是不可能的。

下一个最好的事情是阻止用户访问系统。例如,如果您创建一个与显示器一样大的不可见窗口,它将拦截任何鼠标事件,并且“后面”的任何内容都将无法访问。

此时,您遇到了阻止用户使用键盘来终止应用程序、切换到另一个应用程序或另一个虚拟控制台的问题(这可能是最困难的)。所以你需要访问和锁定键盘,不仅是“标准”键盘,还有低级键。

为此,您的应用程序需要具有管理权限,并在用户环境中运行。除非您真的知道自己在做什么,否则这开始看起来像是灾难的秘诀。

您想要做的事情应该通过与您的显示管理器集成的可插入身份验证模块 (PAM) 来完成。也许,您可以找到一些 PAM 模块来“外包”或“回调”一些外部程序,即您的 Python 脚本。

于 2012-08-26T21:25:54.230 回答
0

由于这只是为了好玩,所以这里有一个工作:如果用户在一段时间内忽略提示,或者关闭终端/终止进程,则让脚本将用户注销。以下是 gnome 的样子:

import os

def set_exit_handler(func):
    import signal
    signal.signal(signal.SIGHUP, func) # on closing the terminal
    signal.signal(signal.SIGTERM, func) # on killing the process

    import atexit
    atexit.register(func) # on Ctrl-C, Ctrl-D and other proper exits

if __name__ == "__main__":
    def on_exit(a=None, b=None):
        print "exit handler triggered"
        os.system("gnome-session-quit --logout --no-prompt")
    set_exit_handler(on_exit)

    print "Enter password:"
    raw_input()
    # ... some verification/timeout code ...

如果用户现在将关闭终端或终止进程,他将立即注销:)

于 2012-08-26T22:52:40.707 回答