说我想以编程方式获取以太网卡的接口名称。这似乎有效:
dbus-send --print-reply \
--type=method_call \
--system \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/Devices/0 \
org.freedesktop.DBus.Properties.Get \
string:org.freedesktop.NetworkManager.Device \
string:Interface
返回:
method return sender=:1.5 -> dest=:1.135 reply_serial=2
variant string "eth0"
是否有某种方法可以切断中间人org.freedesktop.DBus.Properties.Get
并更直接地检索房产?唉,将其称为方法不起作用:
dbus-send --print-reply \
--type=method_call \
--system \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/Devices/0 \
org.freedesktop.NetworkManager.Device.Interface
返回:
Error org.freedesktop.DBus.Error.UnknownMethod:
Method "Interface" with signature "" on interface
"org.freedesktop.NetworkManager.Device" doesn't exist
我问,因为必须致电org.freedesktop.DBus.Properties.Get
,似乎必须在Python / Java /等中调用object.getProp("someproperty")
而不是object.getSomeProperty()
。
答案 0 :(得分:4)
是的,如果您使用 qdbus ,则可以这样做。我没有和我一起使用NetworkManager,但是这样的命令应该可以工作:
qdbus --system \
org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager/Devices/0 \
org.freedesktop.NetworkManager.Device.Interface
有多种命令行客户端可以与D-Bus交谈,有些比其他客户端更方便。这是我所知道的列表。
dbus-send
(随D-Bus提供)gdbus
(由GLIB提供)qdbus
(由Qt提供)busctl
(由systemd提供)答案 1 :(得分:1)
没有
很可能org.freedesktop.DBus.Properties.GetAll
会返回相同的值,但在内部,每个服务都会将属性实现为使用org.freedesktop.DBus.Properties.Get
/ org.freedesktop.DBus.Properties.GetAll
方法调用的邮件的处理程序。
它看起来像object.getProp("someproperty")
,因为它实际上更像是这个伪代码
bus.handleMessage({
service: "org.freedesktop.NetworkManager",
object: "/org/freedesktop/NetworkManager/Devices/0",
iface: "org.freedesktop.NetworkManager.Device.Interface",
body: [ "org.freedesktop.NetworkManager.Device", "Interface"],
thisMessageIsReplyTo: null
})
内部每个方法调用/信号/回复只是一个带有大签名(服务名称/对象路径/接口)和正文的消息