我有一个必须在下运行的脚本root
,并绑定到 dbus。
DBUS_SESSION_BUS_ADDRESS = 'address set under .dbus file ...'
class NewApp(dbus.service.Object):
def __init__(self):
busname = dbus.service.BusName('org.newapp', dbus.SessionBus(mainloop=DBusGMainLoop()))
dbus.service.Object.__init__(self, busname, '/org/newapp')
@dbus.service.method('org.newapp', out_signature='s')
def do_stuff(self):
return 'stuff'
if __name__ == '__main__':
na = NewApp
na()
gobject.MainLoop().run()
哪里do_stuff
有需要访问的代码root
。我发现,当您在 root 下运行程序时,这会创建一个单独的 dbus 会话,我需要设置“DBUS_SESSION_BUS_ADDRESS”。我曾考虑将脚本分成两个不同的文件,然后只导入另一个,但我也想知道如何这样做。
这给我带来了麻烦,我不确定在哪里或如何正确设置地址。如果有人有任何见解,我将不胜感激。
答案1
如果您正在编写需要以 root 身份运行的脚本,并且需要用户以某种方式通过 DBus 访问,则应该通过系统总线而不是会话总线公开 API。
作为示例,了解 NetworkManager 系统服务如何工作。
有关 DBus 中权限工作原理的更多文档,请参阅http://www.freedesktop.org/wiki/Software/dbus