在 X 桌面上,我偶尔使用gksudo
或只是sudo somegui
以另一个用户(包括 root)身份启动 GUI 应用程序。我最近发现这在当代(2018 年初)的 Wayland 桌面上是不可能的。所有应用程序都必须以当前桌面用户身份启动,并且仅限于该用户的权限。
这是 Wayland 的永久功能(设计使然),还是 su-type 的使用是尚未实现的增强功能?
我正在寻找一份记录在案的声明(路线图、设计页面...),而不是偏好或意见。
答案1
这是 Wayland 的永久功能吗(有意为之)
不,这与 Wayland 协议无关。这实际上是一个环境设置的问题。
Wayland 使用套接字,其名称存储在WAYLAND_DISPLAY
.它位于XDG_RUNTIME_DIR
通常设置为仅供用户访问的位置。但 root 也可以访问它。 (有些应用程序还会考虑XDG_SESSION_TYPE
哪些可以有值wayland
或x11
来决定是否使用 X 或 Wayland。)
sudo
删除大多数环境变量,包括XDG_RUNTIME_DIR
和WAYLAND_DISPLAY
。
您可以使用 root 身份运行 Wayland 应用程序:
sudo env XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR WAYLAND_SOCKET=$WAYLAND_SOCKET waylandapplication
或更短的 来-EH
保留几乎所有环境变量(但设置HOME
为/root
)。这也将包括DISPLAY
XwaylandXAUTHORITY
访问:
sudo -EH application
但是,如果以 root 身份运行的应用程序在 中写入任何内容XDG_RUNTIME_DIR
,则可能会导致用户应用程序出现文件权限问题。
然而,与 X11 相比,在 Wayland 中以 root 身份运行图形应用程序的安全问题要小得多。
为了避免意外使用 X11,您可以在没有以下命令的情况下运行DISPLAY
:
sudo -EH env DISPLAY= waylandapplication
我正在寻找一份记录在案的声明(路线图、设计页面...),而不是偏好或意见。
这Wayland 文档提到了WAYLAND_DISPLAY
,但我没有找到任何相关内容XDG_RUNTIME_DIR
。不过,所有 Wayland 合成器(包括参考实现)都weston
依赖于XDG_RUNTIME_DIR
.
如果WAYLAND_DISPLAY
位于其他位置,则在同一 Wayland 显示上运行任意用户的应用程序不会有问题。但XDG_RUNTIME_DIR
已指定限制登录用户并应包含与用户相关的套接字:
$XDG_RUNTIME_DIR 定义应存储用户特定的非必需运行时文件和其他文件对象(例如套接字、命名管道等)的相对基目录。该目录必须由用户拥有,并且他必须是唯一对其具有读写访问权限的人。它的 Unix 访问模式必须是 0700。
在 Wayland 上运行另一个用户或 root 的问题与规范相关,XDG_RUNTIME_DIR
而不是与 Wayland 本身相关。如果您指定具有任意访问权限的自定义XDG_RUNTIME_DIR
(/tmp
从而破坏其规范),则所有用户都可以使用 wayland 显示。
希望未来不需要XDG_RUNTIME_DIR
,但这取决于实现:Wayland 纪录片第 4 章:
从 Wayland 1.15 开始,通过将 WAYLAND_DISPLAY 设置为服务器端点侦听的绝对路径,实现可以选择支持位于文件系统中任意位置的服务器套接字端点。
答案2
我ego
为此用例编写了(Alter Ego)。它不是 GUI 应用程序,但您可以作为另一个用户从控制台启动 GUI 应用程序,它会自动处理 xhost 和 Wayland 以及 PulseAudio 套接字共享:https://github.com/intgr/ego
诀窍是使用 Posix ACL 向另一个用户授予对 Wayland/PulseAudio 套接字的访问权限,并设置环境变量,以便目标用户的应用程序知道如何连接到它。
如果遇到问题,请在 GitHub 上提出问题。
答案3
有两种相当简单的解决方法。下面的示例启动突触,但任何其他命令都可以。
- 使用 ssh X-Forwarding 到 root 用户(您可能必须启用 root 登录
/etc/ssh/sshd_config
或配置密钥身份验证):
$ ssh -Y root@:: synaptic
- 按照建议使用 socat 和 sudobober 上的 RedHat Bug #1274451。下面的例子假设我们正在展示 #0 并且 #1 是免费的......
socat UNIX-LISTEN:/tmp/.X11-unix/X1 UNIX-CONNECT:/tmp/.X11-unix/X0 & sudo DISPLAY=:1 synaptic
我相信无论哪种方式,解决方法都是让用户拥有的进程连接到 X11 套接字并提供隧道。
答案4
虽然我没有直接回答你的问题,但我认为有些人可能因为同样的问题而来到这里。
这是我制作的脚本,是为需要运行图形应用程序的人提供的解决方法(例如编辑器,突触或者格帕特)作为根通过须藤在一个韦兰会议:
https://gist.github.com/wachambo/bd22e12db2d5a46dc109bd0d553733be
在这里导入:
#!/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