我可以只從 ip 取得網路介面清單嗎?

我可以只從 ip 取得網路介面清單嗎?

我正在尋找檢索網路介面的清單。

目前我正在返回結果ip addr,然後從輸出中進行一些正則表達式/字串搜索,如下所示:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever 
84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link tentative 
       valid_lft forever preferred_lft forever

我並不真正關心所有元數據,我只是在尋找介面名稱。所以我想得到:

1: lo
84: eth0@if85

有沒有辦法過濾指令的結果ip addr?我絕對可以在我的應用程式中執行其他一些 cli 魔法或只是 regex 魔法,但最好有ip自己的過濾器。

答案1

是的你可以。

grep與 PCRE( ) 一起使用-P

ip addr | grep -Po '^\d+:\s+\K[^:]+'
  • ^\d+:\s+匹配開頭介面名稱之前的部分,\K丟棄匹配

  • [^:]+取得下一個部分:,即介面名稱

類似的邏輯使用sed

ip addr | sed -nE 's/^[[:digit:]]+:[[:blank:]]+([^:]+).*/\1/p'

在我的系統上:

% ip addr | grep -Po '^\d+:\s+\K[^:]+'
lo
eth0
wlan0

% ip addr | sed -nE 's/^[[:digit:]]+:[[:blank:]]+([^:]+).*/\1/p'
lo
eth0
wlan0

你真正該做的事情:

Linux 核心提供了一個用於查看硬體的接口,它sysfs安裝在/sys.

您只需精確地存取/sys,/sys/class/net/目錄的相應位置即可取得介面名稱。

在我的系統上:

% ls -1 /sys/class/net/
eth0
lo
wlan0

每個都是目錄,子目錄包含文件,目錄包含有關介面的所有資訊。

這是目錄內容的清單/sys/class/net/eth0

% ls -1 /sys/class/net/eth0                                    
addr_assign_type
address
addr_len
broadcast
carrier
carrier_changes
device
dev_id
dev_port
dormant
duplex
flags
gro_flush_timeout
ifalias
ifindex
iflink
link_mode
mtu
name_assign_type
netdev_group
operstate
phys_port_id
phys_port_name
phys_switch_id
power
queues
speed
statistics
subsystem
tx_queue_len
type
uevent

回答編輯後的問題:

若要取得介面名稱和索引:

grep:

ip addr | grep -o '^[0-9]\+:[^:]\+'

sed:

ip addr | sed -nE 's/^([[:digit:]]+:[^:]+).*/\1/p'

對於每個介面目錄/sys/class/net/,您都可以讀取該檔案ifindex。例如,對於 interface eth0,索引檔案為:

/sys/class/net/eth0/ifindex

相關內容