我可以只从 ip 获取网络接口列表吗?

end*_*and 4 command-line 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
Run Code Online (Sandbox Code Playgroud)

我并不真正关心所有的元数据,我只是在寻找接口名称。所以我想改为:

1: lo
84: eth0@if85
Run Code Online (Sandbox Code Playgroud)

有没有办法过滤ip addr命令的结果?我绝对可以在我的应用程序中做一些其他的 cli 魔术或只是 regex 魔术,但是有ip自己的过滤器会很好。

hee*_*ayl 5

是的你可以。

使用grep与PCRE( -P):

ip addr | grep -Po '^\d+:\s+\K[^:]+'
Run Code Online (Sandbox Code Playgroud)
  • ^\d+:\s+开始匹配接口名称之前的部分,\K丢弃匹配

  • [^:]+获取下一个部分,:即接口名称

类似的逻辑使用sed

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

在我的系统上:

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

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

你真正应该做的:

Linux 内核提供了一个查看硬件的接口,它sysfs安装在/sys.

您可以通过精确到/sys,/sys/class/net/目录的适当位置来获取接口名称。

在我的系统上:

% ls -1 /sys/class/net/
eth0
lo
wlan0
Run Code Online (Sandbox Code Playgroud)

其中每一个都是目录,子目录包含文件和目录,其中包含有关界面的所有信息。

以下是/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
Run Code Online (Sandbox Code Playgroud)

回答编辑后的问题:

获取接口名称和索引:

grep

ip addr | grep -o '^[0-9]\+:[^:]\+'
Run Code Online (Sandbox Code Playgroud)

sed

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

For each interface directory in /sys/class/net/, you can read the file ifindex. For example for interface eth0, the index file is:

/sys/class/net/eth0/ifindex
Run Code Online (Sandbox Code Playgroud)