Создание ярлыка для запуска приложения от имени root в Elementary OS Juno

image_60a01b062f13b

Я достаточно давно использую Linux дистрибутив Elementary OS. Это форк дистрибутива Ubuntu с очень красивым и удобным интерфейсом. Много лет назад я выбрал его из множества других и до сих пор доволен своим выбором. Сегодня я расскажу как в этом дистрибутиве создать ярлык для запуска графического приложения от имени суперпользователя root.

Необходимость создать такой ярлык появилась после установки приложения LuckyBackup, с помощью которого можно создавать резервные копии файлов. У приложения есть два режима запуска - обычный и режим суперпользователя. В обычном режиме можно копировать пользовательские файлы и файлы доступные для чтения.  В режиме суперпользователя можно копировать системные файлы, что позволяет создать архив всей системы. Именно это мне и было нужно, но после установки приложения я обнаружил, что ярлыка для запуска в режиме суперпользователя в меню нет.

Все ярлыки приложений в Elementary OS содержатся в каталоге /usr/share/applications. Там я обнаружил три ярлыка для запуска LuckyBackup. Один был для запуска в обычном режиме и два других для запуска в режиме суперпользователя для интерфейсов Gnome и KDE. Но ни тот ни другой не отображались в меню.

image_60a03b2453f4b

Внутри файла luckybackup-gnome-su.desktop для запуска от имени суперпользователя используется скрипт su-to-root, но он исключен из этого дистрибутива:

Exec=su-to-root -X -c /usr/bin/luckybackup
NotShowIn=KDE;

Внутри файла luckybackup-kde-su.desktop для запуска от имени суперпользователя используются дополнительные параметры X-KDE-SubstituteUID и X-KDE-Username, но они не работают в этом дистрибутиве:

Exec=/usr/bin/luckybackup
OnlyShowIn=KDE;
X-KDE-SubstituteUID=true
X-KDE-Username=root

Раз эти два варианта не работают нужно сделать свой рабочий. В Elementary OS для запуска приложений от имени суперпользователя можно использовать встроенный механизм под названием PolicyKit. Суть его в том, что мы заранее описываем в специальном файле параметры запуска приложения чтобы автоматизировать этот процесс. Файлы представляют собой обычный xml документ с расширением *.policy и находятся в каталоге /usr/share/polkit-1/actions. Создадим там новый файл с именем com.ubuntu.pkexec.luckybackup.policy и следующим содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
    <action id="com.ubuntu.pkexec.luckybackup">
        <description>Run luckyBackup as root</description>
        <message>Authentication is required to run the luckyBackup as root</message>
        <message xml:lang="ru">Для запуска luckyBackup от имени суперпользователя требуется аутентификация</message>
        <defaults>
            <allow_any>auth_admin</allow_any>
            <allow_inactive>auth_admin</allow_inactive>
            <allow_active>auth_admin</allow_active>
        </defaults>
        <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/luckybackup</annotate>
        <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
    </action>
</policyconfig>

Структура файла простая, её можно скопировать из другого файла с расширением *.policy и немного подкорректировать. Здесь важными являются следующие параметры:

  • <action id = "com.ubuntu.pkexec.luckybackup"> - внутри этого тэга указывается идентификатор действия id, которое будет использоваться для запуска приложения.
  • <description> - описание команды.
  • <message xml:lang="ru"> - сообщение которое увидит пользователь при запуске приложения. Тэгов <message> может быть много для разных языков. При этом внутри тэга указывается код языка xml:lang.
  • <annotate key = "org.freedesktop.policykit.exec.path"> /usr/bin/luckybackup </annotate> - здесь указывается сам исполняемый файл приложения. В нашем случае это /usr/bin/luckybackup.
  • <annotate key = "org.freedesktop.policykit.exec.allow_gui"> true </annotate> - команда указывающая что приложение запускается в графическом интерфейсе.

После того как файл создан и в него добавлены вышеуказанные строки можно попробовать запустить приложение. Для этого нужно в терминале набрать следующую команду:

pkexec luckybackup

Здесь pkexec это команда запуска PolicyKit, а luckybackup это исполняемый файл приложения. Если всё сделано правильно, то после выполнения этой команды на экране появится диалог авторизации:

image_60a03bef11381

В диалоге авторизации можно увидеть тот текст, который мы добавили в тэге <message>. После успешного ввода пароля откроется окно приложения LuckyBackup с предупреждением о том, что оно запущено от имени суперпользователя.

image_60a03c1803709

Теперь нужно сделать так, чтобы запуск происходил с помощью ярлыка. Для этого немного подредактируем файл luckybackup-gnome-su.desktop в каталоге /usr/share/applications. Логичным было бы предположить, что нужно заменить строку

Exec=su-to-root -X -c /usr/bin/luckybackup

на строку

Exec=pkexec luckybackup

К сожалению такой вариант не работает. Не знаю причин, но приложение не запускается. Пришлось использовать дополнительный скрипт. В домашнем каталоге /home/{user} (где {user} имя Вашего пользователя) нужно создать файл luckybackup.sh с правами на исполнение и со следующим содержимым:

#!/bin/sh
pkexec luckybackup

Теперь в файле luckybackup-gnome-su.desktop нужно строку

Exec=su-to-root -X -c /usr/bin/luckybackup

заменить на

Exec=/home/{user}/luckyBackup.sh

где {user} имя Вашего пользователя. Если всё сделано правильно, то в меню появится иконка для запуска приложения от имени суперпользователя.

image_60a03c349cfc6

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