embedded-linux - 嵌入式硬件上的 DBus 权限被拒绝
问题描述
我是 DBus 的新手,我正在尝试使用sdbus-cpp库在我自己的 C++ 应用程序中调用以下方法:
org.freedesktop.login1.Manager.Suspend
调用的目标是设备切换到挂起模式。
如果应用程序以 root 用户身份运行,则该应用程序到目前为止可以工作!但出于安全原因,我想以非 root 用户身份运行应用程序(可以说为'embuser')。
在网上我发现可以配置DBus。所以我将以下文件放在文件夹 /etc/dbus-1/system.d/suspend.conf 中,内容如下:
root@colibri:/etc/dbus-1/system.d$ cat suspend.conf
<!DOCTYPE busconfig PUBLIC
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- Only root or user embuser can own the login1 service -->
<policy user="embuser">
<allow own="org.freedesktop.login1"/>
</policy>
<policy user="root">
<allow own="org.freedesktop.login1"/>
</policy>
<!-- Allow anyone to invoke methods on login1 server -->
<policy context="default">
<allow send_destination="org.freedesktop.login1"/>
<allow receive_sender="org.freedesktop.login1"/>
</policy>
</busconfig>
我重新启动了 dbus 守护程序 ( systemctl restart dbus
)。然后,当我启动我的应用程序(作为“embuser”运行)时,会打印出以下内容:
在抛出 'sdbus::Error' what() 的实例后调用终止:[org.freedesktop.DBus.Error.AccessDenied] Permission denied Aborted
如上所述,当应用程序以 root 用户身份启动时,应用程序按预期工作并激活挂起模式。因此,C++ 应用程序本身应该没有问题。
为了以非 root 用户身份调用 DBus 方法,我该怎么做?我错过了配置文件中的某些内容吗?或者我还能做些什么来执行 DBus 调用?
该应用程序在嵌入式 Linux 设备(带有 ARM iMX7d 处理器的 Colibri 模块)上运行。
这是嵌入式设备的 Linux 内核和 systemd 版本:
$ uname -r
5.4.91-5.2.0-devel+git.c59b3c2da1e9
$ systemctl --version
systemd 244 (244.5+)
+PAM -AUDIT -SELINUX +IMA -APPARMOR -SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN2 -IDN -PCRE2 default-hierarchy=hybrid
解决方案
推荐阅读
- java - 为扫描仪创建一个专用类是一种有用的输入解决方案吗?
- ibm-cloud - 在 IBM Assistant 中如何通过 .csv 文件导入意图?我收到一个错误
- kotlin-coroutines - 带有上下文
它能做什么?协程 - python-3.x - 如何删除字符串周围的引号和转储在我的 yaml 文件中的数据中的 int
- kotlin - 如何修复 Rxjava(Kotlin)上的 subscribeWith Type 参数错误?
- sql - SQL 组合两个 SQL 语句的输出以返回布尔值
- android - 如何在 Firebase 实时数据库中执行“或”查询
- python - Keras LSTM TensorFlow 错误:“形状必须具有相同的等级,但为 1 和 0”
- php - 图片未在实时托管中显示
- logging - 无法使用 Serilog 从 HttpContext 访问用户声明以进行日志记录