Вопрос или проблема
Я пытаюсь написать новый файл .rules
для PolicyKit. Моя пробная попытка (в директории /etc/polkit-1/rules.d/
) выглядит так:
polkit.addRule(function(action, subject) {
polkit.spawn(["rm","/home/gabriel/test"]);
if (action.id == "org.freedesktop.policykit.exec") {
polkit.log("action=" + action);
polkit.log("subject=" + subject);
}
return polkit.Result.NOT_HANDLED;
});
Но, насколько я могу судить, этот код никогда не выполняется. Файл test
по-прежнему на месте, и нет выводов логов после выполнения чего-либо вроде $ pkexec -u otheruser bash
.
(Я пытался установить для файлов .rules
разрешение на исполнение.)
Если вы используете Ubuntu 22.04 (или ниже), то вы все еще используете старую версию PolKit, где нет файлов .rules, а только файлы .pkla и .conf.
В командной строке выполните:
pkaction --version
Если версия < 0.106, то вы можете использовать только старый синтаксис.
Вы можете создать файл .pkla в /etc/polkit-1/localauthority/
, смотрите man pklocalauthority
для инструкций и примеров.
Чтобы все работало как ожидается, нужно поместить свои собственные файлы .rules
в:
/usr/share/polkit-1/rules.d
Обратите внимание, что это также должно решить вопрос.
Следующее сработало для меня (ubuntu 22.04 с версией pkaction 0.105):
Отредактируйте следующий файл:
/var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla
И измените первый раздел следующим образом:
[Монтаж, проверка и т. д. внутренних дисков]
Identity=unix-group:admin;unix-group:sudo
Action=org.freedesktop.udisks.filesystem-*;org.freedesktop.udisks.drive-ata-smart*;org.freedesktop.udisks2.encrypted-unlock-system;org.freedesktop.udisks2.filesystem-fstab;org.freedesktop.udisks2.filesystem-mount-system;org.freedesktop.udisks2.filesystem-mount-other-seat;
ResultAny=yes
ResultInactive=yes
ResultActive=yes
Перезагрузка не требуется. Работает сразу после редактирования файла.
Обратите внимание, что я добавил “org.freedesktop.udisks2.filesystem-mount-other-seat” здесь. В моем случае, когда я пытался смонтировать диск из командной строки, я получал следующее сообщение:
$ udisksctl mount -b /dev/sdb1
==== АВТЕНТИФИКАЦИЯ ДЛЯ org.freedesktop.udisks2.filesystem-mount-other-seat ===
Требуется аутентификация для монтирования WD Elements 25A3 (/dev/sdb1)
Аутентификация как: Пользователь,,, (user)
Личный опыт: НЕ помещайте свои собственные правила в /usr/share/polkit-1/rules.d, если вы не понимаете, что именно вы добавили в свои скрипты правил.
Любые пользовательские правила в этой папке могут повлиять на поведение системы, например: XRDP.
Поместите свои собственные правила в /etc/polkit-1/rules.d/
Ответ или решение
Проблема, которую вы описали, связана с тем, что ваши файлы правил PolicyKit не применяются должным образом. Вот несколько шагов и рекомендаций, которые могут помочь вам исправить ситуацию:
-
Проверка версии PolicyKit: Убедитесь, что вы используете подходящую версию PolicyKit для .rules файлов. Выполните команду:
pkaction --version
Если версия меньше 0.106, это означает, что вы используете старую версию PolicyKit, которая поддерживает только файлы .pkla и .conf.
-
Корректное расположение .rules файлов: Убедитесь, что ваш файл правил находится в правильной директории. Для пользовательских правил используйте:
/etc/polkit-1/rules.d/
Если вы хотите, чтобы правила применялись глобально, можно использовать:
/usr/share/polkit-1/rules.d/
Однако, если вы не уверены в написанных вами правилах, рекомендуется размещать их в
/etc/polkit-1/rules.d/
. -
Правильный синтаксис скрипта: Пересмотрите ваш скрипт на предмет ошибок. Например, ваша логика должна быть в соответствии с тем, что вы хотите протестировать. В вашем коде вызывается
polkit.spawn()
для удаления файла, что может не сработать так, как вы ожидаете. Убедитесь, что ваша цель в скрипте логически сформулирована. -
Логирование: Чтобы проверить, происходит ли вызов вашего кода, добавьте дополнительные записи в журнал (например, с помощью
polkit.log()
), и убедитесь, что у вас есть соответствующие права доступа для их записи. Процесс может не выводить информацию в журнал, если правила не вызываются. -
Разрешения на запуск: Убедитесь, что ваш файл
.rules
имеет корректные права доступа. Если вы тестируете файл, не забудьте дать ему разрешение на выполнение:sudo chmod +x /etc/polkit-1/rules.d/your_rule.rules
-
Перезагрузка не требуется: Для обновления правил PolicyKit не требуется перезагружать систему. Изменения должны вступить в силу сразу после сохранения файла. Однако вы можете попробовать перезапустить службу
polkit
или перезагрузить вашу сессию. -
Использование .pkla файлов: Если вы работаете с версией PolicyKit < 0.106, вам необходимо использовать
.pkla
файлы для конфигурации прав доступа. Создайте файл в/etc/polkit-1/localauthority/
и настройте его соответственно. -
Тестирование правил: Попробуйте протестировать ваши правила с конкретными действиями, которые они должны обрабатывать. Это поможет вам более точно определить, куда может уводить ошибка.
Если все вышеперечисленное выполнено и ваш файл правил все еще не работает, возможно, имеет смысл просмотреть системные журналы (например, с помощью journalctl
) для получения дополнительной информации о возможных ошибках или предупреждениях, связанных с PolicyKit.