Nhiệm vụ gốc bằng cách sử dụng dbus và bộ chính sách


10

Tại một số điểm, ứng dụng của tôi cần thực hiện các tác vụ quản trị như tạo một tệp trong / etc hoặc chạy các lệnh với quyền riêng tư gốc.

Tôi biết chỉ có thể làm một câu hỏi và trả lời:

os.popen("pkexec foo bar")

Nhưng tôi cũng biết rằng đây không phải là cách làm sạch đã thấy trước. Một số loại gây khó chịu cho người dùng vì anh ta luôn cần nhập lại mật khẩu thay vì xử lý như phiên.

Tôi đã rất lạc quan khi tôi tìm thấy ví dụ về con trăn để xác thực .

Đó là một ví dụ đơn giản hoạt động ngay lập tức:

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

Tôi đã khá ngây thơ khi nghĩ rằng sau khi được ủy quyền, tôi có thể tiếp tục viết kịch bản với một số lệnh os.popen () -. Bây giờ tôi biết rõ hơn :(

Tôi có thể thấy kết quả tuple trong ví dụ trên, nhưng trong tài liệu tiếp theo tôi không thể tìm thấy mã làm việc để tiếp tục tại thời điểm này.

Tôi phải làm gì với kết quả này? Làm thế nào tôi có thể tiếp tục thực hiện các nhiệm vụ tôi cần? Có một tài liệu tham khảo python với các ví dụ cung cấp các phương thức có sẵn?

Tôi đã cố gắng liệt kê các phương thức ủy quyền bằng cách sử dụng dir () nhưng không thể tìm thấy bất kỳ manh mối nào về cách tiếp tục.

Tôi thực sự muốn tránh sử dụng dự phòng của tôi nhưng nó sẽ là phương sách cuối cùng của tôi. Xin hãy giúp tôi làm điều đó đúng cách :)

Cảm ơn và trân trọng

André

Biên tập:

Do tôi không mang nó đi làm và giải pháp trước đây của tôi bằng cách bắt đầu chương trình của tôi với gksu không hoạt động / opt /, cuối cùng tôi đã phải từ bỏ và thực hiện hàng ngàn yêu cầu mật khẩu để làm cho chương trình hoạt động thô sơ để có được ít nhất một chiếc áo phông trong cuộc thi ứng dụng.

Tôi đã không nhận thấy vấn đề vì lần đầu tiên tôi đã chia sẻ nhanh chóng. Có mọi thứ hoạt động đúng. Hỏi một lần cho mật khẩu lúc đầu. Bây giờ tôi hoàn toàn suy sụp Đóng góp của tôi cho AppShowdown là https://launchpad.net/armorforge . ;-(


Tôi nghĩ bạn có thể tìm thấy câu trả lời tốt hơn tại StakOverflow. Bạn nên hỏi câu hỏi này để được di chuyển đến đó.
jgomo3

Câu trả lời:


6

Trước tiên, có một khái niệm cơ bản bạn cần nắm bắt: PolicyKit chỉ xử lý ủy quyền, không leo thang đặc quyền. Chính sáchKit sẽ trả lời câu hỏi: "người dùng có được phép thực hiện tác vụ này không?", Nhưng nó sẽ không cung cấp cho bạn quyền root.

Mô hình thường được sử dụng là tạo ra một dịch vụ hệ thống DBus, chạy với các đặc quyền gốc. Nó sẽ nhận các yêu cầu từ các quy trình không phải root, sử dụng PolicyKit để xác định xem quy trình đó có được phép thực hiện yêu cầu đó hay không, và sau đó thực hiện nhiệm vụ được yêu cầu.

Tôi đã viết một hướng dẫn về PolicyKit và DBus với Python trên ubuntuforums.org một vài năm trước. Các nguyên tắc là như nhau, mặc dù nó có thể cần một số cập nhật. Tôi cần đi ngủ bây giờ, vì vậy hãy xem và cho tôi biết nếu nó cần cập nhật.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.