이 ip
명령은 일부 결과를 JSON 형식으로 반환할 수 있지만 라우팅 테이블의 형식을 지정할 수 없는 것 같습니다.
내가 의미하는 바에 대한 몇 가지 예는 다음과 같습니다.
모든 주소 목록:ip --json address show
[{ ... },{
"ifindex": 2,
"ifname": "eth0",
"flags": ["BROADCAST","MULTICAST","UP","LOWER_UP"],
"mtu": 1500,
"qdisc": "fq_codel",
"master": "lan0",
"operstate": "UP",
"group": "default",
"txqlen": 1000,
"link_type": "ether",
"address": "44:89:3f:e9:a8:08",
"broadcast": "ff:ff:ff:ff:ff:ff",
"addr_info": []
},{ ... }]
인터페이스 목록:ip --json link show
[{ ... },{
"ifindex": 2,
"ifname": "eth0",
"flags": ["BROADCAST","MULTICAST","UP","LOWER_UP"],
"mtu": 1500,
"qdisc": "fq_codel",
"master": "lan0",
"operstate": "UP",
"linkmode": "DEFAULT",
"group": "default",
"txqlen": 1000,
"link_type": "ether",
"address": "44:89:3f:e9:a8:08",
"broadcast": "ff:ff:ff:ff:ff:ff"
},{ ... }]
JSON에서도 경로 목록을 검색할 것으로 예상했지만 일반 텍스트 버전만 검색할 수 있었습니다.
경로 목록: ip --json route list
(아직 일반 텍스트입니다)
1.1.1.2 via 192.168.255.11 dev lan0 table hopper src 192.168.254.1 metric 10
default via 10.19.1.4 dev wg0 metric 5
default via 192.168.255.11 dev lan0 metric 6
10.19.1.0/24 dev wg0 scope link
124.214.110.113 via 192.168.255.11 dev lan0 metric 4
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.18.0.0/16 dev br-fea43fdf31f1 proto kernel scope link src 172.18.0.1
172.19.0.0/16 dev br-6f9e681d15b0 proto kernel scope link src 172.19.0.1 linkdown
192.168.0.0/16 dev lan0 proto kernel scope link src 192.168.254.1
192.168.1.0/24 dev wan0 proto kernel scope link src 192.168.1.9
192.168.1.0/24 via 192.168.255.11 dev lan0 metric 3
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
multicast 239.255.255.250/32 from 192.168.1.109/32 table default proto 17 unresolved
어디에서도 해결책을 찾을 수 없었기 때문에 제가 직접 질문에 답하고 여기에 제가 한 일을 남겨 두겠습니다.
언젠가 다시 필요할 수도 있고, 다른 사람도 같은 문제를 겪게 될 수도 있습니다! :-)
답변1
그래서 제가 한 일은 다음과 같습니다.
이 명령을 사용하여 정규식 사용 jq
결과를 구문 분석하고 출력을 JSON으로 변환했습니다. , 및ip route list table all
jq
온라인 샌드박스를 사용하려면 여기를 클릭하세요.이 솔루션이 이미 로드되어 있습니다.
다음은 완전한 명령입니다.
ip route list table all | jq --raw-input --slurp 'split("\n") | map(capture("^(?:(?<broadcast>broadcast) ?)?(?:(?<local>local) ?)?(?:(?<multicast>multicast) ?)?(?: ?(?<network>.*?) )(?:from (?<from>\\S+) ?)?(?:via (?<via>\\S+) ?)?(?:dev (?<dev>\\S+) ?)?(?:table (?<table>\\S+) ?)?(?:proto (?<proto>\\S+) ?)?(?:scope (?<scope>\\S+) ?)?(?:src (?<src>\\S+) ?)?(?:metric (?<metric>\\d+) ?)?(?<linkdown>linkdown)?(?<unresolved>unresolved)?"; "g"))'
결과는 다음과 같습니다.
[
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "1.1.1.2",
"from": null,
"via": "192.168.255.11",
"dev": "lan0",
"table": "hopper",
"proto": null,
"scope": null,
"src": "192.168.254.1",
"metric": "10",
"linkdown": null,
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "default",
"from": null,
"via": "10.19.1.4",
"dev": "wg0",
"table": null,
"proto": null,
"scope": null,
"src": null,
"metric": "5",
"linkdown": null,
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "default",
"from": null,
"via": "192.168.255.11",
"dev": "lan0",
"table": null,
"proto": null,
"scope": null,
"src": null,
"metric": "6",
"linkdown": null,
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "10.19.1.0/24",
"from": null,
"via": null,
"dev": "wg0",
"table": null,
"proto": null,
"scope": "link",
"src": null,
"metric": null,
"linkdown": null,
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "124.214.110.113",
"from": null,
"via": "192.168.255.11",
"dev": "lan0",
"table": null,
"proto": null,
"scope": null,
"src": null,
"metric": "4",
"linkdown": null,
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "172.17.0.0/16",
"from": null,
"via": null,
"dev": "docker0",
"table": null,
"proto": "kernel",
"scope": "link",
"src": "172.17.0.1",
"metric": null,
"linkdown": "linkdown",
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "172.18.0.0/16",
"from": null,
"via": null,
"dev": "br-fea43fdf31f1",
"table": null,
"proto": "kernel",
"scope": "link",
"src": "172.18.0.1",
"metric": null,
"linkdown": null,
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "172.19.0.0/16",
"from": null,
"via": null,
"dev": "br-6f9e681d15b0",
"table": null,
"proto": "kernel",
"scope": "link",
"src": "172.19.0.1",
"metric": null,
"linkdown": "linkdown",
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "192.168.0.0/16",
"from": null,
"via": null,
"dev": "lan0",
"table": null,
"proto": "kernel",
"scope": "link",
"src": "192.168.254.1",
"metric": null,
"linkdown": null,
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "192.168.1.0/24",
"from": null,
"via": null,
"dev": "wan0",
"table": null,
"proto": "kernel",
"scope": "link",
"src": "192.168.1.9",
"metric": null,
"linkdown": null,
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": null,
"network": "192.168.1.0/24",
"from": null,
"via": "192.168.255.11",
"dev": "lan0",
"table": null,
"proto": null,
"scope": null,
"src": null,
"metric": "3",
"linkdown": null,
"unresolved": null
},
{
"broadcast": "broadcast",
"local": null,
"multicast": null,
"network": "127.0.0.0",
"from": null,
"via": null,
"dev": "lo",
"table": "local",
"proto": "kernel",
"scope": "link",
"src": "127.0.0.1",
"metric": null,
"linkdown": null,
"unresolved": null
},
{
"broadcast": null,
"local": "local",
"multicast": null,
"network": "127.0.0.1",
"from": null,
"via": null,
"dev": "lo",
"table": "local",
"proto": "kernel",
"scope": "host",
"src": "127.0.0.1",
"metric": null,
"linkdown": null,
"unresolved": null
},
{
"broadcast": null,
"local": null,
"multicast": "multicast",
"network": "239.255.255.250/32",
"from": "192.168.1.109/32",
"via": null,
"dev": null,
"table": "default",
"proto": "17",
"scope": null,
"src": null,
"metric": null,
"linkdown": null,
"unresolved": "unresolved"
}
]
필요한 것에는 이미 충분하지만 시간이 조금이라도 남는다면 여전히 개선의 여지가 있습니다. 모든 null 값을 제거할 수 있고 "메트릭" 값을 숫자로 변환할 수 있으며 "브로드캐스트", "로컬"을 사용할 수 있습니다. , "멀티캐스트", "링크다운" 및 "해결되지 않음"은 부울일 수 있습니다.
답변2
출력을 JSON으로 jc
변환 netstat -r
하고 명령 하는 cli 도구를 작성했습니다 .route
$ jc netstat -rn | jq
[
{
"destination": "0.0.0.0",
"gateway": "192.168.71.2",
"genmask": "0.0.0.0",
"route_flags": "UG",
"mss": 0,
"window": 0,
"irtt": 0,
"iface": "ens33",
"kind": "route",
"route_flags_pretty": [
"UP",
"GATEWAY"
]
},
{
"destination": "172.17.0.0",
"gateway": "0.0.0.0",
"genmask": "255.255.0.0",
"route_flags": "U",
"mss": 0,
"window": 0,
"irtt": 0,
"iface": "docker0",
"kind": "route",
"route_flags_pretty": [
"UP"
]
},
{
"destination": "192.168.71.0",
"gateway": "0.0.0.0",
"genmask": "255.255.255.0",
"route_flags": "U",
"mss": 0,
"window": 0,
"irtt": 0,
"iface": "ens33",
"kind": "route",
"route_flags_pretty": [
"UP"
]
}
]
$ jc route | jq
[
{
"destination": "default",
"gateway": "gateway",
"genmask": "0.0.0.0",
"flags": "UG",
"metric": 100,
"ref": 0,
"use": 0,
"iface": "ens33",
"flags_pretty": [
"UP",
"GATEWAY"
]
},
{
"destination": "172.17.0.0",
"gateway": "0.0.0.0",
"genmask": "255.255.0.0",
"flags": "U",
"metric": 0,
"ref": 0,
"use": 0,
"iface": "docker0",
"flags_pretty": [
"UP"
]
},
{
"destination": "192.168.71.0",
"gateway": "0.0.0.0",
"genmask": "255.255.255.0",
"flags": "U",
"metric": 100,
"ref": 0,
"use": 0,
"iface": "ens33",
"flags_pretty": [
"UP"
]
}
]
수십 가지 다른 명령도 지원됩니다.
답변3
기본적으로 iproute2 유틸리티는 다음과 같은 --json 옵션을 지원합니다.
ip --json address show
ip --json link show
etc..
JSON 형식의 모든 구성/통계를 나열합니다.
그러나 경로와 같은 일부 경우에는 특정 경로 테이블만 나열됩니다. 모든 테이블을 나열하려면 다음 명령을 명시적으로 사용할 수 있습니다.
ip --json route show table all
다음과 같은 이름을 사용하여 특정 테이블을 가져올 수도 있습니다.
ip --json route show table default
[이미 답을 얻으셨는지 모르겠지만, 그렇지 않다면 이 내용이 도움이 되었으면 좋겠습니다... 안녕 :) ]