Linux-Networking

使用 ip address show type 顯示物理網路介面

  • May 30, 2020

使用 Ubuntu 20.04。我在如何僅獲取物理乙太網介面的名稱中學習過?只顯示物理網路介面,我們可以這樣做

ls -l /sys/class/net/ | grep -v virtual

我嘗試(未成功)使用ip address show type XXX. 根據ip address help可能的類型有:

TYPE := { vlan | veth | vcan | vxcan | dummy | ifb | macvlan | macvtap |
         bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan | lowpan |
         gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan | vti |
         nlmon | can | bond_slave | ipvlan | geneve | bridge_slave |
         hsr | macsec | netdevsim }

Q1。是否可以使用ip address僅顯示物理介面?例如,查看機器的本地 IP 地址。

Q2。也許有一個很好的理由沒有對應於物理介面的類型。理由是什麼?

介面類型更像是連結屬性而不是地址屬性,即使此資訊可以(但不總是)在ip address的輸出中可用。因此,用於回答OP 問題標題ip link show的命令將是……

…但是硬體介面沒有關聯的類型。只有虛擬介面才能獲得這一點,因為它是一個沒有真實介面的附加屬性(這回答了 Q2,但請參閱最後的註釋)。因此,沒有允許顯示物理類型的類型,並且由於過濾器選項中也沒有可用的否定(也沒有顯示要否定的任何類型的表達式),因此命令語法中沒有可用的過濾器來顯示此類介面。

要找到這些界面,您必須顯示所有這些界面,並使用外部過濾器過濾掉那些沒有類型的界面。因此,ip link單獨使用命令無法完成的事情,可以通過使用適當的工具過濾其輸出來完成:jq使用ip -details -json link’s JSON 輸出,進行可靠解析。有這個jq文件來學習如何使用它,手冊頁是基於它的內容。

從完整的界面列表中,必須這樣做:

  • 排除找到的任何類型(在 JSON 輸出中是linkinfo的**info_kind屬性,它可以是幫助中的所有類型(vlanveth,…),不要與link_type混淆,例如loopback乙醚沒有…)。
  • 排除環回link_type

這轉化為:

ip -details -json link show | jq -r '
.[] | 
     if .linkinfo.info_kind // .link_type == "loopback" then
         empty
     else
         .ifname
     end
'

比如這個系統目前一共有12個介面,只有這兩個,只有兩個真實的,用上面的命令顯示:

eth0
wlan0

隨意改進這個jq過濾器。

為了解決問題 Q1,在這種情況下,替換ip ... linkip ... address將給出相同的輸出。但是要顯示除了介面之外的地址,過濾器當然必須改變(並且需要一個足夠新的jq命令來允許自定義處理換行符):

ip -details -json address show | jq --join-output '
.[] | 
     if .linkinfo.info_kind // .link_type == "loopback" then
         empty
     else
         .ifname ,
         ( ."addr_info"[] |
             if .family == "inet" or .family == "inet6" then
                 " " + .local
             else
                 empty
             end
         ),
         "\n"
     end
'

如果您想直接檢查整個 JSON 輸出,請嘗試ip -details -pretty -json addressip -d -j address | jq .. 該-json選項可用於多個iproute2命令,但不是所有命令。它對ip ...命令的添加是最近的(2017 年中)。


注意:實際上type在JSON中使用該關鍵字時可以轉換為多種不同類型的屬性:.linkinfo.info_kind是前面描述的實際介面類型,但也有.linkinfo.info_slave_kind一個介面(包括真正的介面)具有橋或鍵作為主(分別bridge_slavebond_slave)。這不會更改 JSON 結果,因為它不會檢查此屬性。

無論如何,這樣的介面永遠不應該為它們設置 IP 地址:該地址應該設置為主機,儘管它是虛擬的,但它應該是與周圍物理環境互動時重要的介面。

引用自:https://serverfault.com/questions/1019363