Почему 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, диалог пароля отключен. Так выглядит проблема с созданием tty для root.

Любой совет?

8 ответов

Обратите внимание, что этот ответ специфичен для версий Ubuntu, использующих Wayland, 17.10 является первым выпуском, использующим Wayland по умолчанию.

Это особенность, а не ошибка! Особенностью Wayland является то, что вы не можете запускать графические приложения как root с терминала.

Основные обсуждения, конечно, на сайтах Fedora. См. Ошибку Fedora № 1274451, а графические приложения нельзя запускать с правами root на wayland (например, gedit, beesu, gparted, nautilus) в Ask Fedora. Но на сайтах Ubuntu также есть некоторые обсуждения (разработчики Ubuntu не уверены в использовании Wayland по умолчанию в 17.10 - OMG! Ubuntu).

Отчет об ошибке в Ubuntu: невозможно запустить pkexec-приложения в сеансе Wayland

Потенциальный обходной путь - если вы редактируете системные файлы с помощью графического редактора (такого как gedit), используйте инструмент командной строки, такой как nano или же vim или же emacs, nano как правило, легче для новых пользователей, vim более мощный и имеет больше возможностей, см. этот учебник Vim или аналогичный.

В любом случае, если вы действительно хотите или вам нужно запускать графические приложения от имени пользователя root, установите xhost первое, что заставляет отступить на Xserver.

Чтобы установить разрешения, выполните:

xhost si:localuser:root 

Когда вы закончите, чтобы удалить разрешения

xhost -si:localuser:root 

Вы можете добавить графический / рабочий стол, чтобы сделать это в соответствии с этим синаптическим отчетом об ошибках.

Приложения pkexec могут быть исцелены xhost +si:localuser:root помещается в автозапуск XDG следующим образом (идея Нерберта):

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 при входе в систему.

Посмотрите, как вы переключаетесь с Wayland обратно на Xorg в Ubuntu 17.10?

Решения

В Wayland часто сложно запускать прикладные программы с графическим интерфейсом с повышенными (sudo -H, gksu ...) разрешениями. Это хорошая идея, чтобы делать такие задачи с помощью инструментов командной строки.

Но есть обходные пути, если у вас есть инструмент с графическим интерфейсом, который хорошо работает для вас и требует повышенных разрешений. (Я использую два таких стандартных инструмента: менеджер пакетов Synaptic, synaptic и инструмент разбиения Gparted, gparted, Я использую MakeUSB для создания загрузочных USB-накопителей, mkusb тоже, но он может запускать части, которые требуют повышенных разрешений без графики.)

xhost а также sudo -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

Теоретически, бэкэнд-метод gvfs (который использует polkit) лучше и безопаснее (чем xhost а также xudo -H), независимо от используемого вами интерфейса.

Вы не запускаете все приложение как root. Повышение привилегий происходит только тогда, когда это строго необходимо. Смотрите следующую ссылку и ссылки из нее,

Наутилус-админ

Также возможно использовать nautilus-admin для файловых операций с повышенными разрешениями и использования gedit с повышенными разрешениями. Это описано в следующем ответе AskUbuntu,

Временный доступ рута к рабочему столу Wayland через функцию gks

Пожалуйста, избегайте sudo GUI-program, Это может привести к тому, что система перезапишет файлы конфигурации для вашего обычного идентификатора пользователя с root Конфигурация и установить владельца и разрешения, чтобы соответствовать root и заблокируйте свой обычный идентификатор пользователя. Вы должны запускать приложения с графическим интерфейсом с 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. Это может быть удобно в использовании, но сложнее в настройке. Обратите внимание, что вам следует установить только одну из альтернатив, потому что однострочная функция будет мешать работе этой более сложной системы.

Три файла

Скрипт 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 выглядит так:

Вы можете скачать файл значка или архив со всеми тремя файлами по этой ссылке,

https://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 box:

Меню Gnome Shell:

gks console и gparted:

Пользовательский скрипт и файл рабочего стола

Если у вас есть только несколько приложений с графическим интерфейсом, которым требуются повышенные разрешения, вы можете создать для них пользовательские сценарии и файлы рабочего стола и не вводить команду (имя приложения). Вам нужно только ввести пароль, что не сложнее по сравнению с предыдущими версиями Ubuntu (вы должны ввести пароль в любом случае).

Пример с простой программой GUI xlogo что идет с пакетом программ x11-apps:

Скрипт 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:

Если вы используете Ubuntu 17.04 или выше, рекомендуется использовать бэкэнд администратора gvfs. Просто добавьте admin:// в начало полного пути к файлу, который вы хотите открыть в приложении, таком как текстовый редактор или приложения "Файлы".

Например, чтобы изменить настройки загрузки, откройте

admin:///etc/default/grub

Этот метод использует PolicyKit и будет по-прежнему работать с настройками Wayland по умолчанию в Ubuntu 17.10, а sudo и gksu для приложений с графическим интерфейсом - нет.

Лучше проверить, действительно ли Wayland работает первым, прежде чем предоставить права root

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

Для приложений, использующих su-to-root и pkexec, вы можете добавить этот код в /etc/xdg/autostart (см. мой комментарий на панели запуска) на свой страх и риск:

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 (см. Ошибку 1713313 и ошибку 1713311).


Если вам не нужно постоянное решение, вы можете использовать метод @ravery:

просто введите xhost +si:localuser:root в терминале перед запуском привилегированного приложения

Если приложение поддерживает Wayland API, вы можете запустить его как root с помощью sudo -EH application команда.

Ключ -E указывает sudo сохранять переменные среды (а также WAYLAND_SOCKET и XDG_RUNTIME_DIR), необходимые для приложений Wayland. Всегда лучше использовать эту опцию, чем хакерский xhost, предложенный в других ответах. 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-кодирования - я новичок в этом вопросе). T не работает стабильно из Alt-F2, если последний выбор не был терминалом; в этом случае мы просто не можем установить фокус на диалоге пароля. Похоже, он работает из меню Gnome. Во всяком случае< 1. Это не 100% решение. 2. Мне кажется, что архитекторы Ubuntu думают, что мы не должны искать какие-либо обходные пути..

Это основано на ответе Томаса Гайо-Сионнеста .

Я чувствую, что это заслуживает отдельного ответа, так как это очень просто и избавило меня от многих проблем. Создайте сценарий оболочки со следующим содержимым:

      #!/usr/bin/env bash
socat UNIX-LISTEN:/tmp/.X11-unix/X1 UNIX-CONNECT:/tmp/.X11-unix/X0 & sudo DISPLAY=:1 "$@"

Сохраните его в каталоге на вашем $PATH, и дайте ему права на выполнение ( chmod +x ./wlsudo). Затем вы сможете запускать приложения с графическим интерфейсом, используя wlsudoна месте sudoв Вейланде, например wlsudo synaptic просто работает .

Другие вопросы по тегам