W pewnym momencie moja aplikacja musi wykonywać zadania administracyjne, takie jak tworzenie pliku w / etc lub uruchamianie poleceń z uprawnieniami roota.
Wiem, że po prostu mogę zrobić Q&D:
os.popen("pkexec foo bar")
Ale wiem też, że nie jest to przewidziany czysty sposób na zrobienie tego. Pewne irytujące dla użytkownika, ponieważ zawsze musi ponownie wprowadzić hasło zamiast obsługi podobnej do sesji.
Byłem bardzo optymistyczny, ponieważ znalazłem przykładowy python do uwierzytelnienia .
To prosty przykład, który działa natychmiast:
import dbus
bus = dbus.SystemBus()
proxy = bus.get_object('org.freedesktop.PolicyKit1', '/org/freedesktop/PolicyKit1/Authority')
authority = dbus.Interface(proxy, dbus_interface='org.freedesktop.PolicyKit1.Authority')
system_bus_name = bus.get_unique_name()
subject = ('system-bus-name', {'name' : system_bus_name})
action_id = 'org.freedesktop.policykit.exec'
details = {}
flags = 1 # AllowUserInteraction flag
cancellation_id = '' # No cancellation id
result = authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)
print result
Byłem dość naiwny, myśląc, że po autoryzacji mógłbym po prostu kontynuować pracę w skrypcie z kilkoma komendami os.popen (). Teraz wiem lepiej :(
Widzę wynik krotki w powyższym przykładzie, ale w dalszej dokumentacji nie mogłem znaleźć działającego kodu do uruchomienia w tym momencie.
Co mam wspólnego z tym wynikiem? Jak mogę kontynuować wykonywanie potrzebnych mi zadań? Czy istnieje odwołanie do Pythona z przykładami oferującymi dostępne metody?
Próbowałem wymienić metody autoryzacji za pomocą dir (), ale nie mogłem znaleźć żadnej wskazówki, jak to zrobić.
Naprawdę chcę uniknąć korzystania z mojej rezerwy, ale to byłaby moja ostatnia deska ratunku. Pomóżcie mi to zrobić we właściwy sposób :)
Dziękuję i pozdrawiam
André
Edytować:
Ponieważ nie przyniosłem tego do skutku, a moje poprzednie rozwiązanie, uruchamiając program z gksu, nie działa z / opt /, w końcu musiałem się poddać i zaimplementować tysiąc zapytań o hasło, aby program był niezbędny do uzyskania przynajmniej koszulka w pokazie aplikacji.
Nie zauważyłem problemu, ponieważ najpierw zrobiłem szybkie udostępnianie. Tam wszystko działało poprawnie. Pytanie o hasło na początku. Jestem teraz całkowicie przygnębiony. Mój wkład w AppShowdown to https://launchpad.net/armorforge . ;-(
Odpowiedzi:
Najpierw musisz zrozumieć podstawową koncepcję: PolicyKit obsługuje tylko autoryzację, a nie eskalację uprawnień. PolicyKit odpowie na pytanie: „czy użytkownik jest upoważniony do wykonania tego zadania?”, Ale nie da ci uprawnień roota.
Najczęściej stosowanym modelem jest utworzenie usługi systemowej DBus, która działa z uprawnieniami administratora. Będzie pobierał żądania z procesów innych niż root, użyj PolicyKit, aby ustalić, czy proces ten jest uprawniony do wysłania tego żądania, a następnie wykonaj żądane zadanie.
Kilka lat temu napisałem tutorial na temat PolicyKit i DBus z Pythonem na ubuntuforums.org . Zasady są takie same, chociaż może wymagać aktualizacji. Muszę teraz iść spać, więc spójrz i daj mi znać, czy wymaga aktualizacji.
źródło