使用 ip address show type
顯示物理網路介面
使用 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屬性,它可以是幫助中的所有類型(vlan,veth,…),不要與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 ... link
為ip ... 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 address
或ip -d -j address | jq .
. 該-json
選項可用於多個iproute2命令,但不是所有命令。它對ip ...
命令的添加是最近的(2017 年中)。注意:實際上
type
在JSON中使用該關鍵字時可以轉換為多種不同類型的屬性:.linkinfo.info_kind
是前面描述的實際介面類型,但也有.linkinfo.info_slave_kind
一個介面(包括真正的介面)具有橋或鍵作為主(分別bridge_slave
和bond_slave
)。這不會更改 JSON 結果,因為它不會檢查此屬性。無論如何,這樣的介面永遠不應該為它們設置 IP 地址:該地址應該設置為主機,儘管它是虛擬的,但它應該是與周圍物理環境互動時重要的介面。