รูทภารกิจโดยใช้ dbus และ policykit


10

ในบางจุดแอปพลิเคชันของฉันต้องทำงานด้านการดูแลระบบเช่นการสร้างไฟล์ใน / etc หรือการรันคำสั่งด้วย root priveleges

ฉันรู้ว่าสามารถทำ Q&D ได้:

os.popen("pkexec foo bar")

แต่ฉันก็รู้ว่านี่ไม่ใช่วิธีที่สะอาดตาที่จะทำ บางประเภทที่น่ารำคาญสำหรับผู้ใช้เพราะเขาต้องการป้อนรหัสผ่านของเขาอีกครั้งแทนการจัดการแบบเซสชั่น

ผมเป็นในแง่ดีมากเท่าที่ผมพบตัวอย่างหลามสำหรับที่ถูกตรวจสอบ

มันเป็นตัวอย่างง่ายๆที่ใช้งานได้ทันที:

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

ฉันค่อนข้างไร้เดียงสาคิดว่าหลังจากได้รับอนุญาตฉันก็สามารถดำเนินการต่อในสคริปต์ด้วยคำสั่ง os.popen () - ตอนนี้ฉันรู้ดีกว่า :(

ฉันเห็นผลลัพธ์ tuple ในตัวอย่างด้านบน แต่ในเอกสารเพิ่มเติมฉันไม่พบรหัสที่ใช้งานได้ในตอนนี้

ฉันต้องทำอะไรกับผลลัพธ์นี้ ฉันจะทำงานต่อไปตามที่ฉันต้องการได้อย่างไร มีการอ้างอิงหลามพร้อมตัวอย่างที่เสนอวิธีการที่ใช้ได้หรือไม่

ฉันพยายามที่จะแสดงรายการวิธีการอนุญาตโดยใช้ dir () แต่ไม่สามารถหาเบาะแสได้ว่าจะทำอย่างไร

ฉันต้องการหลีกเลี่ยงการใช้ทางเลือกของฉัน แต่มันจะเป็นทางเลือกสุดท้ายของฉัน โปรดช่วยฉันทำอย่างถูกวิธี :)

ขอบคุณและขอแสดงความนับถือ

André

แก้ไข:

เนื่องจากฉันไม่ได้นำสิ่งนี้ไปใช้งานได้และวิธีแก้ปัญหาเดิมของฉันโดยการเริ่มต้นโปรแกรมของฉันกับ gksu ไม่ได้ผลจาก / opt / ในที่สุดฉันก็ต้องยอมแพ้และใช้รหัสผ่านนับพันขอรหัสผ่านเพื่อให้โปรแกรมพื้นฐานทำงานอย่างน้อย เสื้อยืดในแอปโชว์ดาวน์

ฉันไม่ได้สังเกตเห็นปัญหาเพราะฉันแบ่งปันครั้งแรกอย่างรวดเร็ว ทุกอย่างทำงานถูกต้อง ถามรหัสผ่านครั้งแรกในตอนต้น ตอนนี้ฉันหมดแล้ว ผลงานของฉันสำหรับ AppShowdown เป็นhttps://launchpad.net/armorforge ;-(


ฉันคิดว่าคุณสามารถหาคำตอบที่ดีกว่าที่ StakOverflow คุณควรถามคำถามนี้เพื่อโยกย้ายที่นั่น
jgomo3

คำตอบ:


7

มีแนวคิดพื้นฐานที่คุณต้องเข้าใจก่อน: PolicyKit จะจัดการการอนุญาตเท่านั้นไม่ใช่การเพิ่มระดับสิทธิ์ PolicyKit จะตอบคำถาม: "เป็นผู้ใช้ที่ได้รับอนุญาตให้ทำงานนี้หรือไม่" แต่จะไม่ให้สิทธิ์พิเศษแก่คุณ

รูปแบบที่ใช้กันทั่วไปคือการสร้างบริการระบบ DBus ซึ่งทำงานด้วยสิทธิ์พิเศษของรูท จะใช้การร้องขอจากกระบวนการที่ไม่ใช่รูทใช้ PolicyKit เพื่อตรวจสอบว่ากระบวนการนั้นได้รับอนุญาตให้ทำการร้องขอนั้นหรือไม่จากนั้นจึงทำภารกิจที่ร้องขอ

ฉันเขียนบทเรียนเกี่ยวกับ PolicyKit และ DBus ด้วย Python บน ubuntuforums.orgเมื่อไม่กี่ปีก่อน หลักการเหมือนกันแม้ว่าอาจต้องมีการอัพเดต ตอนนี้ฉันต้องเข้านอนแล้วดูสิและแจ้งให้เราทราบหากจำเป็นต้องอัพเดท


มันสามารถใช้เพื่ออนุญาตให้แพ็คส่วนขยายการติดตั้งกล่องเสมือนภายใต้ผู้ใช้ปกติ?
Gryu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.