当前位置: 首页>>技术问答>>正文


为什么不用gksu/gksudo或启动带有sudo的图形应用程序与Wayland一起工作?

, , ,

问题描述

我安装了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

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

有什么建议?

最佳解决办法

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

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

主要讨论当然是在Fedora网站上。请参阅Fedora bug #1274451Graphical applications can’t be run as root in wayland (e.g. gedit, beesu, gparted, nautilus) on Ask Fedora。但是在Ubuntu网站上也有一些讨论(Ubuntu Devs Uncertain about Using Wayland by Default in 17.10 – OMG! Ubuntu)。

Ubuntu错误报告:Unable to launch pkexec’ed applications on Wayland session

可能的解决方法 – 如果使用图形编辑器(如gedit)编辑系统文件,请使用命令行工具,如nanovimemacsnano对于新用户来说通常更容易,vim功能更强大且功能更多,请参阅this Vim Tutorial或类似内容。

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

要设置权限运行:

xhost si:localuser:root 

完成后,删除权限

xhost -si:localuser:root 

您可以根据this synaptic bug report添加图形/桌面选项来执行此操作

pkexec’ed applications may be healed with xhost +si:localuser:root placed in XDG autostart as follows (N0rbert’s idea):

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 

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

alias gsuon='xhost si:localuser:root'

alias gsuoff='xhost -si:localuser:root'

您可以根据需要为别名命名。

详情见:


切换回Xorg

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

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

次佳解决办法

Solutions

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

但是有一些解决方法,如果你有一个GUI工具,它适合你,需要提升权限。 (我使用两个这样的标准工具:Synaptic Package Manager,synaptic和分区工具Gparted,gparted。我也使用MakeUSB来创建USB启动驱动器,mkusb,但它可以运行需要提升权限的部件而不需要图形。)

xhostsudo -H

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

    xhost +si:localuser:root
    
  2. gksugksudo没有与标准Ubuntu捆绑在一起,在这里不起作用,但它们在Xorg中工作。

    相反,你可以使用

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

    xhost -si:localuser:root
    

gvfs管理员后端

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

gedit admin:///path/to/file

从理论上讲,无论您使用哪种UI,gvfs管理后端方法(使用polkit)都比xhostxudo -H更好,更安全。

您不以root身份运行整个应用程序。权限升级仅在严格必要时才会发生。请参阅以下链接及其链接,

nautilus-admin

也可以使用nautilus-admin进行具有提升权限的文件操作,并将gedit用于提升的权限。这在以下AskUbuntu答案中描述,

通过功能gks临时访问Root到Wayland桌面

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

sudo -H gedit myfile.txt

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

gks () { xhost +si:localuser:root; sudo -H "$@"; xhost -si:localuser:root; }

并将其存储在别名附近的~/.bashrc中。然后你就可以跑了

gks gedit myfile.txt

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

Testing

您可以查看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 ~ $ 

而且当然

gks gedit myfile.txt

根据上一节中的示例。

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

您可以创建一个无需bash的系统,而不是将简单的one-line功能添加到~/.bashrc。使用起来可能很方便,但设置起来比较复杂。请注意,您应该只安装其中一个备选方案,因为one-line功能会因使用这个更复杂的系统而受到干扰。

三个文件

shellcript 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;

桌面文件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

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

root,gksu,wayland,ubuntu

您可以从此链接下载包含所有三个文件的图标文件或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

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

Alt F2包装盒:

root,gksu,wayland,ubuntu

Gnome Shell菜单:

root,gksu,wayland,ubuntu

gks控制台和gparted:

root,gksu,wayland,ubuntu

自定义脚本和桌面文件

如果只有少数GUI应用程序需要提升权限,则可以为它们创建自定义脚本和桌面文件,并避免输入命令(应用程序名称)。您只需输入密码,与以前版本的Ubuntu相比,这并不难(您应该输入密码)。

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

shellcript 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;

桌面文件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

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

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

sudo cp gkslogo /usr/bin
sudo cp gkslogo.desktop /usr/share/applications/

gks [logo] console和xlogo:

root,gksu,wayland,ubuntu

第三种解决办法

在授予root权限之前,最好先检查一下wayland是否真正运行

if [ $XDG_SESSION_TYPE = "wayland" ]; then
    xhost +si:localuser:root
fi

第四种办法

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

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

admin:///etc/default/grub

此方法使用PolicyKit,仍然可以使用Ubuntu 17.10的Wayland默认值,而GUI应用程序的sudo和gksu则不会。

第五种办法

对于使用su-to-root和pkexec的应用程序,您可能需要将此代码添加到/etc/xdg/autostart(请参阅my comment at launchpad),风险自负:

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

其他根应用程序也在Wayland上被破坏(参见bug 1713313bug 1713311)。


如果您不想要永久解决方案,可以使用@ ravery的方法:

just type xhost +si:localuser:root in the terminal before launching privileged application

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6917.html,未经允许,请勿转载。