通过SSH执行PyQt文件遇X11认证错误求助
解决SSH运行PyQt GUI时的X11认证失败问题
我碰到过不少远程运行PyQt GUI时的X11转发坑,咱们一步步来排查你这个X11 connection rejected because of wrong authentication和QXcbConnection的报错:
一、先再核对核心配置(别嫌麻烦,细节容易漏)
虽然你说已经检查过X11转发,但有些小细节可能没注意到:
- 客户端(本地机器):连接时一定要用
-Y参数(信任X11转发,比-X的严格认证更兼容),命令改成:ssh -Y username@你的远程主机地址 - 服务器端(远程机器):打开
/etc/ssh/sshd_config,确认这几项配置是开启状态:
改完重启sshd服务:X11Forwarding yes X11DisplayOffset 10 X11UseLocalhost yes# Systemd系统(Ubuntu 16.04+/CentOS 7+) sudo systemctl restart sshd # 旧版SysV系统 sudo service ssh restart
二、手动修复X11认证令牌(最常见的解决办法)
这个报错90%是本地的X11认证令牌没正确传递到远程,试试手动同步:
- 在本地终端(还没SSH登录时),运行
xauth list,会输出类似这样的内容:localhost/unix:0 MIT-MAGIC-COOKIE-1 8a9b0c1d2e3f4g5h6i7j8k9l0m1n2o3p - SSH登录远程机器后,执行
xauth add加上刚才本地的记录,注意把unix:0改成你报错里的unix:10(对应localhost:10.0的Display编号):xauth add localhost/unix:10 MIT-MAGIC-COOKIE-1 8a9b0c1d2e3f4g5h6i7j8k9l0m1n2o3p - 嫌手动输麻烦?可以用这条命令直接一键传递认证信息:
xauth extract - $DISPLAY | ssh username@你的远程主机地址 xauth merge -
三、检查环境变量和依赖
登录远程后,先确认几个关键项:
- 运行
echo $DISPLAY,输出应该是localhost:10.0(和你报错里的一致),如果是空的手动设置:export DISPLAY=localhost:10.0 - 确保远程机器装了PyQt需要的X11依赖,比如Debian/Ubuntu系:
CentOS/RHEL系:sudo apt install xauth libxcb-xinerama0sudo yum install xauth libxcb-xinerama
四、排查权限和安全策略干扰
- 检查远程机器上
/tmp/.X11-unix目录的权限,确保你的用户有读权限:ls -ld /tmp/.X11-unix - 如果是CentOS/RHEL系统,试试临时关闭SELinux测试(如果能运行再去配置规则):
sudo setenforce 0 - Ubuntu系的AppArmor也可能拦截,临时关闭试试:
sudo systemctl stop apparmor
五、用 verbose 日志找问题
如果以上都不行,开启SSH的详细日志,看X11转发的具体报错点:
ssh -vY username@你的远程主机地址
日志里会输出X11认证的每一步,比如是不是服务器拒绝了令牌,或者客户端没正确发送认证信息,根据日志再针对性解决。
内容的提问来源于stack exchange,提问作者chin
相关产品推荐
相关产品推荐

