iproute2:如何顯示網路設備的類型?
使用iproute2使用者空間工具,可以使用ip命令動詞
link show
(有時縮寫為l sh
)顯示網路設備。輸出生成不顯示連結/介面設備的類型。
root@box:/# ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eno3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether bc:97:e1:58:10:18 brd ff:ff:ff:ff:ff:ff 3: eno1np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether bc:97:e1:58:10:1a brd ff:ff:ff:ff:ff:ff 4: eno2np1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether bc:97:e1:58:10:1b brd ff:ff:ff:ff:ff:ff
每個連結都以冗餘的方式告訴資訊
mtu
,例如UP
/DOWN
兩次,但是我沒有明顯的跡象表明它的類型。此外,我在熱的聯機幫助頁中找不到任何指示來顯示TYPE
,儘管其中有很多:TYPE := [ bridge | bridge_slave | bond | bond_slave | can | dummy | hsr | ifb | ipoib | macvlan | macvtap | vcan | veth | vlan | vxlan | ip6tnl | ipip | sit | gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan | vti | vrf | nlmon | ipvlan | lowpan | geneve | macsec ]
ip2route 工具是否有內置方式來輸出列表中的類型?
介面類型資訊,很少使用,一般只有在添加選項後才會顯示:
-details
ip
-d
,-details
輸出更詳細的資訊。
因此
ip -details link show
,將為所有這些介面顯示此資訊,以及許多其他附加資訊,例如:$ ip -d link show lxcbr0 7: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether 00:16:3e:00:00:00 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 bridge forward_delay 1500 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 0 vlan_protocol 802.1Q bridge_id 8000.0:16:3e:0:0:0 designated_root 8000.0:16:3e:0:0:0 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer 0.00 tcn_timer 0.00 topology_change_timer 0.00 gc_timer 34.76 vlan_default_pvid 1 vlan_stats_enabled 0 vlan_stats_per_port 0 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 16 mcast_hash_max 4096 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3124 mcast_stats_enabled 0 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
在
bridge
第 3 行的開頭。在命令中使用 JSON 輸出
jq
(這是從 shell 處理 JSON 時必備的工具)允許可靠地解析命令的輸出,而無需事先知道類型,如果只想通過介面名稱檢索此資訊。$ ip -details -json link show | jq --join-output '.[] | .ifname," ",.linkinfo.info_kind,"\n"' lo null dummy0 dummy dummy2 dummy lxcbr0 bridge wlan0 null eth0 null virbr0 bridge virbr0-nic tun tap0 tun veth0 veth test veth wireguard0 wireguard vethZ0ZQFJ veth
真正的介面(以及
lo
)沒有類型(即.[].linkinfo.info_kind
不存在)並且jq將為不存在的欄位返回null。它可以用這個過濾掉:ip -details -json link show | jq --join-output '.[] | .ifname," ", if .linkinfo.info_kind != null then .linkinfo.info_kind else empty end, "\n"'
實際上,搜尋功能
ip link show
將種類和從種類組合為type,詳細輸出會在第 3 行顯示一個,在第 4 行顯示另一個。在 JSON 輸出中,這是兩個不同的欄位:.[].linkinfo.info_kind
和.[].linkinfo.info_slave_kind
,因此從屬類型需要另一個命令,同樣用於顯示兩者。這是兩者的範例:ip -details -json link show | jq --join-output ' .[] | if .ifname != null then .ifname, " ", if .linkinfo.info_kind != null then .linkinfo.info_kind else empty end, " ", if .linkinfo.info_slave_kind != null then .linkinfo.info_slave_kind else empty end, "\n" else empty end '
而是輸出:
lo dummy0 dummy dummy2 dummy lxcbr0 bridge wlan0 eth0 virbr0 bridge virbr0-nic tun bridge tap0 tun veth0 veth test veth wireguard0 wireguard vethZ0ZQFJ veth bridge
並在這裡顯示virbr0-nic是一個tun(實際上是tuntap,因為它是tun或tap在一個子欄位中)設備以及一個橋從設備,而vethZ0ZQFJ是一個veth設備以及一個橋從設備。
上面相同的jq
ip ... link show ... type ...slave
過濾器也可以處理查詢從介面時的過濾輸出,這顯然會通過忽略沒有介面名稱的(空)條目來為不匹配的介面返回額外的空對象。因此,以開頭的行將ip -details -json link show type bridge_slave |
僅返回:virbr0-nic tun bridge vethZ0ZQFJ veth bridge