我安装了 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
请注意,这个答案特定于使用 Wayland 的 Ubuntu 版本,17.10 是第一个默认使用 Wayland 的版本。
这是一项功能,而不是错误!您无法从终端以 root 身份启动图形应用程序,这是 Wayland 的设计功能。
主要讨论当然是在 Fedora 网站上。请参阅Fedora 错误 #1274451和Ask Fedora 上的图形应用程序无法在 wayland 中以 root 身份运行(例如 gedit、beesu、gparted、nautilus)。但 Ubuntu 网站上也有一些讨论(Ubuntu 开发人员不确定在 17.10 中是否默认使用 Wayland - 天哪!Ubuntu)。
Ubuntu 错误报告:无法在 Wayland 会话中启动 pkexec 的应用程序
潜在的解决方法- 如果您使用图形编辑器(如 gedit)编辑系统文件,请使用命令行工具,如nano
或vim
或emacs
。nano
通常对新用户来说更容易,vim
功能更强大,具有更多功能,请参阅这个 Vim 教程或类似的东西。
无论如何,如果你真的想要或需要以 root 身份运行图形应用程序,xhost
首先设置强制回退到 Xserver。
要设置权限运行:
xhost si:localuser:root
完成后,删除权限
xhost -si:localuser:root
您可以添加图形/桌面选项来执行此操作此突触错误报告
pkexec 的应用程序可以通过放置在 XDG 自动启动中来修复,
xhost +si:localuser:root
如下所示(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'
您可以随意命名别名。
有关详细信息,请参阅:
- https://bugs.launchpad.net/ubuntu/+source/backintime/+bug/1713313
- https://bugs.launchpad.net/ubuntu/+source/nmap/+bug/1713311
- Arch Wiki:以 root 身份运行 X 应用程序
- Arch Wiki:Xhost
- xhost 和 xhost +si 是什么?
切换回 Xorg
如果你出于某种原因更喜欢 Xorg,你可以选择在登录时在 Xorg 上运行
答案2
解决方案
在 Wayland 中,通常很难以提升的权限(sudo -H、gksu ...)运行 GUI 应用程序。使用命令行工具执行此类任务是个好主意。
但是,如果你有一个 GUI 工具,那么它对你来说很有效,并且需要提升权限,那么就有一些变通方法。(我使用两个这样的标准工具:Synaptic 包管理器,synaptic
以及分区工具 Gparted,gparted
。我使用 MakeUSB 创建 USB 启动驱动器,mkusb
,但它可以在没有图形的情况下运行需要提升权限的部分。)
gvfs 管理后端
gvfs 管理后端是一个使用 GUI 工具提升权限的良好工具。在 Ubuntu 17.10(gvfs >= 1.29.4)及更新版本中,您可以使用 gvfs 管理后端。请注意,您需要完整路径,例如
thunar admin:///path/to/directory
gedit admin:///path/to/file
理论上,无论您使用什么 UI, gvfs 管理后端方法(使用 polkit)都比xhost
和更好、更安全。sudo -H
您无需以 root 身份运行整个应用程序。只有在绝对必要时才会提升权限。请参阅以下链接及其中的链接,
sisco311 在 Ubuntu 论坛主题“以 root 身份使用 gedit 的最佳做法是什么?”中的回复
这是帖子#4。另请参阅同一主题中的帖子#6。
xhost
和sudo -H
有一种解决方法是允许 Wayland 中登录用户以外的其他用户拥有图形应用程序,
xhost +si:localuser:root
gksu
并且gksudo
没有与标准 Ubuntu 捆绑在一起,因此在这里无法使用,但它们可以在 Xorg 中使用。相反,你可以使用
sudo -H
编辑:
在 20.04(或者可能是 19.10,我不记得是什么时候)之前,使用 sudo 来操作 GUI 应用程序(尤其是文件管理器)可能会将您主目录中文件和文件夹的所有权更改为 root,从而完全剥夺您以用户身份登录系统的能力。系统使用 sudo 的方式发生变化意味着发生这种情况的危险现在已经消失,因此就该问题而言应该是安全的。
編輯結束
最好以后阻止其他用户拥有的图形应用程序,而不是登录用户,
xhost -si:localuser:root
nautilus 管理员
也可以使用nautilus-admin
提升权限的文件操作,并使用gedit
提升权限。以下 AskUbuntu 回答对此进行了描述,
通过函数临时访问 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
以前使用的方式类似。
测试
您可以检查如何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 菜单实现的方法
除了向 中添加简单的单行函数外~/.bashrc
,您还可以创建一个无需 bash 也能运行的系统。它可能使用起来很方便,但设置起来更复杂。请注意,您应该只安装其中一个替代方案,因为单行函数会干扰使用这个更复杂的系统。
三个文件
shell脚本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 版本相比,这并不难(无论如何您都应该输入密码)。
xlogo
程序包中附带的简单 GUI 程序示例x11-apps
:
shell脚本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:
答案3
在授予 root 权限之前,最好先检查 Wayland 是否正在运行
if [ $XDG_SESSION_TYPE = "wayland" ]; then
xhost +si:localuser:root
fi
答案4
对于使用 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
其他 root 应用程序在 Wayland 上也出现问题(参见错误 1713313和错误 1713311)。
如果您不想要永久的解决方案,您可以使用@ravery 的方法:
xhost +si:localuser:root
只需在启动特权应用程序之前在终端中输入