先參考官方的 ubus 說明
列出現有的 object 來參考
root@OpenWrt:~# ubus list log network network.device network.interface network.interface.VLAN101 network.interface.lan network.interface.loopback network.interface.wan network.interface.wan6 network.wireless service session system uci
看看 wan 的狀態
root@OpenWrt:~# ubus call network.interface.wan status
{
"up": true,
"pending": false,
"available": true,
"autostart": true,
"dynamic": false,
"uptime": 5493,
"l3_device": "eth0",
"proto": "dhcp",
"device": "eth0",
"updated": [
"addresses",
"routes",
"data"
],
"metric": 0,
"delegation": true,
"ipv4-address": [
{
"address": "192.168.5.218",
"mask": 24
}
],
"ipv6-address": [
],
"ipv6-prefix": [
],
"ipv6-prefix-assignment": [
],
"route": [
{
"target": "192.168.5.254",
"mask": 32,
"nexthop": "0.0.0.0",
"source": "192.168.5.218\/32"
},
{
"target": "0.0.0.0",
"mask": 0,
"nexthop": "192.168.5.254",
"source": "192.168.5.218\/32"
}
],
"dns-server": [
"8.8.8.8",
"168.95.1.1"
],
"dns-search": [
"WIFI"
],
"inactive": {
"ipv4-address": [
],
"ipv6-address": [
],
"route": [
],
"dns-server": [
],
"dns-search": [
]
},
"data": {
"leasetime": 86400
}
}
輸出是 json 的結構,從上面的內容看到 wan 是透過 dhcp 取得 192.168.5.218/24
接下來要透過 jsonfilter (官網) 來抽出我們想要的內容。不確定原因,但是直接執行沒看到說明,所以進去原始碼看看語法:
print_usage(char *app)
{
printf(
"== Usage ==\n\n"
" # %s [-a] [-i | -s \"json...\"] {-t | -e }\n"
" -q Quiet, no errors are printed\n"
" -h, --help Print this help\n"
" -a Implicitely treat input as array, useful for JSON logs\n"
" -i path Specify a JSON file to parse\n"
" -s \"json\" Specify a JSON string to parse\n"
" -l limit Specify max number of results to show\n"
" -F separator Specify a field separator when using export\n"
" -t Print the type of values matched by pattern\n"
" -e Print the values matched by pattern\n"
" -e VAR= Serialize matched value for shell \"eval\"\n\n"
"== Patterns ==\n\n"
" Patterns are JsonPath: http://goessner.net/articles/JsonPath/\n"
" This tool implements $, @, [], * and the union operator ','\n"
" plus the usual expressions and literals.\n"
" It does not support the recursive child search operator '..' or\n"
" the '?()' and '()' filter expressions as those would require a\n"
" complete JavaScript engine to support them.\n\n"
"== Examples ==\n\n"
" Display the first IPv4 address on lan:\n"
" # ifstatus lan | %s -e '@[\"ipv4-address\"][0].address'\n\n"
" Extract the release string from the board information:\n"
" # ubus call system board | %s -e '@.release.description'\n\n"
" Find all interfaces which are up:\n"
" # ubus call network.interface dump | \\\n"
" %s -e '@.interface[@.up=true].interface'\n\n"
" Export br-lan traffic counters for shell eval:\n"
" # devstatus br-lan | %s -e 'RX=@.statistics.rx_bytes' \\\n"
" -e 'TX=@.statistics.tx_bytes'\n",
app, app, app, app, app);
}
我們要用的是 -e 這個操作,以 ip address 為例,要取的值是 ipv4-address 底下的 address
root@OpenWrt:~# ubus call network.interface.wan status | jsonfilter -e '@["ipv4-address"][0].address' 192.168.5.218
寫個 shell script 來測試
root@OpenWrt:/# cat /tmp/test.sh LAN_IP=`ubus call network.interface.lan status | jsonfilter -e '@["ipv4-address"][0].address'` LAN_MASK=`ubus call network.interface.lan status | jsonfilter -e '@["ipv4-address"][0].mask'` LAN_DEV=`ubus call network.interface.lan status | jsonfilter -e '@["device"]'` WAN_IP=`ubus call network.interface.wan status | jsonfilter -e '@["ipv4-address"][0].address'` WAN_MASK=`ubus call network.interface.wan status | jsonfilter -e '@["ipv4-address"][0].mask'` WAN_DEV=`ubus call network.interface.wan status | jsonfilter -e '@["device"]'` echo "LAN_IP=$LAN_IP" echo "LAN_MASK=$LAN_MASK" echo "LAN_DEV=$LAN_DEV" echo "WAN_IP=$WAN_IP" echo "WAN_MASK=$WAN_MASK" echo "WAN_DEV=$WAN_DEV" root@OpenWrt:/# /tmp/test.sh LAN_IP=192.168.1.1 LAN_MASK=24 LAN_DEV=br-lan WAN_IP=192.168.5.218 WAN_MASK=24 WAN_DEV=eth0