sd-bus API,sd_bus_request_name 返回权限被拒绝

Posted

技术标签:

【中文标题】sd-bus API,sd_bus_request_name 返回权限被拒绝【英文标题】:sd-bus API, sd_bus_request_name returns Permission denied 【发布时间】:2015-12-26 00:26:35 【问题描述】:

systemd 221 中的总线 API。 当我在系统总线中请求一个对象的名称时,它会打印出一条错误消息“权限被拒绝”。我以 root 身份运行输出文件。 "sd_bus_request_name(bus, "net.poettering.Calculator", 0)" 行抛出错误:"Failed to acquire servie name..: Permission denied"

我认为 root 应该有权获取对象的名称。有谁知道如何解决这个问题?

提前谢谢你。

这是来自http://0pointer.net/blog/the-new-sd-bus-api-of-systemd.html 的示例代码:

int main(int argc, char *argv[]) 
sd_bus_slot *slot = NULL;
sd_bus *bus = NULL;
int r;

r = sd_bus_default_system(&bus);
if (r < 0) 
    fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
    goto finish;


/* Install the object */
r = sd_bus_add_object_vtable(bus,
                             &slot,
                             "/net/poettering/Calculator",
                             "net.poettering.Calculator",   /* interface name                             */calculator_vtable,
                             NULL);
if (r < 0) 
    fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r));
    goto finish;


/* Take a well-known service name so that clients can find us */
r = sd_bus_request_name(bus, "net.poettering.Calculator", 0);
if (r < 0) 
    fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));
    goto finish;
 

【问题讨论】:

必选:您正在运行哪个 linux(RHEL vs ubuntu vs fedora vs...以及内核版本),您是否尝试将 selinux 转换为 permissive(因为 selinux 是 root 将获得的一种方式拒绝) 示例代码在 oracle linux 7.1 中运行。我听说 oracle linux 是从 Centos 和 Redhat 分支出来的。内核版本为 3.8.13。 SELINUX 也被禁用。 【参考方案1】:

典型的默认 D-Bus 配置不允许注册服务,除非明确允许。您需要允许 root 注册您的服务。创建/etc/dbus-1/system.d/net.poettering.Calculator.conf:

<!DOCTYPE busconfig PUBLIC
 "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <policy user="root">
    <allow own="net.poettering.Calculator"/>
  </policy>
</busconfig>

阅读 man dbus-daemon 了解详情。

【讨论】:

【参考方案2】:
int main(int argc, char *argv[])

    sd_bus_slot *slot = NULL;
    sd_bus *bus = NULL;
    int r;
    r = sd_bus_default_system(&bus);
    if (r < 0) 
    
        fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
        goto finish;
    

【讨论】:

以上是关于sd-bus API,sd_bus_request_name 返回权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sd-bus 获取服务状态?

sd-bus.h 例子

libuv 中 sd-bus 的事件循环处理

如何删除以前添加的 sd-bus 匹配

握手API网关調用 API 网关 暴露的 开放 API

从 API 网关聊到 API 管理