首页 > 编程问答 >当用户从 GUI 注销时如何使用用户命名空间运行脚本

当用户从 GUI 注销时如何使用用户命名空间运行脚本

时间:2024-07-21 00:30:09浏览次数:11  
标签:python logout rhel rhel7

当我使用登录用户运行时,我的 python 脚本可以完美运行。但我想在用户从 GUI RHEL 5 到 9 注销时运行该脚本。我尝试将脚本放入 /etc/gdm/PostSession/Default 中。但是 PostSession 内的脚本以 root 权限运行并获取登录用户 root。 当用户从 rhel gui 注销时,bash_logout 不起作用。

这是我的 python 脚本。

#!/usr/local/bin/python3.6
import json
import requests
import time
import os
import datetime

def get_logged_user():
    return os.getlogin()

with open(f'/tmp/{get_logged_user()}_session.json', 'r') as file:
    data = json.load(file)
    reference_id = data['reference_id']

# Update logout_time with current system time
data['logout_time'] = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")

# Make API request with updated data
url = 'https://api.example.com/upload'
response = requests.post(url, json=data)

# Write to JSON file 2 with reference_id as filename
logs_dir = '/logs'
output_file = os.path.join(logs_dir, f'{reference_id}.json')
#with open(output_file, 'r+') as file:
with open(output_file, 'r+') as file:
    data1 = json.load(file)
    data1.append(data)
    file.seek(0)
    json.dump(data1, file, indent=4)
os.remove(f'/tmp/{get_logged_user()}_session.json')

遇到的问题是,虽然注销脚本是在用户注销时触发的,但它是在不同的用户上下文(root)中运行的。因此,不能依赖环境来访问正确的用户数据。

以下是解决此问题的几种方法:

1. 使用 systemd 用户服务:

这是最干净和最可靠的方法。可以创建一个在用户登录时启动并在用户注销时停止的 systemd 用户服务。此服务可以在用户的上下文中运行的脚本。

  • 为的脚本创建一个服务文件(例如, ~/.config/systemd/user/my-logout-script.service ):
[Unit]
Description=Run my logout script

[Service]
User=%i
ExecStart=/path/to/your/script.py

[Install]
WantedBy=default.target
  • 启用并启动服务:
systemctl --user enable my-logout-script.service
systemctl --user start my-logout-script.service

2. 修改脚本以接受用户名作为参数:

可以修改脚本以接受用户名作为参数。然后,可以在 /etc/gdm/PostSession/Default 脚本中使用 $USER 环境变量获取用户名,并使用 sudo -u $USER 以用户的身份运行脚本:

#!/bin/bash

# Get the logged out user
username=$USER

# Run your script as the user
sudo -u "$username" /path/to/your/script.py

3. 使用 PAM 模块:

可以创建一个 PAM 模块,该模块将在用户注销时执行的脚本。这需要更深入的系统级编程知识。

关于的 Python 脚本:

  • 可以通过将 get_logged_user() 函数替换为以下内容来简化代码:
import os

def get_logged_user():
    return os.environ.get('USER')
  • 确保 /logs 目录存在并且脚本具有写入权限。

请记住,选择最适合的方法取决于的技能水平和特定环境的限制。

标签:python,logout,rhel,rhel7
From: 78772743

相关文章

  • 从 python 中的字符串列表中提取 def 定义函数的标签
    我想使用Python中的正常def过程创建函数,并将标签分配给从字符串列表中提取的命名空间。如何实现这一点?这个问题的动机:我正在创建一个与sympy兼容的python函数库,供数学家用于符号计算实验。许多函数需要初始化具有相关标签的多个对象的系统,这些标签分别由用户提供的字......
  • 在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取
    我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用MT681614位磁性编码器通过RaspberryPi的SPI连接读取绝对角度。我有以下问题:在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?对于编码......
  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......
  • 如何使用Python和Selenium模拟产品购买以获取库存信息
    我正在开发一项网络抓取服务,主要针对时尚行业。我的目标是提供有关产品的全面数据,包括库存水平。为了实现这一目标,我需要模拟购买以确定每种尺寸的产品的最大可用数量。我一直在使用Python和Selenium进行网络抓取部分,但在准确模拟购买方面面临着挑战检索股票信息的过程。......
  • 连接Python套接字的问题
    当我写“关闭”时,我试图让我的电报机器人关闭计算机。我不想将机器人连接到网站上的托管。我选择我的手机(AndroidRedmiNote10)作为托管。我在上面安装了Termux和Pydroid。我写了两个文件:main到我的电脑,client到我的手机。通过在计算机上运行这两个文件,一切正常。但是,当我在......
  • 如何修复导入 Numexpr Python 时的错误
    在Windows10Python3.7.9(IDLE)上,我成功安装了“pipinstallnumexpr”,但在“importnumexprasne”时出现错误:Traceback(最近一次调用):文件“<pyshell#21>”,第267行,位于将numexpr导入为ne文件“C:\Python379\lib\site-packages\numexpr_init_.py”......
  • 让 cpython 优化恒定条件
    我正在用Python编写需要尽可能高效运行的代码,但有时我需要深入挖掘调试语句。不要注释这些输入或输出(或者使用外部预处理器来处理代码,就像这里建议的那样Python相当于#ifdefDEBUG或这里如何在python中实现“#ifdef”?|||)我想在模块的开头定义一个变量......
  • 如何使用 for 循环在 python jupyter 笔记本中创建动态图?
    我正在学习本课关于用Python求解热方程。该课程指出,在求解热方程后,我们可以通过在循环中简单地调用pyplot.plot()来可视化解的动画图,其中下面的代码将动态绘制每次每个点的温度,从而得到一个动画情节(课程帖子中提供了动画情节的示例)。importnumpyfrommatplotlibi......
  • Python:动态爱心代码
    importrandomfrommathimportsin,cos,pi,logfromtkinterimport*CANVAS_WIDTH=640CANVAS_HEIGHT=480CANVAS_CENTER_X=CANVAS_WIDTH/2CANVAS_CENTER_Y=CANVAS_HEIGHT/2IMAGE_ENLARGE=11HEART_COLOR="#FF99CC"defcenter_......
  • 如何在 PYTHON 中查找输入数字的千位、百位、十位和个位中的数字?例如:256 有 6 个一、5
    num=int(input("Pleasegivemeanumber:"))print(num)thou=int((num//1000))print(thou)hun=int((num//100))print(hun)ten=int((num//10))print(ten)one=int((num//1))print(one)我尝试过这个,但它不起作用,我被困住了。代码几乎是正确的,但需......