[Shell Script] CentOS에서 IP & Mac 주소 파싱하기

blog post 

 

 

이번 포스트에서는 CentOS에서 IP와 맥주소를 파싱하여 얻는 방법에 대해 다뤄보겠습니다. 

쉘 스크립트를 어떻게 쓰는가에 따라 방법이 다양하지만 몇 가지 방법에 대해서만 소개해 보도록 하겠습니다.

 

물론 아래 소개해 드리는 방법 외에도 파싱하는 방법은 많습니다. 참고만 하시기 바랍니다.

 

 

ifcfg 네트워크 설정 파일 활용

 

 

CentOS 리눅스 시스템에서 ip나 기타 인터페이스 관련 정보를 파싱하기 가장 쉬운 방법은 역시 ifcfg 네트워크 스크립트 파일에서 파싱하는 방법입니다. 간단하게 cat, grep, cut 등의 명령 조합으로 파싱할 수 있습니다.

 

//ipv4
[root@Compute0 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 | grep "IPADDR=" | cut -f 2 -d '='
192.168.0.25

//mac
[root@Compute0 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 | grep "HWADDR=" | cut -f 2 -d '='
xx:xx:xx:xx:xx:xx

 

하지만 veth, vxlan 같은 일부 가상 인터페이스는 리눅스에서 network 스크립트를 지원하지 않습니다. 따라서 이러한 가상 인터페이스에서 결과를 파싱해야 하는 경우에는 ifconfig 같은 네트워크 도구를 활용하는 방법이나 별도의 스크립트를 작성하는 방법을 생각해 봐야 합니다.

 

 

ip addr, ifconfig 명령을 통한 ip & mac 주소 파싱 방법

 

 

veth와 같은 가상 인터페이스의 정보는 네트워크 관리 도구를 통해 파싱해 볼 수 있습니다.

 

ip 와 ifconfig 명령은 리눅스에서 가장 많이 활용되는 ip 주소 확인 방법입니다. 여기에 다음과 같이 awk 명령을 사용하면 네트워크 인터페이스에 따른 ip 주소를 파싱해낼 수 있습니다.

 

//veth1 = veth type interface
[root@Compute0 ~]# ip -d link show veth1
9: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff promiscuity 0 
    veth addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

// ipv4
[root@Compute0 ~]# ifconfig veth1 | awk '/inet / {print $2}'
10.0.0.25

// ipv6
[root@Compute0 ~]# ifconfig veth1 | awk '/inet6 / {print $2}'
fe80::ac0f:62ff:fe2a:8bed

// mac
[root@Compute0 ~]# ifconfig veth1 | awk '/ether / {print $2}'
xx:xx:xx:xx:xx:xx

 

하지만 위의 방법은 ifconfig 명령의 결과에서 단순히 필드 값($2)만 보고 추출하게 됩니다. "inet" 같은 필드 명을 토대로 ip 주소를 받아오는 방법이라기 보다는, 단순히 inet 키워드가 존재하는 라인만 찾고 그 라인에서 두 번째 필드의 값을 가져오는 방법입니다.

 


좀 더 정확히, inet 키워드의 다음 항목에 있는 ip 값을 어떻게 가져올지 고민해 보았습니다. 방법은 많겠지만 다음과 같이 awk의 반복문으로 inet 키워드를 검사하고 해당 키워드의 바로 다음 필드에 있는 값을 가져오는 방식으로도 파싱할 수 있습니다.

 

[root@Compute0 ~]# key="inet"; ifconfig veth1 | grep $key" " | awk -v x=$key '{for(i = 1; i <= NF; i++) { if($i==x) print $(i+1)}}'
10.0.0.25

 

물론 위 코드에서 키워드만 바꾸면 아래와 같이 맥주소나 ipv6 주소도 얻어올 수 있습니다. netmask, broadcast 정보 등 다른 필드도 가능합니다. 

 

[root@Compute0 ~]# key="inet6"; ifconfig veth1 | grep $key" " | awk -v x=$key '{for(i = 1; i <= NF; i++) { if($i==x) print $(i+1)}}'
fe80::ac0f:62ff:fe2a:8bed

 

 CIDR 표기법으로 파싱하고자 하는 경우에는 ip addr show 명령을 활용할 수도 있습니다.

 

[root@Compute0 ~]# key="inet"; ip addr show veth1 | grep $key" " | awk -v x=$key '{for(i = 1; i <= NF; i++) { if($i==x) print $(i+1)}}'
10.0.0.25/24

 

 

proc에서 현재 시스템의 전체 인터페이스에 할당된 ip 추출

 

 

/proc/net/fib_trie 파일을 활용하면 현재 시스템에 존재하는 인터페이스에 할당된 모든 ip를 일괄적으로 추출할 수 있습니다.

 

[root@Compute0 ~]# awk '/32 host/ { print f } {f=$2}' <<< "$(</proc/net/fib_trie)"
10.0.0.25
127.0.0.1
192.168.0.25
10.0.0.25
127.0.0.1
192.168.0.25

 

중복처리만 별도로 해주면 됩니다. 다만 인터페이스 명이 구분되지 않는다는 한계가 있습니다. 

 

TAGS.

Comments