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

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

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

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

su adminuser
sudo anyapplication ...

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


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

su adminuser
gksu anyapplication ...

но я получаю

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

12 ответов

Решение

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

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

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

Эта проблема

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

  • 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 флаг, чтобы он работал в su-mode вместо sudo-mode по умолчанию, и -u флаг для запуска команды как admin вместо root,
  • Команда запускается как admin должен вызвать gksu без -w флаг для использования sudo становиться root,

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

gksu -w -u admin gksu anyapplication

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

  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 admin gksu xclock
    xclock хорошее простое приложение с окном часов

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

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

Позволяет повторно использовать пример приложения xclock:

sux admin
gksu xclock

PAM может позаботиться об этом

Это работает для меня в Ubuntu 16.04:

поставить строку:

session optional pam_xauth.so

где-то в:

/etc/pam.d/su

и / или

/etc/pam.d/sudo

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

pkexec

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

Вы можете использовать sudoс графическим интерфейсом, используя параметры -sE, следующим образом:

sudo -sE GUI_CMD

Например, если вы хотите запустить nemoкак корень:

sudo -sE nemo

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

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

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

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

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

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

Вместо

су админ
ГКСУ любое приложение...

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

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

      
load_function_library

if [[ ${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
    fi
else
    # 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
    exit
fi

Вот команда, чтобы выполнить это.

gksu app-name

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

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

gksudo AppName

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

Существует только один суперпользователь, и это root.

Пользователь 1 является администратором и имеет права sudo.
Пользователь 2 не является администратором и не имеет прав sudo.

Попробуйте войти в систему как пользователь 1, а затем с помощью команды

gksudo app-name  

(замена имени приложения на имя приложения)
Надеюсь, это поможет - дайте мне знать.: О)

РЕДАКТИРОВАТЬ: Больше информации по запросу

Если это только ты на компьютере,
затем с помощью пользователя 1 (у которого есть разрешение на использование sudo)
ничем не отличается от использования пользователя 2 (у которого нет разрешения на использование sudo).
Пользователь 1 имеет те же права, что и пользователь 2.
Если пользователь 1 не введет команду с префиксом sudo и / или не предоставит свой пароль, чтобы позволить приложениям запускаться с привилегиями root.
Разница лишь в том, что пользователь 2 не может запускать приложения от имени пользователя root.

Надеюсь, это поможет объяснить это немного для вас.: О)

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