我想使用更多的iproute2
(ip
命令)实用程序而不是已弃用的net-tools
(ifconfig
,,route
...)。
我不断回顾的主要原因是,以我的拙见,与旧的明显提供的内容相比,其net-tools
输出ip route
缺乏清晰度route
栏目标题:
IP路由:
default via 192.168.134.254 dev enp1s0 proto static metric 100 10.42.0.0/24 dev wlp2s0 proto kernel scope link src 10.42.0.1 metric 600 10.56.30.0/24 dev enx00133b0402c2 proto kernel scope link src 10.56.30.143 169.254.0.0/16 dev wlp2s0 scope link metric 1000 192.168.57.0/24 dev vboxnet1 proto kernel scope link src 192.168.57.1 linkdown 192.168.134.0/24 dev enp1s0 proto kernel scope link src 192.168.134.142 metric 100
路线:
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 192.168.134.254 0.0.0.0 UG 100 0 0 enp1s0 10.42.0.0 * 255.255.255.0 U 600 0 0 wlp2s0 10.56.30.0 * 255.255.255.0 U 0 0 0 enx00133b0402c2 link-local * 255.255.0.0 U 1000 0 0 wlp2s0 192.168.57.0 * 255.255.255.0 U 0 0 0 vboxnet1 192.168.134.0 * 255.255.255.0 U 100 0 0 enp1s0
问题:有没有办法使用命令清晰/漂亮地显示路由ip
?
答案1
软件包iproute2
(Debian、Ubuntu)和iproute
软件包(CentOS、RedHat)都包含专门为此设计的实用程序:routel
,列出具有漂亮输出格式的路由。
输出示例:
[2022-02-12 04:21:05]» routel
target gateway source proto scope dev tbl
default 192.168.1.1 ob-top
10.171.32.0/ 24 10.171.32.1 kernel link lxdbr0
169.254.0.0/ 16 link ob-top
172.17.0.0/ 16 172.17.0.1 kernel linkdocker0
192.168.1.0/ 24 192.168.1.101 kernel link ob-top
192.168.122.0/ 24 192.168.122.1 kernel link virbr0
10.171.32.0 broadcast 10.171.32.1 kernel link lxdbr0 local
10.171.32.1 local 10.171.32.1 kernel host lxdbr0 local
10.171.32.255 broadcast 10.171.32.1 kernel link lxdbr0 local
127.0.0.0 broadcast 127.0.0.1 kernel link lo local
127.0.0.0/ 8 local 127.0.0.1 kernel host lo local
127.0.0.1 local 127.0.0.1 kernel host lo local
127.255.255.255 broadcast 127.0.0.1 kernel link lo local
172.17.0.0 broadcast 172.17.0.1 kernel linkdocker0 local
172.17.0.1 local 172.17.0.1 kernel hostdocker0 local
172.17.255.255 broadcast 172.17.0.1 kernel linkdocker0 local
192.168.1.0 broadcast 192.168.1.101 kernel link ob-top local
192.168.1.101 local 192.168.1.101 kernel host ob-top local
192.168.1.255 broadcast 192.168.1.101 kernel link ob-top local
192.168.122.0 broadcast 192.168.122.1 kernel link virbr0 local
192.168.122.1 local 192.168.122.1 kernel host virbr0 local
192.168.122.255 broadcast 192.168.122.1 kernel link virbr0 local
答案2
几年后回答我自己的问题......
我刚刚了解到 2018 年 2 月添加了漂亮的颜色显示。这使输出对我来说更容易阅读:
从人的IP地址:
-c[color][={always|auto|never} Configure color output. If parameter is omitted or always, color output is enabled regardless of stdout state. If parameter is auto, stdout is checked to be a terminal before enabling color output. If parameter is never, color output is disabled. If specified multiple times, the last one takes precedence. This flag is ignored if -json is also given.
答案3
这个 awk 脚本假设(也许是错误的)输出值是成对的关键词值,例如scope link
,但有一些例外,例如第一列和linkdown
关键字。它累积列和数据并打印结果:
awk '
{ i = 1; h = " ip"
hdr[h] = 1
col[h,NR] = $i
for(i=2;i<=NF;){
if($i=="linkdown"){extra[NR] = $i; i++; continue}
hdr[$i] = 1
col[$i,NR] = $(i+1)
i += 2
}
}
END{ #PROCINFO[sorted_in] = "@ind_str_asc"
n = asorti(hdr,x)
for(i=1;i<=n;i++){ h = x[i]; max[h] = length(h) }
for(j = 1;j<=NR;j++){
for(i=1;i<=n;i++){
h = x[i]
l = length(col[h,j])
if(l>max[h])max[h] = l
}
}
for(i=1;i<=n;i++){ h = x[i]; printf "%-*s ",max[h],h }
printf "\n"
for(j = 1;j<=NR;j++){
for(i=1;i<=n;i++){ h = x[i]; printf "%-*s ",max[h],col[h,j] }
printf "%s\n",extra[j]
}
}'
结果比 80 列宽:
ip dev metric proto scope src via
default enp1s0 100 static 192.168.134.254
10.42.0.0/24 wlp2s0 600 kernel link 10.42.0.1
10.56.30.0/24 enx00133b0402c2 kernel link 10.56.30.143
169.254.0.0/16 wlp2s0 1000 link
192.168.57.0/24 vboxnet1 kernel link 192.168.57.1 linkdown
192.168.134.0/24 enp1s0 100 kernel link 192.168.134.142
该脚本使用关联数组hdr
来保存找到的关键字,二维col
数组通过该关键字和行号进行索引来保存值。第一列用一个发明的ip
关键字进行特殊处理,该关键字有一个前导空格以确保它被排序到第一列。该extra
数组记录了linkdown
lone 关键字。
在数据末尾,标题被排序到索引数组中x
,我们遍历所有值找到最大列宽。然后打印列标题,然后打印保存的数据。
答案4
这是一个改编@therealak12 的回答。
flags
通过首先将所有 JSON 值转换为字符串来包含数组jq 'map( with_entries( .value |= tostring ) ) | ...'
- 添加更多列 (
ip -d ...
) - 添加所有路由表中的数据 (
ip route show table all
) - 用于
column -ts $'\t'
指示制表符作为唯一的列分隔符
ip -d -j route show table all | jq -r 'map( with_entries( .value |= tostring ) ) | ["target(dst)", "via(gateway)", "source(prefsrc/src)", "dev", "protocol(proto)", "scope", "type", "metric", "table", "pref", "flags"], (.[] | [.dst // "-", .gateway // "-", .prefsrc // "-", .dev // "-", .protocol // "-", .scope // "-", .type // "-", .metric // "-", .table // "-", .pref // "-", .flags // "-"]) | @tsv' | column -ts $'\t'