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


44

我安装了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似乎是一个问题。

有什么建议吗?


1
gksudoWayland会话中将无法使用,您可以切换到Xorg会话并尝试。
pomsky '17

2
如果X错误“无法打开显示::1”,则错误本身。Wayland是以这种方式设计的,并且开发人员认为,您不应从命令行以root用户身份运行图形应用程序。您可以使用xhost解决。
豹”

1
gksu -dg synaptic 无论如何,您永远都不应这样做。
林茨温德

3
@ N0rbert停止加入17.10到17.10提及的问题。如果问题是特定于该发行版的,则使用版本标签。这些问题中的大多数通常都适用于Wayland,GNOME Shell等可用的地方,包括过去和将来的版本。
muru 17-10-30

@丸 当前是16.04 LTS,17.04在EOL附近,因此正常的17.10表示Wayland和默认的GNOME Shell,因此我认为17.10标签很有用。这是很难找到的问题,即用户有问题17.10,但没有回答和评论在这里。他们需要答案,但是在询问时忘记添加17.10标签。我可以停止添加标签了。这是一种善意。
N0rbert

Answers:


55

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

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

当然,主要讨论是在Fedora网站上进行的。请参阅Fedora错误#1274451,并且不能在Ask Fedora上以root身份在Wayland中运行图形应用程序(例如gedit,beesu,gparted,nautilus)。但是,在Ubuntu站点上也有一些讨论(Ubuntu Devs关于在17.10中默认使用Wayland的不确定性-OMG!Ubuntu)。

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

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

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

要设置权限,请运行:

xhost si:localuser:root 

完成后,删除权限

xhost -si:localuser:root 

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

可以将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

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

alias gsuon='xhost si:localuser:root'

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

您可以随意命名别名。

有关详细信息,请参见:


切换回Xorg

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

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


这个解决方法是否也适用于Mir
伊莱亚·卡根

我可能不知道MIR。
豹”

1
或者只是xhost +local:
2015年

18
“这是一个功能,而不是错误!”……叹了口气。这些事情正是我无法说服我的朋友和同事改用linux的原因。使用VIM和Nano不能替代GEdit。Gedit的工作方式类似于记事本,而您需要为其他人学习CRTL代码。并以Nano为例,使用诸如“写出”而不是“保存”之类的术语。...非常不友好。
JHBonarius

9
这也完全打破了gparted,这很重要。“不要试图阻止愚蠢的人做愚蠢的事情;您只会成功地阻止聪明的人做聪明的事情。”会发生什么?
马修·纳杰蒙

21

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

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

但是,如果有GUI工具,则有一些变通办法,对您来说效果很好,并且需要提升的权限。(我使用了两个这样的标准工具:Synaptic软件包管理器synaptic和分区工具Gparted gparted。我也使用MakeUSB创建USB启动驱动器mkusb,但是它可以运行需要提升权限的部件而没有图形。)

xhostsudo -H

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

    xhost +si:localuser:root
    
  2. gksu并且gksudo未与标准Ubuntu捆绑在一起,因此无法在此处使用,但它们可在Xorg中使用。

    相反,您可以使用

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

    xhost -si:localuser:root
    

gvfs管理员后端

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

gedit admin:///path/to/file

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

您无需以root用户身份运行整个应用程序。特权升级仅在绝对必要时才发生。请参阅以下链接及其链接,

鹦鹉螺管理员

也可以nautilus-admin用于具有较高权限的文件操作和gedit具有较高权限的文件。以下AskUbuntu答案对此进行了说明,

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

请避免sudo GUI-program。这可能会导致系统使用的配置覆盖常规用户ID的配置文件,root并设置所有权和权限以适合root和锁定常规用户ID。您应该使用运行GUI应用程序sudo -H,该应用程序会将配置文件写入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菜单起作用的方法

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

三个档案

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

在此处输入图片说明

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

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 框:

在此处输入图片说明

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;

桌面文件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]控制台和xlogo:

在此处输入图片说明


因为“通过功能gks临时访问root到Wayland桌面”是否更安全(例如,如/etc/xdg/autostart/xhost.destop建议的那样添加文件),因为它以还原原始环境为结尾?并且我们可以安全地用别名替换sudo -Hgksu,以便在.desktop文件等中使用插入吗?
萨迪

1
是的,我认为仅在必要时才允许root访问桌面更为安全。是的,您可以在函数中替换sudo -Hgksu,它可能会更适合您的应用程序。
sudodus

1
+1是非常彻底的答案。类似于您的gks缩写我必须设置gsu使用政策工具包(为新的未来16.04)的geditnautilus。不过,当我认为18.04发行时,我将只命名xhost +si...包装器脚本gksu,该脚本将永远不会从以开头的软件包中安装18.04
WinEunuuchs2Unix

2
“ Wayland被设计为不允许GUI应用程序具有提升的权限(sudo -H,gksu ...)。” -错误。Wayland允许根应用程序正常运行。您可以通过运行看到这一点sudo -E gedit。当前存在一个错误,该错误gdm将Xwayland X11兼容性服务器配置为不支持XAUTHORITY,而以root用户身份运行的X11应用程序必须具备XAUTHORITY。以root身份运行的本机Wayland应用程序可以正常工作。
psusi '18

1
@psusi,我修改了答案,以避免表达有关Wayland的设计和意图的陈述。
sudodus

6

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

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

5

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

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

admin:///etc/default/grub

此方法使用PolicyKit,并且仍可与Ubuntu 17.10的Wayland默认设置一起使用,而GUI应用程序的sudo和gksu则无效。


1
谢谢。对我来说,这对gedit效果最好(除了简单地用作时的奇怪行为gedit admin:),对于nautilus(几乎没有用)非常奇怪,而对于synaptic则完全失败。有任何想法吗?
萨迪

它不适用于突触。虽然它在鹦鹉螺中应该可以正常工作,但是您需要选择一个目录,而不要像admin:///etc/
Jeremy Bicha

它与nautilus兼容,但是即使直接打开目录并开始尝试执行此操作,您也会明白我的意思(“非常奇怪”,“几乎无用”);-)
Sadi

@Sadi我不知道“这个和那个”是什么。如果无法正常运行,您可以提交错误。
Jeremy Bicha

3

对于使用su-to-root和pkexec的应用程序,您可能需要将以下代码添加到/etc/xdg/autostart(请参阅我在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的方法:

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


1

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

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


0

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

#! /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编码的幼稚风格-我是这个主题的新手)。如果最后一个选择不是终端,T从Alt-F2不稳定。在这种情况下,我们无法将焦点设置为密码对话框。看起来它在Gnome菜单中有效。无论如何<1.这不是100%的解决方案。2.在我看来,Ubuntu架构师认为我们不应该搜索任何替代方案。


1
我认为您想要"$@"(而不是"$1" "$2" ...)。
muru 17-10-26

是的,当然:-)这些只是我的实验的痕迹
亚历Chapiro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.