Programming/Bash Shell Script

[Bash Shell Script] DNS 도메인/호스트 추가 자동화 쉘 스크립트 예제

Nirsa 2019. 12. 12. 15:23
반응형

 

아래의 모든 경로는 임시 설정하여 작성 하였습니다.

 

바로 실 서버에 적용하기엔 무리가 있으니, 실서버와 같은 환경의 DNS 서버를 구성 후 경로 변경 및 테스트 진행 후 적용하시기 바랍니다.

 

* 사용 환경에 맞춰 경로, SOA 필드 값, 네임서버 등 변경이 필요 합니다.

 

스크립트 작성 환경

 - OS : CentOS 6.7

 - Shell : Bash

 - 패키지 : Bind 9.8.2

#!/bin/bash 

DIR=/root/test 
named_conf="/etc/named.rfc1912.zones" 
serial2=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] 

   echo "호스트 추가(1)" 
   echo "도메인 추가(2)" 
   echo -e "해당하는 번호를 입력 해주세요: \c" 
   read select 

        case $select in 
      1) 
        #사용자 입력 받기 
        echo "-------------------------------------------" 
        echo "ex) domain.co.kr" 
        echo -e "도메인 명: \c" 
        read domain 

        echo "-------------------------------------------" 
        echo "ex) 2019030101" 
        echo "현재 시리얼 번호" 
        sed -n '3p' $DIR/db.$domain 
        echo "-------------------------------------------" 
        echo -e "시리얼 명: \c" 
        read serial 

        echo "-------------------------------------------" 
        echo "ex) host" 
        echo -e "호스트 명: \c" 
        read host 

        echo "-------------------------------------------" 
        echo -e "IP: \c" 
        read ip 

        echo "-------------------------------------------" 
        echo "도메인 명: $domain" 
        echo "시리얼 명: $serial" 
        echo "호스트 명: $host" 
        echo "$host의 IP: $ip" 
        echo "-------------------------------------------" 
        echo -e "입력하신 정보가 확실 한가요? (y/n)?: \c" 
        read resolve 

        case $resolve in 
                Y|y) 
                        echo "-------------------------------------------";; 
                Yes|yes) 
                        echo "-------------------------------------------";; 
                *) 
                        echo "스크립트를 종료 합니다." 
                        exit;; 
        esac 

        # 백업파일 생성 
        echo "백업 파일을 생성 합니다." 
        echo "-------------------------------------------" 
        cp -r $DIR/db.$domain $DIR/db.$domain.$(date +%Y%m%d) 

        sleep 1 

        # Serial Number Change 
        echo "시리얼 번호를 변경 합니다." 
        echo "-------------------------------------------" 
        sed "3s/$serial2/$serial/g" -i $DIR/db.$domain 

        sleep 1 

        # A record Add 
        echo "A 레코드를 추가 합니다." 
        echo "-------------------------------------------" 
        echo -e "$host\tIN\tA\t$ip" >> $DIR/db.$domain 

        sleep 1 

        # named 프로세스 kill 
        pid=`ps -ef | grep "named" | grep -v "grep" | grep -v "/bin/sh/" | awk '{print $2 }'` 
        ps -ef | grep "named" | grep -v "grep" | grep -v "/bin/sh/" 
        echo "named 프로세스의 PID는 $pid 입니다." 
        echo "-------------------------------------------" 
        echo -e "$pid를 kill 하시겠습니까 (y/n)?: \c" 
        read kill 

   sleep 1 

        case $kill in 
                Y|y) 
                        echo "-------------------------------------------" 
                        echo "프로세스를 kill 합니다." 
                        echo "-------------------------------------------" 
                        kill -HUP $pid;; 
                Yes|yes) 
                        echo "-------------------------------------------" 
                        echo "프로세스를 kill 합니다." 
                        echo "-------------------------------------------" 
                        kill -HUP $pid;; 
                *) 
                        echo "-------------------------------------------" 
                        echo "스크립트를 종료 합니다." 
                        exit;; 
        esac 

        # DNS 조회                      
        echo "DNS 쿼리를 조회 합니다." 
        dig @58.227.193.227 $host.$domain +noall +answer 
        dig @168.126.63.1 $host.$domain +noall +answer 
        echo "-------------------------------------------" 

        # xfer 로그 조회 
        echo "xfer 조회 합니다." 
        tail -10 $DIR/log/xfer-out.log 
        echo "-------------------------------------------" 

        sleep 1 

        echo "프로그램을 종료합니다." 
        exit;; 

      2) 
        echo "-------------------------------------------" 
        echo "ex) domain.co.kr" 
        echo "-------------------------------------------" 
        echo -e "도메인 명: \c" 
        read domain 

        echo "-------------------------------------------" 
        echo "ex) 2019030101" 
        echo "-------------------------------------------" 
        echo -e "시리얼 명: \c" 
        read serial 

        echo "-------------------------------------------" 
        echo "호스트 @ 와 www 추가하기 위해 ip를 입력 받습니다." 
        echo "-------------------------------------------" 
        echo -e "IP: \c" 
        read ip 

        echo "-------------------------------------------" 
        echo "도메인 명: $domain" 
        echo "시리얼 명: $serial" 
        echo "IP: $ip" 
        echo "-------------------------------------------" 
        echo -e "입력하신 정보가 확실 한가요? (y/n)?: \c" 
        read resolve 

        case $resolve in 
                Y|y) 
                        echo "-------------------------------------------";; 
                Yes|yes) 
                        echo "-------------------------------------------";; 
                *) 
                        echo "-------------------------------------------" 
                        echo "스크립트를 종료 합니다." 
                        exit;; 
        esac 

        #존 파일 등록 
        echo "존 파일 등록중입니다." 
        echo "-------------------------------------------" 
        echo -e "\t zone \"$domain\" {" >> $named_conf 
        echo -e "\t\ttype master;" >> $named_conf 
        echo -e "\t\tfile \"db.$domain\";" >> $named_conf 
        echo -e "\t\tallow-update { none; };" >> $named_conf 
        echo -e "\t};" >> $named_conf 

#   cp -r $DIR/named.local $DIR/db.$domain 
        cp -r /var/named/named.empty $DIR/db.$domain 

   sed '$d' -i $DIR/db.$domain 
   sed "1s/86400/600/g" -i $DIR/db.$domain 
   sed "2s/localhost./ns1.---.co.kr./g" -i $DIR/db.$domain 
   sed "2s/root.ns1.---.co.kr./root.$domain./g" -i $DIR/db.$domain 
   sed "3s/$serial2/$serial/g" -i $DIR/db.$domain 
   sed "8s/localhost./ns1.----.co.kr/g" -i $DIR/db.$domain 

        echo -e "\tIN\tNS\tns2.----.co.kr" >> $DIR/db.$domain 
        echo -e "\tIN\tNS\tns3.----.co.kr" >> $DIR/db.$domain 

   echo "www와 @는 디폴트로 설정됩니다." 
   echo "-------------------------------------------" 
   echo -e "@\tIN\tA\t$ip" >> $DIR/db.$domain 
   echo -e "www\tIN\tA\t$ip" >> $DIR/db.$domain 

        echo -e "추가하실 호스트가 있습니까 (y/n)?: \c" 
        read host_add 

        case $host_add in 
                Y|y) 
                        echo "-------------------------------------------" 
                        echo "ex) host" 
                        echo -e "호스트 명: \c" 
                        read host 

                        echo "-------------------------------------------" 
                        echo -e "IP: \c" 
                        read ip 

                        echo "-------------------------------------------" 
                        echo "A 레코드를 추가 합니다." 
                        echo "-------------------------------------------" 
                        echo -e "$host\tIN\tA\t$ip" >> $DIR/db.$domain 
                        ;; 
                Yes|yes) 
                        echo "-------------------------------------------" 
                        echo "ex) host" 
                        echo -e "호스트 명: \c" 
                        read host 

                        echo "-------------------------------------------" 
                        echo -e "IP: \c" 
                        read ip 

                        echo "-------------------------------------------" 
                        echo "A 레코드를 추가 합니다." 
                        echo "-------------------------------------------" 
                        echo -e "$host\tIN\tA\t$ip" >> $DIR/db.$domain 
                        ;; 

                *) 
                        echo "-------------------------------------------" 
                        echo "도메인 추가를 이어서 진행합니다." 
                        echo "-------------------------------------------" 
                        continue;; 
        esac 

        #named 프로세스 kill 
        pid=`ps -ef | grep "named" | grep -v "grep" | grep -v "/bin/sh/" | awk '{print $2 }'` 
        ps -ef | grep "named" | grep -v "grep" | grep -v "/bin/sh/" 
        echo "named 프로세스의 PID는 $pid 입니다." 
        echo "-------------------------------------------" 
        echo -e "$pid를 kill 하시겠습니까 (y/n)?: \c" 
        read kill 

   sleep 1 

        case $kill in 
                Y|y) 
                        echo "-------------------------------------------" 
                        echo "프로세스를 kill 합니다." 
                        echo "-------------------------------------------" 
                        kill -HUP $pid;; 
                Yes|yes) 
                        echo "-------------------------------------------" 
                        echo "프로세스를 kill 합니다." 
                        echo "-------------------------------------------" 
                        kill -HUP $pid;; 
                *) 
                        echo "-------------------------------------------" 
                        echo "스크립트를 종료 합니다." 
                        exit;; 
        esac 

        # DNS 조회                      
        echo "DNS 쿼리를 조회 합니다." 
        dig @58.227.193.227 $host.$domain +noall +answer 
        dig @168.126.63.1 $host.$domain +noall +answer 
        echo "-------------------------------------------" 

        # xfer 로그 조회 
        echo "xfer 조회 합니다." 
        tail -10 $DIR/log/xfer-out.log 
        echo "-------------------------------------------" 

        sleep 1 

        echo "프로그램을 종료합니다." 
        exit;; 

      *) 
         echo "잘못 입력 하셨습니다" 
         exit;; 
esac
반응형