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 마술이나 정규식 마술을 확실히 수행할 수 있지만 ip자체 필터를 사용하는 것이 더 나을 것입니다.

답변1

그래 넌 할수있어.

grepPCRE()와 함께 사용 -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 커널은 .dll 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. 예를 들어, 인터페이스의 경우 eth0인덱스 파일은 다음과 같습니다.

/sys/class/net/eth0/ifindex

관련 정보