使用Golang通过DBUS发送命令的实现方法

使用Golang通过DBUS发送命令的实现方法 我正在尝试使用 https://godoc.org/github.com/godbus/dbus 通过代码发送重启系统的命令。

似乎无法正确发送命令。 使用典型的 dbus 我可以发送:“dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 “org.freedesktop.login1.Manager.Reboot” boolean:true”

我试图通过 godbus 实现与该命令相同的效果。以下是我的代码:

conn, err := dbus.SystemBus()
if err != nil {
panic(err)
}

conn.Emit("/org/freedesktop/login1", "org.freedesktop.login1.Manager.Reboot", "boolean:'true'")
if err != nil {
	fmt.Println(err)
}

更多关于使用Golang通过DBUS发送命令的实现方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

关于这个问题有什么更新吗?

更多关于使用Golang通过DBUS发送命令的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我没有使用过它,但从文档来看,emit 的调用方式应该类似于 conn.Emit("/org/freedesktop/login1", "org.freedesktop.login1.Manager.Reboot", true)

如果这不起作用,请告诉我们打印 err 时得到的错误信息。

conn.Emit("/org/freedesktop/login1", "org.freedesktop.login1.Manager.Reboot", true)

我按照您写的方式尝试了。程序运行后退出,没有打印任何错误。

conn, err := dbus.SessionBus()
if err != nil {
	panic(err)
}

err = conn.Emit("/org/freedesktop/login1", "org.freedesktop.login1.Manager.Reboot", true)
if err != nil {
	fmt.Println(err)
}

同时尝试了 SessionBus 和 SystemBus,两者都没有报错。

以下是使用 godbus 库通过 D-Bus 发送重启系统命令的正确实现方法。您的代码中存在几个问题:Emit 方法用于发送信号而非调用方法,且参数格式不正确。正确的方式是使用 Call 方法调用 D-Bus 方法。

package main

import (
    "fmt"
    "github.com/godbus/dbus"
)

func main() {
    conn, err := dbus.SystemBus()
    if err != nil {
        panic(err)
    }

    obj := conn.Object("org.freedesktop.login1", "/org/freedesktop/login1")
    call := obj.Call("org.freedesktop.login1.Manager.Reboot", 0, true)
    if call.Err != nil {
        fmt.Println("Failed to reboot:", call.Err)
    } else {
        fmt.Println("Reboot command sent successfully")
    }
}

代码说明:

  1. 使用 SystemBus() 连接到系统 D-Bus。
  2. 通过 Object() 获取目标对象,指定服务名 "org.freedesktop.login1" 和对象路径 "/org/freedesktop/login1"
  3. 使用 Call() 方法调用 "org.freedesktop.login1.Manager.Reboot",参数 0 表示默认标志,true 对应 boolean:true
  4. 检查 call.Err 处理错误。

注意事项:

  • 需要系统权限(如 root 或 polkit 授权)才能执行重启操作。
  • 参数直接使用 Go 的 bool 类型,无需字符串转换。

如果遇到权限错误,可以尝试通过 polkit 授权或使用 dbus 命令测试权限:

dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.Reboot boolean:true
回到顶部