gdbus
是一个命令行工具,用于与 D-Bus 进行交互。D-Bus 是一种进程间通信(IPC)机制,广泛应用于 Linux 桌面环境,如 GNOME 和 KDE,以提供桌面应用之间的无缝集成和通信。通过 gdbus
,用户可以直接从命令行查询信息、调用方法、监听信号等。
基本语法
gdbus introspect [选项] --dest 总线名 --object-path 路径
gdbus monitor [选项] --dest 总线名 [--object-path 路径]
gdbus call [选项] --dest 总线名 --object-path 路径 --method 接口.方法 [参数...]
gdbus emit [选项] --object-path 路径 --signal 接口.信号 [参数...]
gdbus wait [选项] 总线名
gdbus help
命令详解
1. introspect
功能:查看远程对象的接口、方法、属性和信号。
语法:
gdbus introspect \
[--system | --session | --address 地址] \
--dest 总线名 \
--object-path 路径 \
[--xml] \
[--recurse] \
[--only-properties]
参数说明:
--system
/--session
/--address
:指定总线类型或自定义地址。--dest 总线名
:目标服务的总线名称。--object-path 路径
:目标对象的路径(如/org/freedesktop/NetworkManager/Devices/0
)。--xml
:输出原始 XML 格式的接口描述(否则输出解析后的格式)。--recurse
:递归查看子对象及其接口。--only-properties
:仅显示接口的属性(忽略方法和信号)。
示例:
# 查看 NetworkManager 设备的接口信息
gdbus introspect \
--system \
--dest org.freedesktop.NetworkManager \
--object-path /org/freedesktop/NetworkManager/Devices/0
2. monitor
功能:监控指定服务或对象的信号。
语法:
gdbus monitor \
[--system | --session | --address 地址] \
--dest 总线名 \
[--object-path 路径]
参数说明:
--dest 总线名
:监控的服务名称。--object-path 路径
:可选,指定监控的具体对象路径。
示例:
# 监控 UPower 服务的所有对象信号
gdbus monitor \
--system \
--dest org.freedesktop.UPower
3. call
功能:调用远程对象的方法。
语法:
gdbus call \
[--system | --session | --address 地址] \
--dest 总线名 \
--object-path 路径 \
--method 接口.方法 \
[--timeout 秒数] \
参数1 参数2 ...
参数说明:
--method 接口.方法
:指定要调用的完整接口和方法(如org.freedesktop.Notifications.Notify
)。- 参数需以 GVariant 格式传递,字符串无需引号,其他类型需显式标注(如
<@i 42>
表示整数)。
示例:
# 发送桌面通知
gdbus call \
--session \
--dest org.freedesktop.Notifications \
--object-path /org/freedesktop/Notifications \
--method org.freedesktop.Notifications.Notify \
"my_app" 0 "" "标题" "内容" "[]" "{}" 5000
4. emit
功能:发送自定义信号。
语法:
gdbus emit \
[--system | --session | --address 地址] \
--object-path 路径 \
--signal 接口.信号 \
[--dest 总线名] \
参数1 参数2 ...
参数说明:
--signal 接口.信号
:指定信号的完整接口和名称。--dest 总线名
:可选,指定信号的目标接收者(默认为所有订阅者)。
示例:
# 发送自定义信号
gdbus emit \
--session \
--object-path /foo \
--signal org.bar.Foo \
"['foo', 'bar']"
5. wait
功能:等待某个服务在总线上激活。
语法:
gdbus wait \
[--system | --session | --address 地址] \
[--activate] \
总线名
参数说明:
--activate
:若服务未运行,自动启动它。总线名
:要等待的总线名称。
示例:
# 等待并自动启动服务
gdbus wait --session --activate org.bar.SomeService
6. help
功能:显示帮助信息。
语法:
gdbus help
参数格式说明
- GVariant 类型:参数需以 GVariant 格式传递,例如:
- 字符串:
"value"
(无需额外引号)。 - 整数:
<@i 42>
(@i
表示整型)。 - 数组:
<@as ["a", "b", "c"]>
(@as
表示字符串数组)。 - 字典:
<@a{sv} {"key1": "value1", "key2": 42}>
(@a{sv}
表示键值对)。
- 字符串:
典型使用场景
1. 查看对象属性
gdbus introspect \
--system \
--dest org.freedesktop.UPower \
--object-path /org/freedesktop/UPower \
--only-properties
2. 调用方法并处理返回值
# 调用 NetworkManager 的 Disconnect 方法
gdbus call \
--system \
--dest org.freedesktop.NetworkManager \
--object-path /org/freedesktop/NetworkManager/Devices/0 \
--method org.freedesktop.NetworkManager.Device.Disconnect
3. 监控信号变化
# 监控无线网络信号强度变化
gdbus monitor \
--system \
--dest org.freedesktop.NetworkManager \
--object-path /org/freedesktop/NetworkManager/AccessPoint/4141
常见错误及解决方法
- 错误:无法连接到总线
- 检查是否使用了正确的总线类型(
--system
或--session
)。 - 确保服务正在运行(如
org.freedesktop.NetworkManager
)。
- 检查是否使用了正确的总线类型(
- 错误:参数类型不匹配
- 检查参数的 GVariant 类型是否符合接口定义(如
@i
表示整型,@s
表示字符串)。
- 检查参数的 GVariant 类型是否符合接口定义(如
- 错误:方法未实现
- 确保目标对象实现了调用的方法(通过
introspect
验证接口)。
- 确保目标对象实现了调用的方法(通过