#!/usr/bin/env bash
#
# Enable root access to x-windows system.
#
# Motivation: Trying to run a graphical application as root via su, sudo in a
# Wayland session (e.g. GParted or Gedit), will fail. Apps which use polkit to
# request administrator permissions for just certain operations and only when
# needed are not affected (they are not started as root right away).
# [1] https://bugzilla.redhat.com/show_bug.cgi?id=1274451
#
# Based on a Reddit comment.
# [2] https://www.reddit.com/r/Fedora/comments/5eb633/solution_running_graphical_app_with_sudo_in/
if (( $# != 1 )); then
echo "Illegal number of parameters."
echo
echo "Usage: wsudo [command]"
exit 1
fi
for cmd in sudo xhost; do
if ! type -P $cmd &>/dev/null; then
echo "$cmd it's not installed. Aborting." >&2
exit 1
fi
done
xhost +SI:localuser:root
sudo $1
#disable root access after application terminates
xhost -SI:localuser:root
#print access status to allow verification that root access was removed
xhost
不,这与 Wayland 协议无关。这是一个环境设置的问题。
Wayland 使用套接字,其名称存储在
WAYLAND_DISPLAY
. 它位于XDG_RUNTIME_DIR
通常设置为仅供用户访问的地方。但是root也可以访问它。(一些应用程序还考虑XDG_SESSION_TYPE
哪些可以有值wayland
或x11
决定是使用 X 还是 Wayland。)sudo
删除大多数环境变量,包括XDG_RUNTIME_DIR
和WAYLAND_DISPLAY
。您可以使用以下命令以 root 身份运行 Wayland 应用程序:
或更短的 with
-EH
以保留几乎所有的环境变量(但设置HOME
为/root
)。这也将包括DISPLAY
XwaylandXAUTHORITY
访问权限:但是,如果以 root 身份运行的应用程序在 中写入任何内容
XDG_RUNTIME_DIR
,则可能会导致用户应用程序的文件权限问题。但是,在 Wayland 中以 root 身份运行图形应用程序比在 X11 中的安全问题要少得多。
为避免意外使用 X11,您可以不运行
DISPLAY
:Wayland 文档提到,
WAYLAND_DISPLAY
但我没有找到任何关于XDG_RUNTIME_DIR
. 不过,包括参考实现在内的所有 Wayland 合成器都weston
依赖于XDG_RUNTIME_DIR
.如果
WAYLAND_DISPLAY
将在另一个位置,那么在同一个 Wayland 显示器上运行来自任意用户的应用程序不会有问题。但XDG_RUNTIME_DIR
ist 指定为对登录用户进行限制,并应包含与用户相关的套接字:在 Wayland 上运行另一个用户或 root 的问题与
XDG_RUNTIME_DIR
规范有关,而不是与 Wayland 本身有关。如果您指定具有任意访问权限的自定义XDG_RUNTIME_DIR
输入/tmp
(从而破坏其规范),则所有用户都可以使用 Wayland 显示。未来有一些希望不需要
XDG_RUNTIME_DIR
,但这取决于实施:Wayland docu chap.4:我为这个用例写了
ego
(Alter Ego)。它不是 GUI 应用程序,但您可以从控制台以其他用户身份启动 GUI 应用程序,它会自动处理 xhost 和 Wayland 以及 PulseAudio 套接字共享:https ://github.com/intgr/ego诀窍是使用 Posix ACL 将 Wayland/PulseAudio 套接字的访问权限授予另一个用户,并设置环境变量以便目标用户的应用程序知道如何连接到它。
如果遇到问题,请在 GitHub 上打开一个问题。
有两种相当简单的解决方法。下面的示例启动突触,但任何其他命令都应该这样做。
/etc/ssh/sshd_config
或配置密钥身份验证):我相信任何一种解决方法都是让用户拥有的进程连接到 X11 套接字并提供隧道。
虽然我没有直接回答你的问题,但我认为有些人可能因为同样的问题而来到这里。
这是我制作的一个脚本,对于需要在Wayland会话中通过sudo以root身份运行图形应用程序(如Gedit、Synaptic或GParted )的人来说,这是一种解决方法:
https://gist.github.com/wachambo/bd22e12db2d5a46dc109bd0d553733be
在这里导入:
这扩展了 Thomas Guyot-Sionnest 的回答。
我觉得这值得自己回答,因为它为我解决了很多问题。创建一个
wlsudo
使用以下内容调用的 shell 脚本:将其保存在您的目录中
$PATH
,并赋予其可执行权限 (chmod +x ./wlsudo
)。然后,您应该能够使用wlsudo
代替sudo
Wayland 启动 GUI 应用程序,例如wlsudo synaptic
just works。