如何在Python中使用setuid让指定代码段以普通用户身份运行?
解决方案
方法1:拆分代码,通过subprocess以普通用户执行
把需要普通用户运行的音频控制逻辑单独存为一个独立脚本,比如命名为audio_control.py:
import alsaaudio def set_and_get_volume(): m = alsaaudio.Mixer('Capture') m.setvolume(10) vol = m.getvolume() print(vol[0]) # 输出音量值,供主脚本读取 if __name__ == "__main__": set_and_get_volume()
在你的主脚本app.py中,使用subprocess调用普通用户身份执行这个脚本(替换your_user为你的实际普通用户名):
import subprocess # 替换为你的普通用户名 NORMAL_USER = "your_user" # 调用普通用户的Python解释器执行音频控制脚本 result = subprocess.run( ["sudo", "-u", NORMAL_USER, "python3", "/绝对路径/audio_control.py"], capture_output=True, text=True ) if result.returncode == 0: volume = int(result.stdout.strip()) print(f"当前捕获音量:{volume}") else: print(f"执行出错:{result.stderr}")
方法2:在主脚本中临时切换用户身份
直接在主脚本内切换进程的uid/gid,执行完音频逻辑后再恢复root权限(需要提前获取普通用户的uid和gid,可通过id -u your_user和id -g your_user命令查看):
import os import alsaaudio # 保存root身份的uid和gid root_uid = os.getuid() root_gid = os.getgid() # 替换为你的普通用户uid和gid NORMAL_UID = 1000 NORMAL_GID = 1000 try: # 切换到普通用户身份 os.setgid(NORMAL_GID) os.setuid(NORMAL_UID) # 执行音频控制代码 m = alsaaudio.Mixer('Capture') m.setvolume(10) vol = m.getvolume() print(f"捕获音量:{vol[0]}") finally: # 必须恢复root身份,保证后续需要权限的代码正常运行 os.setuid(root_uid) os.setgid(root_gid)
注意事项
- 方法2中,切换身份后尽量只执行音频相关逻辑,避免触发其他权限问题,且必须在
finally块中恢复root权限。 - 确保普通用户拥有音频设备操作权限,若没有可执行
sudo usermod -aG audio your_user将用户加入audio组。
内容的提问来源于stack exchange,提问作者user19127009
相关产品推荐
相关产品推荐

