我编写了一个简单的python脚本,只要我的linux系统上的某个用户登录就会运行。它要求输入密码......但问题是他们只是退出终端或最小化它并继续使用计算机。所以基本上它是一个密码验证脚本。所以我很好奇的是如何让python脚本保持正常,不要让他们退出或做任何其他事情,直到他们输入正确的密码。是否有一些我需要导入的模块或一些可以暂停系统功能的命令,直到我的python脚本完成?
由于
我只是出于兴趣而这样做,我知道很多可能会出错但我认为这将是一件有趣的事情。它甚至可以保护1个特定的系统进程。我很好奇如何暂停系统并让用户先做python脚本。
答案 0 :(得分:3)
用户总会有办法通过你的脚本。
让我们暂时假设您实际上设法阻止X服务器,而不阻止对程序的输入(因此用户仍然可以输入密码)。用户只需将alt-f1从X-server中移出到控制台并杀死“你的怪异应用程序”。如果你设法阻止它,他可以ssh到框并杀死你的应用程序。
肯定没有通用的方法来做这样的事情;这是控制台的登录命令和图形显示的会话管理器(如gdm)的用途:它们要求用户在给他某种形式的交互式会话之前输入他的密码。在那之后,为什么你还想要另一个密码来做同样的事情?系统的目的是不让用户在没有密码(或其他形式的身份验证)的情况下使用它,但是没有API可以让程序在任何时候阻止系统。
答案 1 :(得分:2)
您希望等效于“模态”窗口,但在多用户,多任务环境中(直接)这不可能。
下一个最好的事情是阻止用户访问系统。例如,如果您创建一个与显示一样大的不可见窗口,那将拦截任何鼠标事件,并且“后面”的任何内容将无法访问。
此时您遇到的问题是阻止用户使用键盘终止应用程序,或者切换到另一个应用程序或另一个虚拟控制台(这可能是最困难的)。所以你需要访问和锁定键盘,不仅是“标准”键盘,还有低级键。
要做到这一点,您的应用程序需要具有管理权限,然后在用户环境中运行。除非你真的知道你在做什么,否则它看起来像是灾难的秘诀。
您想要做的事情应该通过可与您的显示管理器集成的可插拔验证模块(PAM)来完成。也许,你可以找到一些PAM模块,它将“外包”或“回调”一些外部程序,即你的Python脚本。
答案 2 :(得分: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 ...
如果用户现在关闭终端或终止进程,他将立即退出:)