- 注意:帖子描述的方法在使用后会导致任何能连接到X服务器的软件都有权访问,增加了安全风险,不推荐使用:
使用hyprland时,可能会遇到某些需要root权限的x11应用无法打开问题,其中可能带有类似下列日志:
Authorization required, but no authorization protocol specified
Error: Can't open display: :0
通过网络搜索,我发现x11应用遇到了验证失败导致无法连接到X服务器(wayland混成器下运行的XWayland)问题,除了用xhost命令调整X服务器访问权外,还有一个办法就是用xauth设置 X服务器授权信息,下面是一个简易shell脚本例子:
#!/bin/sh
if [ -f ~/.Xauthority ];
then xauth generate "$DISPLAY" . trusted;
else touch ~/.Xauthority;
xauth generate "$DISPLAY" . trusted;
fi
$HOME/.Xautoority是变量 XAUTHORITY未设置时的默认位置,通过在hyprland中配置上述脚本自启动,也就是hyprland启动会启动这个脚本完成X服务器授权文件配置,这样就可以让使用XAUTHORITY获取X服务器连接授权的x11应用正常运行了,目前我测试了一个用XAUTHORITY授权的x11程序,不保证对所有x11程序有效。
依云
(lilydjwg)
2
你这和xhost +有什么区别啊……
正确的做法是确认$XAUTHORITY设置到了正确的位置(sudo大概会重置这个环境变量)。root用户访问普通用户的文件应该不会有障碍。
所以应该是先设置$XAUTHORITY到正确位置,然后用xauth创建授权文件,这样x11应用可以通过$XAUTHORITY正常授权。下面是修改后脚本与环境变量配置:
#!/bin/sh
touch "/tmp/.xauth";
XAUTHORITY=/tmp/.xauth
xauth generate "$DISPLAY" . trusted;
uwsm环境变量设置:export XAUTHORITY="/tmp/.xauth"
依云
(lilydjwg)
4
这个授权文件本来就应该存在、并且对你的用户授权。
——你知道你写的xauth generate "$DISPLAY" . trusted;是什么意思吗?
在hyprland上,这个授权文件甚至不会自己创建,所以我需要手动创建。
xauth generate "$DISPLAY" . trusted;用来对x服务器创建授权文件,trusted参数权限较大,所以应该不使用此参数(默认untrusted),这样创建的授权文件有限制,例如用Xresources设的字体dpi不能被读到
依云
(lilydjwg)
6
hyprland这么流行的Wayland compositor也不给你用MIT-MAGIC-COOKIE-1鉴权吗……那我有一计:用下面这个脚本替换/usr/bin/Xwayland
#!/usr/bin/python3
import os
import sys
import subprocess
def main():
args = sys.argv[1:]
xauthority = os.environ.get('XAUTHORITY', os.path.expanduser("~/.Xauthority"))
mcookie = subprocess.check_output(['mcookie'], text=True).strip()
nodename = os.uname().nodename
display = [x for x in args if x.startswith(':')][0]
subprocess.run(
['xauth', '-q'],
text = True,
check = True,
input = f'add {nodename}/unix{display} . {mcookie}\n',
)
cmd = ['/usr/bin/Xwayland.real', '-auth', xauthority]
cmd.extend(args)
os.execv(cmd[0], cmd)
if __name__ == '__main__':
main()
不然这留下的安全隐患跟最近的几个LPE漏洞相比也不相上下了呢。
谢谢,不过我考虑到自己可能会使用niri或者kde桌面,如果需要用其他窗口管理器/桌面环境,那么我应该把Xwayland改回去避免出错。
我能不能问下为什么直接用xauth生成鉴权文件会留下安全隐患?
依云
(lilydjwg)
8
其实也不用的(
你这个设置允许任何能够连接到X服务器的软件访问——默认设置下是所有未被隔离的本地用户。虽然只能访问到用Xwayland的那些程序,但那也不安全啊,可以给它们读写X剪贴板、截图、监听键盘输入、注入输入事件啥的(X协议就是这么不安全)。
谢谢解答,这样看来直接用xauth与用xhost风险差不多,看来我需要修改帖子避免产生误导。