Wayland 会支持图形化 sudo 吗?

Wayland 会支持图形化 sudo 吗?

在 X 桌面上,我偶尔使用gksudo或只是sudo somegui以另一个用户(包括 root)身份启动 GUI 应用程序。我最近发现这在当代(2018 年初)的 Wayland 桌面上是不可能的。所有应用程序都必须以当前桌面用户身份启动,并且仅限于该用户的权限。

这是 Wayland 的永久功能(设计使然),还是 su-ty​​pe 的使用是尚未实现的增强功能?

我正在寻找一份记录在案的声明(路线图、设计页面...),而不是偏好或意见。

答案1

这是 Wayland 的永久功能吗(有意为之)

不,这与 Wayland 协议无关。这实际上是一个环境设置的问题。

Wayland 使用套接字,其名称存储在WAYLAND_DISPLAY.它位于XDG_RUNTIME_DIR通常设置为仅供用户访问的位置。但 root 也可以访问它。 (有些应用程序还会考虑XDG_SESSION_TYPE哪些可以有值waylandx11来决定是否使用 X 或 Wayland。)

sudo删除大多数环境变量,包括XDG_RUNTIME_DIRWAYLAND_DISPLAY

您可以使用 root 身份运行 Wayland 应用程序:

sudo env XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR WAYLAND_SOCKET=$WAYLAND_SOCKET waylandapplication

或更短的 来-EH保留几乎所有环境变量(但设置HOME/root)。这也将包括DISPLAYXwaylandXAUTHORITY访问:

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

有两种相当简单的解决方法。下面的示例启动突触,但任何其他命令都可以。

  1. 使用 ssh X-Forwarding 到 root 用户(您可能必须启用 root 登录/etc/ssh/sshd_config或配置密钥身份验证):
$ ssh -Y root@:: synaptic
  1. 按照建议使用 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

相关内容