Как я могу запустить приложение с графическим интерфейсом администратора в сеансе пользователя без прав администратора?
Я определил 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
Вам будет предложено ввести пароль дважды:
- Во-первых, вы должны ввести
admin
пароль, чтобыnormaluser
запустить команду какadmin
сsu
бэкенд. - Во-вторых, вы должны ввести
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
.
Для меня сработало это:
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.
Надеюсь, это поможет объяснить это немного для вас.: О)