當前位置: 首頁>>技術問答>>正文


為什麽不用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/zh-tw/article/6917.html,未經允許,請勿轉載。