내 컴퓨터의 네트워크 카드(또는 인터페이스) 이름과 해당 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
및 명령을 사용할 수 있지만 ip
IP 주소와 인터페이스 이름이 같은 줄에 표시되지 않기 때문에 출력을 구문 분석하는 것이 약간 까다롭기 때문에 인터페이스 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"
먼저 나오므로(이전 정렬로 인해) 살아남습니다.