当我使用登录用户运行时,我的 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