SSH远程执行PyAutoGUI模拟Linux应用点击无响应问题排查
解决SSH远程sudo运行PyAutoGUI时DISPLAY环境变量失效问题
问题根源
sudo默认会重置大部分环境变量(包括DISPLAY),你手动执行时是先在当前shell设置了DISPLAY=:0.0,再用sudo运行脚本,此时sudo临时保留了当前shell的环境;但把export DISPLAY=:0.0写进脚本后,这行代码是在普通用户权限的脚本进程中执行的,sudo启动的python进程不会继承这个变量,依然使用SSH会话默认的DISPLAY=10.0,导致PyAutoGUI无法连接到本地显示的应用。
解决方案
以下是三种可行的解决方式,按需选择:
1. 用sudo -E保留环境变量运行
先在SSH会话中手动执行环境配置,再用-E参数让sudo保留当前shell的环境变量:
export DISPLAY=:0.0 xhost +SI:localuser:root sudo -E python3 XXX.py
如果想整合到脚本(比如run_click.sh),脚本内容如下:
#!/bin/bash export DISPLAY=:0.0 xhost +SI:localuser:root sudo -E python3 XXX.py
给脚本加执行权限后直接运行:chmod +x run_click.sh && ./run_click.sh
2. 在sudo命令中直接指定DISPLAY
不需要提前export,直接在sudo调用python时传递环境变量,同时确保xhost命令以普通用户权限执行(xhost针对当前登录用户的X访问控制):
xhost +SI:localuser:root sudo DISPLAY=:0.0 python3 XXX.py
如果是纯Python脚本,可通过subprocess执行xhost,再强制设置环境变量:
import subprocess import os import pyautogui # 以普通用户权限执行xhost(不要加sudo) subprocess.run(["xhost", "+SI:localuser:root"], check=True) # 强制为当前进程设置DISPLAY os.environ["DISPLAY"] = ":0.0" # 执行点击操作示例 pyautogui.click(200, 300)
运行这个Python脚本时直接用sudo python3 XXX.py即可。
3. 修改sudoers配置永久保留DISPLAY
如果需要长期解决这个问题,可修改sudoers配置让其默认保留DISPLAY变量:
- 执行
sudo visudo打开sudoers编辑界面 - 添加一行配置:
Defaults env_keep += "DISPLAY" - 保存退出后,后续sudo运行命令时会自动继承当前shell的
DISPLAY变量
注意:此为全局配置,仅在可信环境中使用,避免带来安全风险。
内容的提问来源于stack exchange,提问作者Ringo
相关产品推荐
相关产品推荐

