1. 사용 명령어 |
(1) ifconfig
(2) awk
2. 키워드 & 사용처 |
(1) 키워드
NIC, IP 주소, 네트워크 인터페이스
(2) 사용처
서버 NIC와 IP 주소 목록을 표시하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ./nic-ipaddr.sh
[eth0]
10.211.55.18
[eth1]
[lo]
127.0.0.1 <- eth0과 lo의 IP 주소 표시. eth1은 IP 주소가 할당되지 않음
4. 스크립트 |
#!/bin/sh
# ifconfig 명령어로 유효한 인터페이스 표시
# awk 명령어로 인터페이스명과 IP 주소 추출
LANG=C /sbin/ifconfig |\ ①
awk '/^[a-z]/ {print "[" $1 "]"} ②
/inet / {split($2,arr,":"); print arr[2]}' ③
5. 해설 |
이 스크립트는 서버 네트워크 인터페이스와 거기에 할당된 IP 주소를 표시합니다. IP 주소 취득은 ifconfig 명령어로 하고 그 출력을 awk 명령어로 가공합니다. 이때 이 서버에는 네트워크 인터페이스로 eth0과 eth1이 있고 인터페이스는 둘 다 유효(UP)하지만 IP 주소는 eth0에만 설정되어 있다고 가정합니다.
예제에서 사용한 ifconfig 명령어는 서버 네트워크 설정이나 정보를 취득하는 명령어입니다. 다음처럼 인수 없이 실행하면 서버에서 현재 유효한 네트워크 인터페이스 정보(링크 상태, MAC 주소, IP 주소, 전송 패킷 수 등)를 표시합니다. 그리고 ifconfig 명령어는 리눅스, Mac, FreeBSD에서 서로 조금씩 출력이 다릅니다. 따라서 리눅스 외에서는 예제를 그대로 사용할 수 없으므로 주의사항을 참조하기 바랍니다.
ifconfig 명령어를 인수 없이 실행하면 아래와 같습니다.
$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:1C:42:4B:9B:8B
inet addr:10.211.55.18 Bcast:10.211.55.255 Mask:255.255.255.0
inet6 addr: fe80::21c:42ff:fe4b:9b8b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:53 errors:0 dropped:0 overruns:0 frame:0
TX packets:48 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7153 (6.9 KiB) TX bytes:6605 (6.4 KiB)
eth1 Link encap:Ethernet HWaddr 00:1C:42:5E:13:47
... 생략 ...
lo Link encap:Local Loopback
... 생략 ...
ifconfig 명령어는 서버 관리에 자주 사용하는 명령어인데 출력하는 내용이 많아서 다루기가 조금 번거롭습니다. 네트워크 설정 확인이라면 예제처럼 간단히 서버 네트워크 인터페이스와 IP 주소만 표시하고 싶을 때도 있을 것입니다.
①에서 ifconfig 명령어를 실행합니다. 이때 영어로 표기하도록 LANG=C를 지정합니다. 그리고 리눅스에서 /sbin을 경로에 포함하지 않는 경우도 있으므로 ifconfig 명령어를 완전 경로로 지정해서 실행합니다. 출력 결과를 파이프로 awk 명령어에 보내는데 한 줄이 길어지므로 줄 끝에 \를 써서 줄바꿈합니다.
②의 awk 명령어는 우선 /^[a-z]/ 패턴을 사용합니다. 이것은 인터페이스명을 출력하기 위한 패턴입니다. ifconfig 명령어는 줄 처음에 인터페이스명을 표시하고 그 다음부터는 들여쓰기(indent)해서 링크 상태 등 각종 정보를 표시합니다. 따라서 줄 처음에 소문자 알파벳이 있는 줄을 찾아서 그 첫 번째 컬럼을 표시하면 인터페이스명을 얻을 수 있습니다. 여기서는 인터페이스명을 보기 쉽도록 awk 명령어로 표시할 때 [ ]로 둘러쌉니다.
{print "[" $1 "]"}
awk 명령어는 스페이스를 때고 표시하므로 [eth0]처럼 인터페이스명이 표시됩니다.
③에서 IP 주소를 취득합니다. 여기서 취득하고 싶은 것은 inet addr: 뒤에 오는 부분 즉, 10.211.55.18입니다.
inet addr:10.211.55.18 Bcast:10.211.55.255 Mask:255.255.255.0
③은 우선 awk 명령어로 두 번째 컬럼 $2를 추출합니다. awk 명령어 구분자는 스페이스이므로 $2에는 addr:10.211.5.18이 들어 있습니다.
이 $2에서 IP 주소를 추출하려면 :를 구분자로 하여 두 번째 컬럼을 추출하면 됩니다. 따라서 ③은 awk 명령어의 split 함수를 써서 :으로 문자열을 분할해서 arr[2]로 두 번째 컬럼을 추출합니다. 이 예제처럼 우선 스페이스 구분자로 추출하고 다시 다른 구분자로 취득하는데는 awk 명령어의 split 함수를 사용하면 편리합니다.
예제에서는 네트워크 인터페이스명과 IP 주소를 출력하는데 출력 결과를 다른 스크립트에 넘기면서 네트워크 인터페이스명은 빼고 IP 주소만 쓰고 싶을 때가 있습니다. 이때 /^[a-z]/ 필터 부분을 삭제해서 다음처럼 스크립트를 작성합니다.
LANG=C /sbin/ifconfig | awk '/inet / {split ($2,arr,":"); print arr[2]}'
<주의사항>
이 스크립트는 IPv4 주소만 대응하고 IPv6 주소는 무시합니다.
Mac/FreeBSD의 ifconfig 명령어는 조금 다릅니다. IP 주소 표시 부분이 inet 10.211.55.21로 리눅스와 달리 addr: 문자열이 없습니다.
$ ifconfig
en0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
ether 00:1c:42:5e:c3:b1
inet 10.211.55.21 netmask 0xffffff00 brocast 10.211.55.255
... 생략 ...
따라서 Mac이나 FreeBSD에서는 : 구분자로 추출하지 않아도 되므로 다음처럼 조금 간결한 스크립트가 됩니다.
LANG=C /sbin/ifconfig | awk '/^[a-z]/ {print "[" $1 "]"} /inet / {print $2}'
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 서버 관리 - 106 허가된 사용자만 스크립트 실행 가능하게 하기 (0) | 2021.04.22 |
---|---|
[Linux 셸 스크립트] 서버 관리 - 105 서버에 작성된 사용자 계정 목록 얻기 (0) | 2021.04.22 |
[Linux 셸 스크립트] 제어 구문 - 103 웹 서버에서 파일을 내려받아서 MD5 해시값 계산하기 (0) | 2021.04.21 |
[Linux 셸 스크립트] 제어 구문 - 102 스크립트를 수정해서 if문 안이 비더라도 에러가 발생하지 않게 하기 (0) | 2021.04.21 |
[Linux 셸 스크립트] 제어 구문 - 101 ID 컬럼을 "00001" 처럼 0으로 채운 CSV 파일에서 번호를 지정해서 값을 추출하기 (0) | 2021.04.21 |
댓글