У меня есть приложение с графическим интерфейсом, который должен вызвать демон (написанный на Python) с привилегиями суперпользователя. Я хотел бы сделать это, не запрашивая у пользователя пароль.
Поскольку демон является скриптом, я не могу установить бит SUID напрямую. Я мог бы написать обертку C для этого, но я бы предпочел не изобретать велосипед, особенно когда ошибка с моей стороны может привести к серьезной угрозе безопасности системы.
В этой ситуации я обычно добавляю строку, /etc/sudoers
которая позволяет пользователям запускать демон от имени пользователя root без пароля, используя директиву NOPASSWD. Это отлично работает из командной строки. Однако, когда я делаю это из GUI, появляется pkexec
диалоговое окно с запросом пароля пользователя. Похоже, что в Ubuntu вызовы sudo
из GUI как-то перехватываются pkexec
.
Есть ли чистый способ обойти это? Я действительно предпочел бы не иметь дело с трудностями сценария setuid.
источник
sudo somecommand
, всплывающее диалоговое окно являетсяpkexec
диалоговым окном пароля, независимо от того, существует ли политика sudoers, разрешающая выполнение программы.Ответы:
Неправильно говорить следующее: «Похоже, что в Ubuntu вызовы
sudo
из GUI каким-то образом перехватываютсяpkexec
» .pkexec
не имеет много общего сsudo
. В отличие от этогоsudo
,pkexec
не предоставляет root-права для всего процесса, а скорее обеспечивает более точный уровень контроля над политикой централизованной системы.Теперь, если вы хотите запустить приложение с графическим интерфейсом без запроса пароля
pkexec
, это не сложно сделать. Давайте возьмем для примера GParted . Когда вы откроете его, вы увидите следующее диалоговое окно с запросом пароля:Нажмите Детали, и диалоговое окно теперь будет выглядеть так:
Отсюда все, что вам нужно сделать, это открыть файл, используя, например, следующую команду:
/usr/share/polkit-1/actions/com.ubuntu.pkexec.gparted.policy
и измените следующие строки:
со следующим:
Сохраните файл и закройте его. Затем, когда вы откроете GParted, вас больше не будут спрашивать пароль.
источник
gparted
. Когда вы запускаете из терминалаsudo gparted
, вы запускаете/usr/sbin/gparted
файл с правами root. Когда вы начинаетеgparted
с графического интерфейса, вы фактически начинаетеgparted-pkexec
(вы можете проверить это внутри/usr/share/applications/gparted.desktop
файла),/usr/bin/gparted-pkexec
то есть это сценарий оболочки, целью которого является выполнение следующей команды:pkexec "/usr/sbin/gparted"
что эквивалентноpkexec gparted
. Так что тут не при чемsudo
. И эту команду вы должны использовать в терминале, а неsudo gparted
.sudo
следует использовать только для приложений оболочки, а не для приложений с графическим интерфейсом. Смотриman sudo
иman pkexec
в этом смысле.