Почему gksu / gksudo или запуск графического приложения с sudo не работают с Wayland?

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

Любой совет?

Алекс Чапиро
источник
1
gksudoне будет работать в сеансе Wayland , вы можете переключиться на сеанс Xorg и попробовать.
Помский
2
Сама ошибка, если ошибка X "не может открыть дисплей:: 1". Wayland спроектирован таким образом, и, по мнению разработчиков, вам не следует запускать графические приложения с правами root из командной строки. Вы можете работать с xhost.
Пантера
1
gksu -dg synaptic Вы никогда не должны делать это в любом случае.
Rinzwind
3
@ N0rbert прекратите добавлять 17.10 к вопросам, которые упоминают 17.10. Теги версий должны использоваться, если вопрос относится именно к этому выпуску. Большинство из этих вопросов обычно применимы везде, где доступны Wayland, GNOME Shell и т. Д., Включая прошлые и будущие версии.
Муру
@maru. 16.04 LTS текущее, 17.04 близко к EOL, поэтому нормальное 17.10 означает Wayland и стандартную оболочку GNOME, поэтому я думаю , что тег 17.10 полезен. Это трудно найти вопросы, где пользователи имеют проблемы с 17.10, но не имеют ответов и комментариев здесь . Им нужны ответы, но забыл добавить 17.10 тег, когда их спросят. Я могу перестать добавлять тег. Это была доброжелательность.
Норберт

Ответы:

55

Обратите внимание, что этот ответ специфичен для версий 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?

пантера
источник
Этот обходной путь работает и с Миром ?
Элия ​​Каган,
Я не знаю о МИР, возможно.
Пантера
1
Или простоxhost +local:
chaskes
18
«Это особенность, а не ошибка!» ... вздох. Подобные вещи - причина, по которой я не могу убедить своего друга и коллег перейти на Linux. Использование VIM и Nano не является альтернативой GEdit. Gedit работает как блокнот, а вам нужно изучить CRTL-код для других. И возьмем, к примеру, Nano, используя такие термины, как «Записать» вместо «Сохранить» .... Очень недружелюбный пользователь.
JHBonarius
9
Это также полностью нарушает gparted, что является важной вещью для доступа. Что случилось с «Не пытайтесь помешать глупым людям делать глупости; вам удастся только помешать умным людям делать умные вещи»?
Мэтью Наджмон
21

введите описание изображения здесь Решения

В 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 admin (который использует 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выглядит следующим образом:

введите описание изображения здесь

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

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

введите описание изображения здесь

sudodus
источник
Является ли «Временный доступ пользователя root к рабочему столу Wayland через функцию gks» более безопасным методом (например, чем добавление файла, /etc/xdg/autostart/xhost.destopкак также предлагалось), потому что он заканчивается восстановлением исходной среды? И мы можем спокойно заменить sudo -Hс gksuв псевдониме, чтобы использовать вставки в .desktop файлы и т.д.?
Сади
1
Да, я думаю, что безопаснее разрешить root-доступ к рабочему столу только при необходимости. И да, вы можете заменить sudo -Hс gksuв функции, он может работать лучше для ваших приложений.
Судод
1
+1 за очень тщательный ответ. Подобно вашей gksаббревиатуре, я настроил gsuиспользовать наборы политик (новое будущее для 16.04) для geditи nautilus. Когда выйдет 18.04, я думаю, что просто назову xhost +si...скрипт-обертку, gksuкоторый никогда не установлю из пакетов, начинающихся с 18.04.
WinEunuuchs2Unix
2
«Wayland спроектирован так, чтобы не допускать повышенных (sudo -H, gksu ...) разрешений в прикладных программах с графическим интерфейсом». -- ложный. Wayland позволяет рут-приложениям просто отлично. Вы можете увидеть это, запустив sudo -E gedit. В настоящее время существует ошибка, при gdmкоторой он настраивает сервер совместимости Xwayland X11, чтобы он не поддерживал XAUTHORITY, что требуется для работы приложений X11, работающих от имени пользователя root. Родные приложения Wayland, работающие от имени root, работают нормально.
psusi
1
@psusi, я изменил ответ, чтобы избежать заявлений о замысле и намерениях Wayland.
Судод
6

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

if [ $XDG_SESSION_TYPE = "wayland" ]; then
    xhost +si:localuser:root
fi
Эли Чан
источник
5

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

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

admin:///etc/default/grub

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

Джереми Бича
источник
1
Спасибо. Для меня это работало лучше всего с gedit (кроме странного поведения, когда используется просто как gedit admin:), очень странно с nautilus (почти бесполезно), и полностью провалилось с synaptic . Любые идеи?
Сади
Это не будет работать с синаптикой. Это должно хорошо работать в nautilus, но вы должны выбрать каталог, а не файл, какadmin:///etc/
Джереми Бича
Это вроде работает с наутилусом, но вы поймете, что я имею в виду («очень странно», «почти бесполезно»), даже когда вы откроете директорию и начнете пытаться делать то и это ;-)
Sadi
@Sadi Я понятия не имею, что такое "это и то". Вы можете сообщить об ошибке, если она не работает правильно.
Джереми Бича
3

Для приложений, использующих 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 в терминал перед запуском привилегированного приложения

N0rbert
источник
1

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

Ключ -E указывает sudo сохранять переменные среды (а также WAYLAND_SOCKET и XDG_RUNTIME_DIR), необходимые для приложений Wayland. Всегда лучше использовать эту опцию, чем хакерский xhost, предложенный в других ответах. 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" ...).
Муру
Да, конечно :-) Это всего лишь следы моих экспериментов
Алекс Чапиро