我正在研究如何从我正在编写的工作站应用程序更改 IP 地址(和 DHCP 设置),这就是我需要/想要为此目的使用 dbus 的原因。
太复杂了!所以我尝试使用 gdbus cli 来学习。
我采用的方法是使用 gdbus 获取要修改的以太网适配器的设置。然后更改该数据并将其发送回 DBus。
我非常接近成功,因为 IP 地址几乎发生了变化。我只需打开 gnome GUI 并单击相关适配器的复选标记即可“踢”它。这样设置就会生效。
我不知道单击该复选标记会调用什么 dbus 命令,但我确信这是我使用 gdbus cli 更改 IP 地址所需要知道的最后一件事。
这是我用来设置 IP 地址的脚本,我更改了ipv4.addresses
、和ipv4.address-data
字段以便它们指定相同的地址。
#/bin/bash
gdbus call \
--system \
--dest org.freedesktop.NetworkManager \
--object-path /org/freedesktop/NetworkManager/Settings/1 \
--method org.freedesktop.NetworkManager.Settings.Connection.Update2 \
"{\
'802-3-ethernet':\
{\
'auto-negotiate': <false>,\
'mac-address': <[byte 0x00, 0x0c, 0x29, 0x4e, 0x29, 0xe2]>,\
'mac-address-blacklist': <@as []>,\
's390-options': <@a{ss} {}>\
},\
'connection':\
{\
'id': <'Wired connection 1'>,\
'uuid': <'d075ed7c-c8cc-3db7-b0fb-d0687331a7a0'>,\
'type': <'802-3-ethernet'>,\
'permissions': <@as []>,\
'autoconnect-priority': <-999>,\
'timestamp': <uint64 1539968649>\
},\
'ipv6':\
{\
'method': <'ignore'>,\
'dns': <@aay []>,\
'dns-search': <@as []>,\
'addresses': <@a(ayuay) []>,\
'routes': <@a(ayuayu) []>,\
'ip6-privacy': <0>,\
'address-data': <@aa{sv} []>,\
'route-data': <@aa{sv} []>\
},\
'ipv4':\
{
'method': <'manual'>,\
'dns': <[uint32 4261521600]>,\
'dns-search': <@as []>,\
'addresses': <[[uint32 3321997504, 24, 16885952]]>,\
'gateway': <'192.168.1.1'>,
'routes': <@aau []>,\
'address-data': <[{'address': <'192.168.1.198'>, 'prefix': <uint32 24>}]>,\
'route-data': <@aa{sv} []>\
},\
'proxy': {}\
}"\
1\
{}
这是我调用它时得到的结果...
$ ./set.sh
(@a{sv} {},)
如果我现在打开网络设置 GUI,则会出现一个“正在进行”的旋转圆圈,并且 UI 会显示旧地址。单击连接名称旁边的复选标记会导致 GUI 刷新以显示我请求的更新地址。
我还在一个单独的终端中获得了大量的监控输出,我设置这个终端来报告 NetworkManager 的更改,如下所示:
$ gdbus monitor --system --dest org.freedesktop.NetworkManager --object-path /org/freedesktop/NetworkManager
如果您认为监控输出有帮助,我会将其粘贴到评论中。
那么,那个复选标记(图像中“有线连接 1”右侧的复选标记)下发生了什么神奇的事情。
我正在运行 Ubuntu 18.04 LTS。
谢谢!
答案1
我找到了答案。
通过运行$ sudo dbus-monitor --system
(NB,这是一个不同的实用程序gdbus-monitor
),我能够嗅探系统 dbus 上的流量。
所以我...1)在一个终端运行监视器2)set.sh
在另一个终端运行我的脚本3)浏览终端 1 中的所有日志并在其末尾复制了一个时间戳。4)单击复选标记以激活连接。5)将时间戳复制到文本文件中。6)在监视终端中全选并粘贴到同一个文本文件中。7)搜索时间戳(在 5000 多行日志中,没开玩笑!)以找到单击引起的 dbus 命令,并将其转换为activate.sh
后面的脚本。
击鼓....
#!/bin/bash
gdbus call \
--system \
--dest org.freedesktop.NetworkManager \
--object-path /org/freedesktop/NetworkManager \
--method org.freedesktop.NetworkManager.ActivateConnection \
"/org/freedesktop/NetworkManager/Settings/1"\
"/org/freedesktop/NetworkManager/Devices/2"\
"/"
我传递的参数/org/freedesktop/NetworkManager/Settings/1
以及随后的参数可以从特定设备的 dbus 中获取,一旦获得它们,我就将它们硬编码到我的以太网适配器中。
我现在可以打开网络设置 GUI 并运行set.sh
,然后activate.sh
查看 GUI 使用新设置进行更新。
我认为 dbus 很酷,但文档不够友好。事实证明,逆向工程比阅读文档更有效。
谢谢阅读!