如何将脚本收发protobuf协议数据实现处理?

摘要:服务器使用二进制的 protobuf 协议,如何使用脚本模拟请求?答案是将它转成 json 再用 jq 处理,一起来看看吧~
问题背景 最近做了一个 ipv6 相关的功能,发现使用 getifaddrs 获取的本地 ipv6 地址有可能不是真实的网络 ipv6 地址: 例如上图中通过 getifaddrs 获得了多个本地 ipv6 地址,其中 <fe80> 开头的已知是本地 ipv6 地址,被排除;还有 <2408> 这种,其实也是 "假 ipv6" 地址,对应的设备并不能访问 ipv6 网络。 对于这种假 v6 地址,无法通过遍历的方式进行枚举排除,而一旦将 v4 网络环境错认为是 v6 环境,对后面的网络操作影响比较大。需要引入一种准确判断当前网络是否有 ipv6 访问能力的方法,为此 server 端同学专门给了一个判断接口。 probe_v6_addr 出于安全考虑,这里只列出接口名称部分: http://xxx.xxxxxxxxxx.xxxxxxx.xxxxx.xxx/xxx/probe_v6_addr 访问这个接口有两种返回,当不存在 v6 网络环境时: no v6 addr 当存在时,返回本机的 ipv6 地址: $ curl -s http://xxx.xxxxxxxxxx.xxxxxxx.xxxxx.xxx/xxx/probe_v6_addr + %240e:304:8183:2bcc:c16d:22d0:74ba:23e??- '2408:832e:c272:b36e:55bc:554a:8952:553e, &240e:3a0:7005:6ae2:d05a:754a:c21b:6c35??+ %240e:310:915:d939:9041:c01c:82db:a043??- '2408:832e:c271:3851:6926:e953:e741:b1a3??+ %240e:378:1e0c:db62:7088:a216:87c:4ccd??OP46C3:/ 虽然有部分二进制信息干扰,但是 ipv6 地址部分还是看得比较清楚的。返回的地址和 ifconfig 的结果可以相互印证: $ ifconfig | grep inet6 inet6 addr: fe80::fc8e:84ff:fec0:1534/64 Scope: Link inet6 addr: 240e:505:7e01:2994:f43c:5fc9:609e:5de6/64 Scope: Global inet6 addr: fe80::f43c:5fc9:609e:5de6/64 Scope: Link inet6 addr: fe80::8fd0:cd9e:52cd:5bc3/64 Scope: Link inet6 addr: 2409:8100:7b00:5781:a4a8:71ce:b11:3c5e/64 Scope: Global inet6 addr: fe80::a4a8:71ce:b11:3c5e/64 Scope: Link inet6 addr: ::1/128 Scope: Host inet6 addr: fe80::29f8:41f:7564:501d/64 Scope: Link inet6 addr: 240e:404:7e01:5d77:29f8:41f:7564:501d/64 Scope: Global inet6 addr: fe80::3d14:7716:4771:88fa/64 Scope: Link inet6 addr: 240e:304:8183:2bcc:c16d:22d0:74ba:23e/64 Scope: Global inet6 addr: 240e:304:8183:2bcc:d8c5:dce4:a89c:8a88/64 Scope: Global 其中 ipv6 地址240e:304:8183:2bcc:c16d:22d0:74ba:23e/64在两边都存在。 protobuf 上面的接口确实是基于二进制数据的协议,虽然是私有协议,但是采用了 protobuf 来进行规范,在提高性能的同时,也保留了一定的通用性。 但是这样一来,往常惯用的 curl + shell 大法要失灵了,给测试和验证工作带来了不小的麻烦。
阅读全文