如何仅使用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
这个问题非常类似于:
但它需要使用一些我无法使用的实用程序。
我使用封闭式嵌入式系统,无法安装任何东西,因此无法使用以下任何实用程序:
- 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
用于解析输出以仅获取对象路径。