为什么 gksu/gksudo 或使用 sudo 启动图形应用程序不能与 Wayland 一起使用?

Ale*_*iro 47 root wayland gksu

我安装了 Ubuntu 17.10。现在我遇到了gksu以下问题:

$ gksu -dg synaptic
No ask_pass set, using default!
xauth: /tmp/libgksu-HgUjgQ/.Xauthority
STARTUP_ID: gksu/synaptic/8760-0-alex-XPS-15-9530_TIME4974977
cmd[0]: /usr/bin/sudo
cmd[1]: -H
cmd[2]: -S
cmd[3]: -p
cmd[4]: GNOME_SUDO_PASS
cmd[5]: -u
cmd[6]: root
cmd[7]: --
cmd[8]: synaptic
buffer: -GNOME_SUDO_PASS-
brute force GNOME_SUDO_PASS ended...
Yeah, we're in...
Unable to init server: Could not connect: Connection refused
(synaptic:8767): Gtk-WARNING **: cannot open display: :1
xauth: /tmp/libgksu-HgUjgQ/.Xauthority
xauth_env: (null)
dir: /tmp/libgksu-HgUjgQ
Run Code Online (Sandbox Code Playgroud)

如果我不使用-g,密码对话框将被禁用。所以看起来像为 root 创建 tty 的问题。

有什么建议吗?

Pan*_*her 59

请注意,此答案特定于使用 Wayland 的 Ubuntu 版本,17.10 是默认使用 Wayland 的第一个版本。

这是一个功能而不是一个错误!无法从终端以 root 身份启动图形应用程序是 Wayland 的一个设计特性。

主要讨论当然是在 Fedora 站点上进行的。请参阅Fedora 错误 #1274451图形应用程序不能在 Wayland(例如 gedit、beesu、gparted、nautilus)中以 root 身份运行在 Ask Fedora 上。但是在 Ubuntu 站点上也有一些讨论(Ubuntu Devs Uncertain about Using Wayland by Default in 17.10 - OMG!Ubuntu)。

Ubuntu 错误报告:无法在 Wayland 会话上启动 pkexec 的应用程序

可能的变通方法- 如果您使用图形编辑器(例如 gedit)编辑系统文件,请使用命令行工具,例如nanoorvimemacsnano对于新用户来说通常更容易,vim功能更强大并且具有更多功能,请参阅此 Vim 教程或类似内容。

无论如何,如果您真的想要或需要以root身份运行图形应用程序,请xhost首先设置强制回退到 Xserver。

设置权限运行:

xhost si:localuser:root 
Run Code Online (Sandbox Code Playgroud)

完成后,删除权限

xhost -si:localuser:root 
Run Code Online (Sandbox Code Playgroud)

您可以根据此突触错误报告添加图形/桌面选项来执行此操作

pkexec 的应用程序可以通过xhost +si:localuser:root放置在 XDG 自动启动中来修复,如下所示(N0rbert 的想法):

cat <<EOF | sudo tee /etc/xdg/autostart/xhost.desktop
[Desktop Entry]
Name=xhost
Comment=Fix graphical root applications
Exec="xhost +si:localuser:root"
Terminal=false
Type=Application
EOF
Run Code Online (Sandbox Code Playgroud)

您可以将此 xhost 命令添加到 .bashrc,但我建议使用一对别名

alias gsuon='xhost si:localuser:root'

alias gsuoff='xhost -si:localuser:root'
Run Code Online (Sandbox Code Playgroud)

您可以随意命名别名。

详情请见:


切换回 Xorg

如果您出于任何原因更喜欢 Xorg,您可以选择在登录时在 Xorg 上运行

请参阅如何在 Ubuntu 17.10 中从 Wayland 切换回 Xorg?

  • “这是一个功能而不是一个错误!”...叹息。这些事情正是我无法说服我的朋友和同事改用 linux 的原因。使用 VIM 和 Nano 不能替代 GEdit。Gedit 的工作方式类似于记事本,而您需要为其他人学习 CRTL 代码。并以 Nano 为例,使用“写出”而不是“保存”之类的术语……对用户非常不友好。 (20认同)
  • 这也完全破坏了 gparted,这是一个很重要的访问权限。“不要试图阻止愚蠢的人做愚蠢的事情,只有阻止聪明的人做聪明的事情才能成功”这句话是怎么回事? (10认同)

sud*_*dus 21

在此处输入图片说明 解决方案

在 Wayland 中,通常很难以提升的(sudo -H、gksu ...)权限运行 GUI 应用程序。使用命令行工具执行此类任务是个好主意。

但是有一些变通方法,如果您有一个 GUI 工具,它很适合您并且需要提升权限。(我使用两个这样的标准工具:Synaptic Package Managersynaptic和分区工具 Gparted gparted。我也使用 MakeUSB 来创建 USB 引导驱动器mkusb,但它可以运行需要提升权限的部分,而无需图形。)

xhostsudo -H

  1. 有一种解决方法可以允许其他用户拥有的图形应用程序而不是 Wayland 中的登录用户,

     xhost +si:localuser:root
    
    Run Code Online (Sandbox Code Playgroud)
  2. gksu并且gksudo不与标准 Ubuntu 捆绑在一起,也不能在这里工作,但它们在 Xorg 中工作。

    相反,您可以使用

     sudo -H
    
    Run Code Online (Sandbox Code Playgroud)

    编辑:

    -H不再需要(在 20.04 LTS 和更新版本中)

    在 20.04(或者可能是 19.10,我不记得是什么时候)之前,将 sudo 用于 GUI 应用程序,尤其是文件管理器,可能会将您家中文件和文件夹的所有权更改为 root,从而完全消除您以身份登录系统的能力用户。系统使用 sudo 的方式发生变化意味着发生这种情况的危险现在已经消失,因此就该问题而言应该是安全的。

    编辑结束

  3. 之后最好防止其他用户拥有的图形应用程序而不是登录用户,

     xhost -si:localuser:root
    
    Run Code Online (Sandbox Code Playgroud)

gvfs 后台管理

在 Ubuntu 17.10 (gvfs >= 1.29.4) 中,您可以使用 gvfs 管理后端。请注意,您需要完整路径,

gedit admin:///path/to/file
Run Code Online (Sandbox Code Playgroud)

理论上,gvfs 管理后端方法(使用 polkit)更好、更安全(比xhostxudo -H),无论您使用什么 UI。

您不会以 root 身份运行整个应用程序。权限提升仅在绝对必要时发生。请参阅以下链接和其中的链接,

鹦鹉螺管理员

还可以nautilus-admin用于具有提升权限的文件操作和使用gedit提升的权限。这在以下 AskUbuntu 答案中有所描述,

通过功能临时访问Wayland桌面的root gks

请避免sudo GUI-program。它可能会导致系统使用 的配置覆盖您的常规用户 ID 的配置文件,root并设置所有权和权限以适应root和锁定您的常规用户 ID。您应该使用 运行 GUI 应用程序sudo -H,它将配置文件写入root的主目录中/root。例子:

sudo -H gedit myfile.txt
Run Code Online (Sandbox Code Playgroud)

但是有一个你忘记的风险-H。相反,您可以创建一个函数,例如gks

gks () { xhost +si:localuser:root; sudo -H "$@"; xhost -si:localuser:root; }
Run Code Online (Sandbox Code Playgroud)

并将其存储在您~/.bashrc的别名附近。然后你可以运行

gks gedit myfile.txt
Run Code Online (Sandbox Code Playgroud)

以类似于您gksudo以前使用的方式。

测试

您可以检查如何sudosudo -Hgks使用以下命令

sudodus@xenial32 ~ $ sudo bash -c "echo ~"
/home/sudodus
sudodus@xenial32 ~ $ sudo -H bash -c "echo ~"
/root
sudodus@xenial32 ~ $ gks () { xhost +si:localuser:root; sudo -H "$@"; xhost -si:localuser:root; }
sudodus@xenial32 ~ $ gks bash -c "echo ~"
localuser:root being added to access control list
/root
localuser:root being removed from access control list
sudodus@xenial32 ~ $ 
Run Code Online (Sandbox Code Playgroud)

而且当然

gks gedit myfile.txt
Run Code Online (Sandbox Code Playgroud)

根据上一节中的示例。

通过 Alt-F2 和 Gnome Shell 菜单工作的方法

~/.bashrc您可以创建一个无需 bash 也能工作的系统,而不是向 中添加一个简单的单行函数。使用起来可能很方便,但设置起来比较复杂。请注意,您应该只安装其中一种替代品,因为单线功能会干扰使用这个更复杂的系统。

三档

脚本gks

#!/bin/bash

xhost +si:localuser:root

if [ $# -eq 0 ]
then
  xterm -T "gks console - enter command and password" \
  -fa default -fs 14 -geometry 60x4 \
  -e bash -c 'echo "gks lets you run command lines with GUI programs
with temporary elevated permissions in Wayland."; \
read -p "Enter command: " cmd; \
cmdfile=$(mktemp); echo "$cmd" > "$cmdfile"; \
sudo -H bash "$cmdfile"; rm "$cmdfile"'
else
 xterm -T "gks console - enter password" -fa default -fs 14 -geometry 60x4 -e sudo -H "$@"
fi 

xhost -si:localuser:root;
Run Code Online (Sandbox Code Playgroud)

桌面文件gks.desktop

[Desktop Entry]
Version=1.0
Categories=Application;System;
Type=Application
Name=gks
Description=Run program with temporary elevated permissions in Wayland
Comment=Run program with temporary elevated permissions in Wayland
Exec=gks %f
Icon=/usr/share/icons/gks.svg
Terminal=false
StartupNotify=false
GenericName[en_US.UTF-8]=Run program with temporary elevated permissions in Wayland
Run Code Online (Sandbox Code Playgroud)

图标文件gks.svg如下所示:

在此处输入图片说明

您可以从此链接下载图标文件或包含所有三个文件的 tarball,

wiki.ubuntu.com/Wayland/gks

将[提取或复制和粘贴]文件复制到以下位置,

sudo cp gks /usr/bin
sudo cp gks.desktop /usr/share/applications/
sudo cp gks.svg /usr/share/icons
Run Code Online (Sandbox Code Playgroud)

注销/登录或重新启动,并且应该有一个可用的桌面图标。它将在终端窗口中工作,就像使用该功能的简单解决方案一样。

Alt F2 盒子:

在此处输入图片说明

Gnome Shell 菜单:

在此处输入图片说明

gks 控制台和 gparted:

在此处输入图片说明

自定义脚本和桌面文件

如果您只有几个需要提升权限的 GUI 应用程序,您可以为它们制作自定义脚本和桌面文件,并避免输入命令(应用程序名称)。您只需输入密码,这与之前版本的 Ubuntu 相比并不困难(无论如何您都应该输入密码)。

xlogo程序包附带的简单 GUI 程序示例x11-apps

shellscript gkslogo(与 相比简化gks),

#!/bin/bash

xhost +si:localuser:root

xterm -T "gks console - enter password" -fa default -fs 14 -geometry 60x4 -e sudo -H xlogo

xhost -si:localuser:root;
Run Code Online (Sandbox Code Playgroud)

桌面文件gkslogo.desktop

[Desktop Entry]
Version=1.0
Categories=Application;System;
Type=Application
Name=gkslogo
Description=Run program with temporary elevated permissions in Wayland
Comment=Run program with temporary elevated permissions in Wayland
Exec=gkslogo
Icon=/usr/share/icons/gks.svg
Terminal=false
StartupNotify=false
GenericName[en_US.UTF-8]=Run program with temporary elevated permissions in Wayland
Run Code Online (Sandbox Code Playgroud)

我很懒,使用了相同的图标文件 gks.svg

将 [复制和粘贴] 文件复制到以下位置,

sudo cp gkslogo /usr/bin
sudo cp gkslogo.desktop /usr/share/applications/
Run Code Online (Sandbox Code Playgroud)

gks[logo] 控制台和 xlogo:

在此处输入图片说明

  • “Wayland 的设计不允许使用 GUI 应用程序提升(sudo -H、gksu ...)权限。” - 错误的。Wayland 允许根应用程序就好了。您可以通过运行 `sudo -E gedit` 来查看这一点。当前在`gdm` 中存在一个错误,它将Xwayland X11 兼容性服务器配置为不支持XAUTHORITY,这是以root 身份运行的X11 应用程序运行所必需的。以 root 身份运行的本机 Wayland 应用程序工作正常。 (2认同)

小智 6

在授予root权限之前最好先检查wayland是否真的在运行

if [ $XDG_SESSION_TYPE = "wayland" ]; then
    xhost +si:localuser:root
fi
Run Code Online (Sandbox Code Playgroud)


Jer*_*cha 5

如果您使用的是Ubuntu 17.04或更高版本,建议使用gvfs 管理后端。只需将admin://添加到您要在应用程序(如文本编辑器文件应用程序)中打开的完整文件路径的前面。

例如,要更改启动设置,请打开

admin:///etc/default/grub
Run Code Online (Sandbox Code Playgroud)

此方法使用 PolicyKit,并且仍然适用于 Ubuntu 17.10 的 Wayland 默认设置,而用于 GUI 应用程序的 sudo 和 gksu 则不会。