네트워크_03 arp 테이블에서 지정 IP 주소에 대응하는 MAC 주소를 표시하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: arp, awk
키워드: MAC 주소, IP 주소, ARP
사용처: 네트워크에서 IP 주소를 지정해서 대상의 물리 주소(MAC 주소)를 검색하고 싶을 때

실행 예제

$ ./arp.sh
192.168.2.1 -> 00:00:5e:XX:XX:XX

스크립트

#!/bin/sh

ipaddr="192.168.2.1" 

macaddr=$(arp -ap | awk "/\($ipaddr\)/ {print $4}") # --- 1

if [ -n "$macaddr" ]; then # ---------------------------- 2
  echo "$ipaddr -> $macaddr" # -------------------------- 3
else
  echo "$ipaddr가 ARP 캐쉬에 없습니다." # -----------------4
fi


   

해설

이 스크립트는 셸 변수 ipaddr로 지정한 IP 주소를 바탕으로 OS의 ARP 캐시를 검색해서 해당 네트워크 인터페이스의 MAC 주소를 표시합니다.

네트워크가 예상하지 못한 행동을 하거나 해서 문제가 생겼을 때 IP주소 같은 네트워크 계층뿐만 아니라 한 단계 더 아래에 있는 데이터 계층의 동작도 조사해야 합니다.

IP 주소에서 MAC 주소를 조사하려면 시스템 ARP 캐시를 참조합니다. ARP 캐시를 조작하는 명령어는 arp 명령어 입니다. arp 명령어 출력 포맷은 OS에 따라 조금 다르지만 다음과 같습니다. 여기에서 인수 없이 -a 옵션을 사용해서 ARP 캐시를 모두 표시합니다. -n 옵션도 함께 써서 이름을 해석하지 않도록 지정합니다.

  • arp 명령어 출력 예

    $ arp -an
    ? (192.168.2.2) at 74:8e:f8:XX:XX:XX [ether] on eth0
    ? (192.168.2.4) at d4:ae:52:XX:XX:XX [ether] on eth0
    ? (192.168.2.1) at 00:00:5e:XX:XX:XX [ether] on eth0
    

    맨 앞부분 ?는 호스트명입니다. -n 옵션을 주어 이름을 해석하지 않으므로 ?로 표시됩니다. 다음 괄호 안 값은 IP 주소 입니다. 해당 IP 주소와 통신하기 위한 MAC 주소는 “at… “ 부분입니다.

1에서 arp 명령어 출력은 awk를 써서 손봅니다. awk 필터에 /($ipaddr)/와 얻고 싶은 IP 주소를 지정합니다. 이렇게 하면 해당 IP 주소 줄만 액션으로 처리할 수 있습니다 .arp 명령어 출력 예를 보면 알 수 있 듯 arp 명령어의 IP 주소 앞 뒤에는 괄호()가 있습니다. 따라서 필터 지정을 할 때 괄호까지 씁니다.

1awk 액션 {} 부분은 {print $4}로 $4(4번째 컬럼)를 표시하도록 지정합니다. 이때 $4를 \로 이스케이프합니다. $ipaddr이라는 셸 변수를 awk 명령어에 집어넣으려면 전체를 따옴표로 둘러야 되는데 이는 $4를 있는 그대로 써두면 셸이 확장하기 때문입니다. 여기서 $4는 셸 변수가 아니라 4번째 컬럼을 의미하는 awk 변수입니다. awk 명령어 안에 셸 스크립트의 셸 변수를 집어넣기 위해서는 이렇게 전체를 따옴표로 둘러싸서 셸 변수를 확장하도록 하고, 그대신 $1, $2 같은 awk 변수의 $를 이스케이프하는 것도 한 방법입니다.

1의 결과로 셸 변수 macaddr에 검색하고 싶은 IP 주소에 대한 MAC 주소가 대입 가능하므로 2에서 값을 확인합니다. 여기서 test 명령어 -n 연산자를 써서 빈 문자열이 아닌가 확인합니다. 빈 문자열이 아니라면 3에서 echo 명령어로 해당하는 IP 주소와 MAC 주소 조합을 표시하고, 빈 문자열이라면 ARP 캐시에 없으므로 그때는 4처럼 echo 명령어로 표시합니다.

   

주의사항

  • 이 예제를 실행할 때는 미리 ARP 캐시를 작성해둬야 합니다. 대상 머신에 ping을 보내는 등의 통신을 시도한 직후에 확인합니다.