1. 사용 명령어 |
(1) arp
(2) awk
2. 키워드 & 사용처 |
(1) 키워드
MAC 주소, IP 주소, ARP
(2) 사용처
네트워크에서 IP 주소를 지정해서 대상의 물리 주소(MAC 주소)를 검색하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ./arp.sh
192.168.2.1 -> 00:00:5e:XX:XX:XX
4. 스크립트 |
#!/bin/sh
ipaddr="192.168.2.1"
macaddr=$(arp -ap | awk "/\($ipaddr\)/ {print \$4}") ①
if [ -n "$macaddr" ]; then ②
echo "$ipaddr -> $macaddr" ③
else
echo "$ipaddr가 ARP 캐시에 없습니다." ④
fi
5. 해설 |
이 스크립트는 셸 변수 ipaddr로 지정한 IP 주소를 바탕으로 OS의 ARP 캐시를 검색해서 해당 네트워크 인터페이스의 MAC 주소를 표시합니다.
네트워크가 예상하지 못한 행동으 ㄹ하거나 문제가 생겼을 때 IP주소 같은 네트워크 계층뿐만 아니라 한 단계 더 아래에 있는 데이터 계층의 동작도 조사해야 합니다.
IP 주소에서 MAC 주소를 조사하려면 시스템 ARP 캐시를 참조합니다. ARP 캐시를 조작하는 명령어는 arp 명령어 입니다. arp 명령어 출력 포맷은 OS에 따라 조금 다르지만 다음과 같습니다. 여기에서 인수 없이 -a 옵션을 사용해서 ARP 캐시를 모두 표시합니다. -n 옵션도 함께 써서 이름을 해석하지 않도록 지정합니다.
$ 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... " 부분입니다.
①에서 arp 명령어 출력은 awk를 사용합니다. awk 필터에 /\($ipaddr\)/와 얻고 싶은 IP 주소를 지정합니다. 이렇게 하면 해당 IP 주소 줄만 액션으로 처리할 수 있습니다 .arp 명령어 출력 예를 보면 알 수 있듯 arp 명령어의 IP 주소 앞 뒤에는 괄호()가 있습니다. 따라서 필터 지정을 할 때 괄호까지 씁니다.
①의 awk 액션 {} 부분은 {print \$4}로 $4(4번째 컬럼)를 표시하도록 지정합니다. 이때 $4를 \로 이스케이프합니다. $ipaddr이라는 셸 변수를 awk 명령어에 집어넣으려면 전체를 따옴표로 둘러야 되는데 이는 $4를 있는 그대로 써두면 셸이 확장하기 때문입니다. 여기서 $4는 셸 변수가 아니라 4번째 컬럼을 의미하는 awk 변수입니다. awk 명령어 안에 셸 스크립트의 셸 변수를 집어넣기 위해서는 이렇게 전체를 따옴표로 둘러싸서 셸 변수를 확장하도록 하고, 그대신 $1, $2 같은 awk 변수의 $를 이스케이프하는 것도 한 방법입니다.
①의 결과로 셸 변수 macaddr에 검색하고 싶은 IP 주소에 대한 MAC 주소가 대입 가능하므로 ②에서 값을 확인합니다. 여기서 test 명령어 -n 연산자를 써서 빈 문자열이 아닌가 확인합니다. 빈 문자열이 아니라면 ③에서 echo 명령어로 해당하는 IP 주소와 MAC 주소 조합을 표시하고, 빈 문자열이라면 ARP 캐시에 없으므로 그때는 ④처럼 echo 명령어로 표시합니다.
<주의사항>
이 예제를 실행할 때는 미리 ARP 캐시를 작성해둬야 합니다.
대상 머신에 ping을 보내는 등의 통신을 시도한 직후에 확인합니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 네트워크 - 060 IP 주소로 호스트명 얻기 (0) | 2021.04.06 |
---|---|
[Linux 셸 스크립트] 네트워크 - 059 호스트명으로 IP 주소 취득하기 (0) | 2021.03.31 |
[Linux 셸 스크립트] 네트워크 - 057 ping으로 특정 호스트 응답 평균 시간을 취득하기 (0) | 2021.03.30 |
[Linux 셸 스크립트] 네트워크 - 056 디폴트 게이트웨이에 ping이 통하는지 확인하기(FreeBSD/Mac) (0) | 2021.03.30 |
[Linux 셸 스크립트] 네트워크 - 055 디폴트 게이트웨이에 ping이 통하는지 확인하기(리눅스) (0) | 2021.03.29 |
댓글