![我可以只从 ip 获取网络接口列表吗?](https://linux22.com/image/89242/%E6%88%91%E5%8F%AF%E4%BB%A5%E5%8F%AA%E4%BB%8E%20ip%20%E8%8E%B7%E5%8F%96%E7%BD%91%E7%BB%9C%E6%8E%A5%E5%8F%A3%E5%88%97%E8%A1%A8%E5%90%97%EF%BC%9F.png)
我正在寻找检索网络接口的列表。
目前我正在返回结果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