Как я могу запустить приложение с графическим интерфейсом от имени администратора из сеанса пользователя, не являющегося администратором?

Я определил 2 учетные записи пользователей:

  • один с правами администратора (с sudo> правильно) = давайте назовем это adminuser.
  • >2-й без каких-либо привилегий = давайте назовем его normaluser
    и я настраиваю автологин для этого 2-го пользователя normaluser.

Поэтому, когда я открываю normaluser сеанс и хотите запустить приложение с правами администратора,
Я открываю терминал Ctrl+Alt+T и:

su adminusersudo anyapplication ...

Он работает нормально, без необходимости выходить из normaluser сессии (нет необходимости открывать adminuser сессии).


Но что мне делать, если приложение должно запускаться с графическим интерфейсом (графический пользовательский интерфейс)?
Я думал об этом:

su adminusergksu anyapplication ...

но я получаю

** (gksu:9122): WARNING **: the connexion is closedNo protocol specifiedNo protocol specified(gksu:9122): Gtk-WARNING **: cannot open display: :0.0

Терминология

В этом ответе:

  • normaluser является обычным пользователем, который не является администратором и не может выполнять команды от имени root с sudo.
  • admin является администратором, который может выполнять команды как root с sudo. (Конечно, любые графические команды следует использовать графический интерфейс, такой как gksu/gksudo, и не sudo напрямую.)
  • anyapplication это имя графического приложения normaluser хочет баллотироваться как root. normaluser знает adminпароль пользователя и (предположительно) ему сказали, что он / она может использовать его для этой цели.

Проблема

Причина вашей проблемы и причина, по которой большинство других ответов до сих пор не работают (за исключением Марти Фридотличный ответ), является:

  • gksu может быть сконфигурирован для использования любого sudo или su в качестве его бэкэнда. Поведение по умолчанию gksu в Ubuntu заключается в том, чтобы выступать в качестве интерфейса для sudo, нет для su. То есть, по умолчанию, gksu и gksudo вести себя точно такой же. Смотри страница человека.
  • normaluser не является администратором и, следовательно, не может выполнять команды от имени root с sudo. sudo запрашивает пароль для пользователь, запускающий его, а не пароль от пользователем, которым они хотят стать. Невозможность использовать ваш пароль для выполнения действий от имени людей, которые не являетесь вами, - это что значит не быть администратором.
  • normaluser, при условии , что это не гостевая учетная запись, мочь выполняйте команды от имени другого пользователя с su, вводя в пароль другого пользователя. Но gksu выступает в качестве интерфейса для sudo, не su.
  • normaluser не могу непосредственно запустите любую команду как root, потому что normaluser не может использовать sudo, и никто может стать root с su потому что здесь нет root пароль.

Решение

Решение требует написания команды, которая выполняет два этапа аутентификации:

  • normaluser должен стать admin для выполнения графической команды. Чтобы сделать это, normaluser должен бежать gksu с -w флаг, чтобы заставить его работать в су-режим вместо значения по умолчанию sudo-режим, и в -u установите флажок для выполнения команды как admin вместо root.
  • Команда выполняется как admin должен вызывать gksu без то -w флаг для использования sudo стать root.

Вот команда (да, я проверил это ;-)):

gksu -w -u администратор гксу любое приложение

Вам будет предложено ввести пароль дважды:

  1. Во-первых, вы должны ввести adminпароль пользователя, чтобы позволить normaluser запустите команду как admin с su бэкэнд.
  2. Во-вторых, вы должны ввести adminпароль пользователя, чтобы позволить admin запустите команду как root с sudo бэкэнд.

Верно. Вы входите adminпароль дважды.

Прочие примечания:

  • При желании вы можете заменить второй gksu с gksudo чтобы сделать это менее запутанным. В Ubuntu они эквивалентны. (Вы также можете заменить первый gksu с gksudo, но это было бы крайне нелогично и сбивало с толку.)
  • -w является краткой формой --su-mode.
  • -S является краткой формой --sudo-mode но ни то, ни другое не должно использоваться, потому что sudo-режим это значение по умолчанию.
  • Возможно, вы захотите сначала протестировать это с помощью какой-нибудь довольно безобидной команды, чтобы убедиться, что она делает то, что вы хотите. (Так и будет, но вам нет необходимости доверять мне в этом.) Например:
    gksu -w -u администратор gksu xclock
    xclock это приятное простое приложение с окном часов.

Один из способов, который, вероятно, сработает, - это использовать "sux", а не "su", когда вы впервые переключаетесь на пользователя admin. sux устраняет проблему запуска x приложений от поддельного пользователя. Он находится в стандартном репозитории и может быть установлен путем ввода sudo apt-get install sux в командной строке.

Затем просто используйте "sux" вместо "su", и это должно работать так, как вы ожидаете.

Давайте повторно рассмотрим пример приложения xclock:

sux admingksu xclock

ПЭМ может позаботиться об этом

Это работает для меня на Ubuntu 16.04 (редактировать: это тоже работает на 18.04 LTS):

поставьте черту:

session optional pam_xauth.so

где-то в:

/etc/pam.d/su

и/или

/etc/pam.d/sudo

а затем, выполнив "su -" или "sudo su -", я могу использовать графические приложения в качестве root.

pkexec

Существует повсеместная альтернатива kdesudo и gksu - pkexec который исходит от policykit-1 пакет, который требуется для большого количества пакетов.

Для меня сработало это:

pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY yourcommand commandoption1 commandoption2

Здесь вы должны заменить yourcommand commandoption1 commandoption2 расстайтесь с реальной командой, и это аргументы

В Lubuntu есть инструмент под названием lxqt-sudo. Он находится в официальных репозиториях.Это работает!

lxqt-sudo/groovy, сейчас 0.15.0-0ubuntu1 amd64, представляет собой графический интерфейс Qt для простого sudo.

https://packages.ubuntu.com/focal/lxqt-sudo

Вместо

su admingksu любое приложение...

Я предлагаю вам попробовать gksu -u admin anyapplication, где вы делаете все, используя gksu само командование.Также, пожалуйста, обратите внимание, что вы должны ввести пароль пользователя, указанного в команде, т.е. в этом случае вы должны ввести администраторпароль пользователя.

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

load_function_libraryif [[ ${UID} -eq 0 ]] ; then    # Execute only in the case of elevated privileges:    if hash dialog ; then        if ( dialog --backtitle "$( basename $0 )" --title "${BRAND} tools updater: NOTICE!" --yesno "\nMay I update the ${BRAND} OEM tools on your system now?" 20 80 ) ; then            clear && do_update        else            clear && exit        fi    else        echo -e $YELLOW        echo "Hello $SUDO_USER ... I am going to update the OEM tools now..."        echo "To cancel this, just close the terminal or press "CRTL C"."        echo " "        read -p "Press [ ENTER ] to continue with update"        echo -e $ENDCOLOR        do_update    fielse    # If privileges are not elevated; then request elevation using the appropriate method:    if echo $(systemctl get-default ) |grep graphical ; then pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY $0 ; else ensure_admin ; fi    exitfi

Вот команда для выполнения этого.

gksu app-name

Запустите его без бегущий su первый. Вам нужно только выполнить приведенную выше команду из обычного сеанса пользователя, и приложение будет запущено от имени root.

Вы должны использовать:

gksudo AppName

Сначала появляется запрос графического пароля (пароль вашего пользователя), а затем запускается GUI-приложение от имени root (я только что попробовал, это действительно так. Забавно: я пытался gksu AppName сразу же после этого, и это сработало так же хорошо - как, вероятно, и предполагалось, как предполагает префикс "gk". Так что я не совсем уверен, где может быть ваша проблема).

@Sergey Если normaluser иногда используется кем-то, кто не должен иметь возможности запускать команды от имени root, то создание normaluser не администратором ** определенно повышает безопасность **. Опасности, связанные с предоставлением кому-либо учетной записи пользователя, но не сообщением ему своего собственного пароля, выходят далеко за рамки ситуации Бориса по хлопотам и сложности. Если вы хотите получить полное объяснение того, почему это проблематично, я предлагаю опубликовать новый вопрос, но 3 причины заключаются в том, что пользователь должен иметь возможность блокировать и разблокировать экран, выходить из системы и снова входить в систему с другим типом сеанса и расшифровывать данные “ecryptfs”.

точно, для меня нет смысла использовать компьютер моей семьи, сообщая всем пароль администратора для разблокировки экрана. Этот параметр normaluser и adminuser является золотым правилом.

Честно говоря, у меня просто сложилось впечатление, что OP использовал учетную запись normaluser для повседневной работы и учетную запись admin для выполнения административных задач, что на самом деле ничего не улучшает. На многопользовательской машине это вполне логично.

Итак, возникает вопрос: почему вы настроили свою систему таким образом? Как вы думаете, это повышает безопасность? Это не так :slight_smile: Вместо этого вы могли бы настроить автоматический вход в свою учетную запись “администратор”, чтобы она не запрашивала у вас пароль при входе в систему - она все равно будет требовать пароль при выполнении административных задач.