如何在sudo运行的Python脚本中以普通用户身份启动Selenium?
在sudo脚本中单独让Selenium以普通用户运行的解决方案
当然可以,给你两种实用的实现方式:
方法1:把Selenium逻辑抽成独立脚本,切换用户执行
把处理深度链接和Selenium的代码单独存成一个独立脚本(比如selenium_auth.py),确保普通用户有读和执行权限。然后在你的sudo主脚本里,用su或者runuser命令切换到普通用户来运行这个脚本,主脚本其他部分依然保持sudo权限。
示例代码:
import subprocess # 替换成你的普通用户名 normal_user = "your_username" # 替换成Selenium脚本的实际路径 selenium_script_path = "/home/your_username/scripts/selenium_auth.py" # 用runuser执行(sudo环境下更稳定) subprocess.run( ["runuser", "-u", normal_user, "--", "python3", selenium_script_path], check=True, capture_output=True )
如果用su的话,写法是:
subprocess.run( ["su", "-", normal_user, "-c", f"python3 {selenium_script_path}"], check=True )
方法2:在主脚本中临时切换用户执行Selenium代码
直接在Python脚本里切换到普通用户UID,然后初始化Selenium。这种方法不用拆分脚本,但要注意环境变量的问题。
示例代码:
import os import pwd from selenium import webdriver # 替换成你的普通用户名 normal_user = "your_username" user_info = pwd.getpwnam(normal_user) # 保存当前sudo环境下的必要环境变量(比如图形界面相关的) display_env = os.environ.get("DISPLAY") xauth_env = os.environ.get("XAUTHORITY") # 切换到普通用户UID os.setuid(user_info.pw_uid) # 恢复必要的环境变量,否则浏览器可能启动失败 os.environ["DISPLAY"] = display_env os.environ["XAUTHORITY"] = xauth_env # 接下来正常执行Selenium逻辑 driver = webdriver.Chrome() # 处理深度链接打开应用、认证等操作... driver.quit() # 注意:setuid后无法再切换回root,所以如果主脚本后续还有sudo操作,建议用方法1
注意事项
- 确保普通用户有权限访问浏览器驱动、目标应用,以及脚本用到的文件
- 远程SSH执行时,要确保X11转发已经开启(如果Selenium需要图形界面)
- 方法1更稳妥,因为它把Selenium的运行环境完全隔离在普通用户下,避免环境变量冲突
内容的提问来源于stack exchange,提问作者Gilbert Williams
相关产品推荐
相关产品推荐

