为什么不用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的第一个版本。

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

主要讨论当然是在Fedora网站上。 请参阅Fedora bug#1274451 , 图形应用程序不能在Ask Fedora上以wayland(例如gedit,beesu,gparted,nautilus)的root身份运行 。 但是在Ubuntu网站上也有一些讨论( Ubuntu Devs在17.10中默认使用Wayland – OMG!Ubuntu )。

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

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

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

要设置权限运行:

 xhost si:localuser:root 

完成后,删除权限

 xhost -si:localuser:root 

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

pkexec’ed应用程序可以用xhost +si:localuser:root治愈xhost +si:localuser:root放在XDG自动启动中,如下所示(N0rbert的想法):

 cat < 

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

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

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

详情见:


切换回Xorg

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

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

在此处输入图像描述 解决方案

在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身份运行整个应用程序。 权限升级仅在严格必要时才会发生。 请参阅以下链接及其链接,

  • sisco311在Ubuntu论坛post中的回复’以root用户身份使用gedit的最佳做法是什么?’

    这是第4篇文章。 另请参见同一post中的#6post。

鹦鹉螺管理员

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

  • 我如何以root身份启动Nautilus?

通过functiongks 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

测试

您可以使用以下命令检查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的系统,而不是向~/.bashrc添加简单的单行函数。 使用起来可能很方便,但设置起来比较复杂。 请注意,您应该只安装其中一个替代方案,因为单线function会使用这个更复杂的系统进行干扰。

三个文件

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如下所示:

在此处输入图像描述

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

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

Alt F2框:

在此处输入图像描述

Gnome Shell菜单:

在此处输入图像描述

gks控制台和gparted:

在此处输入图像描述

自定义脚本和桌面文件

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

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

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权限之前,最好先检查一下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 (请参阅我在启动板上的注释 ),风险自负:

 cat < 

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


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

只需在启动特权应用程序之前在终端中键入xhost +si:localuser:root

如果应用程序支持Wayland API,您可以使用sudo -EH application命令以root身份运行它。

-E开关告诉sudo保留wayland应用程序所需的环境变量(以及WAYLAND_SOCKET和XDG_RUNTIME_DIR)。 在其他答案中提出的讨厌的xhost hack使用此选项总是更好。 xhost允许应用程序从X包装器下运行,这比使用Wayland(共享剪贴板,键盘记录等)安全性低。 sudo -EH技巧不适用于没有为wayland重写的应用程序,例如gparted,但可以使用gedit等。

实际上下面的代码几乎可以工作:

 #! /bin/bash set -e if [ -z "$1" ] ; then echo "Application is not specified" ; exit fi if [ $XDG_SESSION_TYPE = "wayland" ]; then if [[ -t 1 ]]; then xhost +si:localuser:root sudo -u root "$@" xhost - exit 0 fi fi gksu "$@" 

(请原谅我对bash编码的天真风格 – 我是这个主题的新手)。 如果最后一次选择不是终端,则从Alt-F2 T不能正常工作; 在这种情况下,我们只是无法将焦点设置为密码对话框看起来它可以在Gnome菜单中使用。 无论如何<1。它不是100%的解决方案。 2.在我看来,Ubuntu架构师认为我们不应该搜索任何工作。