sd-bus API,sd_bus_request_name返回Permission denied

8

systemd 221版本中的总线API。当我在系统总线请求一个对象名称时,会显示“权限被拒绝”的错误。我正在以root身份运行输出文件。“sd_bus_request_name(bus, "net.poettering.Calculator", 0)”这一行抛出了一个错误:“无法获取服务名称:权限被拒绝”。

我认为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、Ubuntu、Fedora等)以及内核版本?您是否尝试将SELinux切换到宽容模式(因为SELinux是拒绝root访问的一种方式)? - Foon
示例代码正在运行在Oracle Linux 7.1上。我听说Oracle Linux是从Centos和Redhat分支出来的。内核版本为3.8.13。此外,SELINUX已被禁用。 - portleJay
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
9

典型的默认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。


0

我不知道这是否有用,但我找到了一个解决方法,虽然不是最推荐的方法,因为它允许用户在系统总线上创建dbus对象,而无需将它们列出或为它们创建特定的配置文件。

  • 你需要使用sudo编辑/usr/share/dbus-1/system.conf文件。
  • 编辑以下行的内容:Holes must be punched...短语之后的行。

<!-- Holes must be punched in service configuration files for name ownership and sending method calls -->

<deny own="*"/>

<deny send_type="method_call"/>

  • deny改为allow

通过这些更改,至少在我的情况下,sd_bus_request_name返回Permission denied错误得到了解决。


-3
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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,