将根会话和用户会话设置为同一总线?

将根会话和用户会话设置为同一总线?

我有一个必须在下运行的脚本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

相关内容