如何仅使用 dbus 命令行实用程序列出 dbus 服务下的所有对象路径?

如何仅使用 dbus 命令行实用程序列出 dbus 服务下的所有对象路径?

如何仅使用dbus-send命令行实用程序列出 dbus 服务下的对象路径?

目前,我只能列出服务:

dbus-send --system --dest=org.freedesktop.DBus --type=method_call --print-reply  /org/freedesktop/DBus org.freedesktop.DBus.ListNames

或接口:

dbus-send --system --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.Introspectable.Introspect

这个问题非常类似于:

如何列出dbus服务下的所有对象路径?

但它需要使用一些我无法使用的实用程序。

我使用封闭式嵌入式系统,无法安装任何东西,因此无法使用以下任何实用程序:

  • qdbus查看器
  • 总线
  • D 脚
  • Python

答案1

您可以使用界面GetManagedObjects上的方法org.freedesktop.DBus.ObjectManager。但这不会只打印路径列表,而是转储整个对象,因此您需要从输出的字典中解析路径。

如果busctl(来自 systemd)是您的一个选择,我建议使用它,因为它具有 JSON 输出,因此您可以使用jq. UDisks2 JSON 转储示例:

# busctl call org.freedesktop.UDisks2 /org/freedesktop/UDisks2 org.freedesktop.DBus.ObjectManager GetManagedObjects --json=short | jq ".data[0] | keys[]"
"/org/freedesktop/UDisks2/Manager"
"/org/freedesktop/UDisks2/block_devices/sda"
"/org/freedesktop/UDisks2/block_devices/sda1"
...

通过dbus-send调用看起来像

# dbus-send --system --dest=org.freedesktop.UDisks2 --type=method_call --print-reply  /org/freedesktop/UDisks2 org.freedesktop.DBus.ObjectManager.GetManagedObjects

但您需要手动解析输出。

编辑:org.bluez命令是:

# busctl call org.bluez / org.freedesktop.DBus.ObjectManager GetManagedObjects --json pretty | jq ".data[0] | keys[]"
"/org/bluez"
"/org/bluez/hci0"
"/org/bluez/hci0/dev_00_1B_66_C1_56_01"

# dbus-send --system --dest=org.bluez --type=method_call --print-reply  / org.freedesktop.DBus.ObjectManager.GetManagedObject

你可以尝试类似的东西

# dbus-send --system --dest=org.bluez --type=method_call --print-reply  / org.freedesktop.DBus.ObjectManager.GetManagedObjects | grep -A 1 "dict entry" | grep "object path" | cut -d"\"" -f2
/org/bluez
/org/bluez/hci0
/org/bluez/hci0/dev_00_1B_66_C1_56_01

用于解析输出以仅获取对象路径。

相关内容