Linux系统之gdbus详解

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 表示字符串)。
  • 错误:方法未实现
    • 确保目标对象实现了调用的方法(通过 introspect 验证接口)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值