Как запустить Linux окно повышенных привилегий с Python? - PullRequest
1 голос
/ 18 марта 2020

Я пишу приложение python3, работающее с GUI (не в терминале) в качестве пользователя. Пока это приложение работает как пользователь, мне также нужно выполнить команду, требующую root привилегий. Я видел множество примеров того, как сделать это в терминале, как этот, который на самом деле прекрасно работает в терминале:

import subprocess
subprocess.call('sudo echo "Hello world!"', shell=True)

... но мое приложение python не работает в терминале, и этот метод, по-видимому, автоматически не вызывает видимое системное приглашение, когда мой код GUI вызывает его.

Другие приложения, особенно Snap Store, каким-то образом запускают всплывающее окно системы когда им нужно что-то сделать с правами root. Например, когда я использую Snap Store для установки Notepad ++ в Ubuntu, я получаю это всплывающее окно, которое, как я подозреваю, представляет собой всплывающее окно системы, а не что-то, разработанное специально для пользователей Snap Store.

Snap Store elevated privileges popup

Я не очень знаком с Linux системами, но я предполагаю, что это не пользовательское всплывающее окно, а системное, потому что тот, кто хочет дать свой пароль root создателям одного их приложений? Вместо этого пользователи будут передавать его системе (которая уже знает это), а само стороннее приложение не имеет доступа к действительному паролю, но теперь может запускать команду как root.

* 1014. * Как я могу запустить идентичное всплывающее окно из моего приложения Python, чтобы запустить команду, которая требует root привилегий? Или, в качестве альтернативы, как еще можно запустить команду root с моего python GUI, работающего от имени пользователя?

Заранее благодарим за любую понятную помощь, которую вы можете оказать!

1 Ответ

1 голос
/ 18 марта 2020

Вы пробовали pkexe c?

Не уверен насчет вашего GUI, но при запуске простого скрипта python (python3 .8, pycharm, ubuntu 18.04) вы получите желаемое всплывающее окно (не можете распечатать его на экране ))

import os

os.system("pkexec ls -l")
...