network_iface_name 매핑 생성 <--> IPv4 주소

network_iface_name 매핑 생성 <--> IPv4 주소

내 컴퓨터의 네트워크 카드(또는 인터페이스) 이름과 해당 IP 주소(가능한 경우 CIDR 형식) 간의 매핑을 생성하는 bash 스크립트를 구현하고 싶습니다.

목표는 연관 배열과 같은 것 또는 다음과 같은 파일을 갖는 것입니다.

lo: "127.0.0.1/8"
eth0: "192.168.1.123/24"
br-priv: ""      # <-- No IP assigned
wlan0: "10.42.0.10/24"

ifconfig및 명령을 사용할 수 있지만 ipIP 주소와 인터페이스 이름이 같은 줄에 표시되지 않기 때문에 출력을 구문 분석하는 것이 약간 까다롭기 때문에 인터페이스 IP 주소를 찾은 다음 롤백하여 네트워크 이름을 찾아야 합니다. 혹은 그 반대로도.

내 인터페이스 IP 주소를 찾는 다른 방법이 있나요?

아래의 모든 인터페이스 이름이 있습니다(디렉터리 이름으로)./sys/class/net/

root@borrajax:~# ls /sys/class/net/
br-priv/   eth0/    lo/    mon0/   wlan0/

하지만 이 디렉토리에서는 IP를 찾을 수 없습니다. 디렉터리를 반복하고 디렉터리 이름을 검색한 다음 다른 파일에서 IP를 읽을 수 있기 때문에 이는 매우 유용할 것입니다.

이는 임베디드 시스템에서 실행되도록 고안되었습니다.오픈WRT, 그러나 Debian 기반 시스템용 솔루션이 더 적합할 수 있습니다. bash혹시라도 내 버전은 4.2.28입니다.

답변1

아래의 "-o" 옵션을 사용하십시오 ip.

ip  -o addr  | sed -e 's/^[0-9]: \([^ ]*\).*inet \([^ \t]*\).*/\1: "\2"/;t;s/^[0-9]*: \([^ :]*\).*/\1: ""/g' | sort -r | sort -u -t: -k1,1

귀하의 경우 출력은 다음과 같아야 합니다.

br-priv: "" 
eth0: "192.168.1.123/24"
lo: "127.0.0.1/8"
wlan0: "10.42.0.10/24"

이 명령은 네트워크 장치당 하나의 IPv4만 인쇄합니다(동일한 인터페이스에서 여러 IP 주소를 구성할 수 있음).


설명하다:

표현 sed방식

s/^[0-9]: \([^ ]*\).*inet \([^ \t]*\).*/\1: "\2"/;

1: lo inet 127.0.0.1/8 brd 255 [...]다음 으로 교체lo: "127.0.0.1/8"

t;

가능하면 끝으로 이동합니다(= IPv4 주소를 찾았습니다). 그렇지 않으면:

s/^[0-9]*: \([^ :]*\).*/\1: ""/

IPv4 주소가 없는 줄 1: lo inet6 ::1/128 [...]lo: "".

모든 행이 자동으로 인쇄됩니다( -n플래그 없이).

이제 이 명령은 sort -r행을 역순으로 정렬합니다. 모든 경우에 IPv4 주소(예:)가 포함된 줄이 lo: "127.0.0.1/8"( )가 없는 lo: ""줄 앞에 옵니다 .

이 명령은 sort -u -t: -k1,1첫 번째 필드(인터페이스 이름, 구분 기호가 로 설정됨 :)에 고유한 정렬을 적용합니다. 이 예에서는 " 행만 lo: "127.0.0.1/8"먼저 나오므로(이전 정렬로 인해) 살아남습니다.

관련 정보