我需要知道如何列出所有路由表的ID。 例如,我可以运行:
ip rule add fwmark 2 table 104 ip route add dev eth0 default via 192.168.3.7 table 104
ip rule list
调用显示:
0: from all lookup local 32765: from all fwmark 0x2 lookup 104 32766: from all lookup main 32767: from all lookup default
而对ip route show table 104
的呼叫显示:
default via 192.168.3.7 dev eth0
如果我然后调用ip rule del table 104
,随后调用ip rule list
显示:
0: from all lookup local 32766: from all lookup main 32767: from all lookup default
但是,对ip route show table 104
的调用仍然显示:
default via 192.168.3.7 dev eth0
我知道我可以使用ip route flush table 104
来ip route flush table 104
。 我希望能够刷新所有不是local
, main
和default
。 因此我希望能够列出现有的表格。
我已经看到人们使用cat /etc/iproute2/rt_tables
,但只会产生:
# # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep
我能做些什么来获得当前存在的所有表名? 提前致谢!
有一种方法可以列出所有表的所有路由条目。 ip route show table all
使用一些shellpipe道魔法,你可以像这样提取所有的表名和ID:
ip route show table all | grep "table" | sed 's/.*\(table.*\)/\1/g' | awk '{print $2}' | sort | uniq
要么
ip route show table all | grep -Po 'table \K[^\s]+' | sort -u
如果你只关心数字表名,添加一些grep过滤:
ip route show table all | grep "table" | sed 's/.*\(table.*\)/\1/g' | awk '{print $2}' | sort | uniq | grep -e "[0-9]"
要么
ip route show table all | grep -Po 'table \K[^\s]+' | sort -u | grep -e "[0-9]"
我能做些什么来获得当前存在的所有表名?
文件/etc/iproute2/rt_tables
是系统上表名的唯一来源。 在内部,路由表具有整数标识符。
你的问题的其余部分有点混乱。 如果一个表没有被规则引用,那么它被有效地“删除”,因为它不会影响系统的路由。 所以你可以像这样列出所有的活动路由表:
ip rule list | awk '/lookup/ {print $NF}'
这将lookup
路由规则中的所有lookup
操作并打印目标。
它看起来像路由表由64位整数标识。 如果你确实想要find所有具有规则的路由表,即使是对你的系统没有影响的非活动路由表,你也可以简单地迭代一个从1到2 ^ 64的循环:
seq 0 $(echo '2 64 ^ p' | dc) | xargs -iTABLE sh -c 'echo === TABLE ===; ip route show table TABLE'
…但这将会永远持续下去,因为64位占用了大量的空间。
(egrep '^\s*[0-9]' /etc/iproute2/rt_tables | awk '{print $2}' | sort -u; ip rule list | awk '/lookup/ {print $NF}' | sort -u; ip route show table all | sed 's/.*\(table.*\)/\1/g' | awk '{if($0 ~ /table/) print $2; else print "main";}' | sort -u) | sort | uniq -c
感谢导致这个组合的这个线程,它显示了当前包含路由的所有路由表,它们被规则引用,并且被命名,每个有内容的表的旁边有一个3,被引用,并被命名为2或者2如果三个条件中的一个或两个适用,则为1。