问题描述
我安装了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 #1274451和Graphical 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)编辑系统文件,请使用命令行工具,如nano
或vim
或emacs
。 nano
对于新用户来说通常更容易,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
,但它可以运行需要提升权限的部件而不需要图形。)
xhost
和sudo -H
-
有一种解决方法允许其他用户拥有的图形应用程序,而不是Wayland中的登录用户,
xhost +si:localuser:root
-
gksu
和gksudo
没有与标准Ubuntu捆绑在一起,在这里不起作用,但它们在Xorg中工作。相反,你可以使用
sudo -H
-
最好是防止其他用户拥有的图形应用程序而不是登录后的用户,
xhost -si:localuser:root
gvfs管理员后端
在Ubuntu 17.10(gvfs> = 1.29.4)中,您可以使用gvfs admin后端。请注意,您需要完整路径,
gedit admin:///path/to/file
从理论上讲,无论您使用哪种UI,gvfs管理后端方法(使用polkit)都比xhost
和xudo -H
更好,更安全。
您不以root身份运行整个应用程序。权限升级仅在严格必要时才会发生。请参阅以下链接及其链接,
-
sisco311’s reply in the Ubuntu Forums thread ‘Which best practice for using gedit as root?’这是第4篇文章。另见同一帖子中的#6帖子。
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
您可以查看sudo
,sudo -H
和gks
如何使用以下命令
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
如下所示:
您可以从此链接下载包含所有三个文件的图标文件或tarball,
复制[提取或复制&粘贴]文件到以下位置,
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相比,这并不难(您应该输入密码)。
使用程序包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权限之前,最好先检查一下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 1713313和bug 1713311)。
如果您不想要永久解决方案,可以使用@ ravery的方法:
just type
xhost +si:localuser:root
in the terminal before launching privileged application
参考资料