Linux Bash Resolve IP Address by Domain name

(Last Updated On: May 31, 2020)

아이피가 주기적으로 변하는 호스트에 DDNS가 설정되어있다. 그런데 기타 점대점 연결 (GRE등)이나 IP 방화벽에 도메인을 넣으면 곤란해서 IP를 가져오는 일이 필요하다.

그래서 bash 스크립트에서 도메인에 대한 IP주소를 읽고 변수에 담아두는 스크립트를 작성하였다.

도메인 IP 해결에 실패한 경우 그 상태로 스크립트를 진행하면 안되기 때문에 검증 및 중단을 넣어야한다.

의존성

  • RHEL : “bind-utils”
  • Debian/Ubuntu : “bind9-host”
  • openSUSE : “bind-utils”

Script

#!/bin/bash
#  
# RHEL: bind-utils
# Debian based : bind9-host
#
WATCH_DOMAIN="1dot1dot1dot1.cloudflare-dns.com"

EXEC_VAR=`host -4 -t A $WATCH_DOMAIN | head -n 1 | awk '{print $4}'`

if ! [[ $EXEC_VAR =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  echo "Fail Lookup!"
  exit 1
fi

echo "Success Lookup!: $EXEC_VAR"

성공시 EXEC_VAR 변수에 IP가 담게되고, 실패시 스크립트는 종료된다.
이걸 응용해서 echo나 return 으로 만들어 검증전용 스크립트로 써먹을 수 있겠다.

문제는 IPv6 은 지원하지 않는 점과 아이피를 여러개 응답 받은 경우이다. 이 스크립트는 해석한 결과 중 1개의 IPv4만 반환할 것이다.

실행예시

Success
WATCH_DOMAIN="1dot1dot1dot1.cloudflare-dns.com"
[email protected]rrypi:~/works/ip-resolve-bash $ ./resolve.sh
Success Lookup!: 1.1.1.1
[email protected]:~/works/ip-resolve-bash $ ./resolve.sh
Success Lookup!: 1.0.0.1

Fail

WATCH_DOMAIN="fail.kerus.net"
[email protected]:~/works/ip-resolve-bash $ ./resolve.sh
Fail Lookup!