본문 바로가기
Shell Script/Routing Check

(Shell Script) 리눅스 Routing 파일 내용(순서) 확인 script

by 미니몬 2023. 4. 13.

목차

    728x90
    반응형

    Summary

    이 게시물에서는 CentOS7 or RHEL7 버전에서 Bash 쉘 스크립트를 사용하여 라우팅 파일에 기재된 ADDRESS, NETMASK, GATEWAY 정보의 순서만을 확인하는 스크립트를 작성해보겠습니다. 

     



    What is a Rounting File?

    리눅스를 이용해 서버를 구축하는 경우 /etc/sysconfig/network-scripts 디렉터리에 [route-NIC명] 파일으로
    라우팅 테이블을 구성하기 위해 사용되는 파일입니다. 이 파일은 각각의 인터페이스 별로 라우팅 정보를 기재하여
    영구적으로 설정하기 위한 파일입니다.
    이 때 작성되는 양식으로는 "ADDRESS0=Host IP and Network 대역",
    "NETMASK0=Subnet", "GATEWAY0=Gateway IP" 와 같은 내용으로 작성됩니다. 


    Check the routing file beforehand.

     1. /etc/sysconfig/network-scripts 위치로 이동하여 지정하고자 하는 라우팅 파일 내용을 확인합니다:

    # cd /etc/sysconfig/network-scripts/
    ls -al
    
    -rw-r--r--. 1 root root   175  3월  3 13:13 ifcfg-bond0
    -rw-r--r--. 1 root root   222  1월 26 23:09 ifcfg-ens33
    -rw-r--r--. 1 root root   168  3월  3 13:15 ifcfg-ens38
    -rw-r--r--. 1 root root   286  3월 14 16:49 route-bond0

     

    2. bond0 인터페이스의 라우팅 정보를 추가하기 위해 route-bond0 파일 생성합니다 :

    # cat route-bond0
    
    ADDRESS0=10.10.10.128
    NETMASK0=255.255.255.128
    GATEWAY0=192.168.227.1
    
    ADDRESS1=20.20.20.64
    NETMASK1=255.255.255.192
    GATEWAY1=192.168.227.1
    
    ADDRESS2=30.30.30.32
    NETMASK2=255.255.255.224
    GATEWAY2=192.168.227.1
    
    ADDRESS3=40.40.40.16
    NETMASK3=255.255.255.240
    GATEWAY3=192.168.227.1



    How would you write a script ?

     1. 스크립트 파일 생성

    # vi script.sh

     


     2. 먼저 스크립트를 실행할 때 파일명을 인자로 입력합니다 
    :

     입력한 route-bond0 파일을 filename 변수에 저장하여 스크립트에서 사용합니다.

    #인자로 파일명을 입력하지 않은 경우 에러메시지 출력하며 스크립트 종료
    USAGE()
    {
            echo "  USAGE : ./script_name.sh [FILENAME]"
            echo "  EX    : ./script_name.sh route-ens1f0"
    }
    
    if [ $# -eq 0 ]; then
        USAGE
        exit
    fi
    
    filename=$1
    echo "$filename"



     3. grep 명령어를 사용하여 파일에서 ADDRESS, NETMASK, GATEWAY 정보만을 추출하여 변수에 저장합니다  
    :

    addresses=$(grep -E "^ADDRESS[0-9]+=.*" route-bond0)
    netmasks=$(grep -E "^NETMASK[0-9]+=.*" route-bond0)
    gateways=$(grep -E "^GATEWAY[0-9]+=.*" route-bond0)

     위 명령어는 파일에서 ^ADDRESS[0-9]+=.*, ^NETMASK[0-9]+=.*, ^GATEWAY[0-9]+=.*와 일치하는 라인들만 추출하여
     각각 addresses, netmasks, gateways 변수에 저장합니다.

     

     4. 추출된 정보의 개수를 count 변수에, 수정이 필요한지 여부를 err_chk 변수에 저장합니다 :

    count=$(echo "$addresses" | wc -l)
    
    err_chk=0

     echo "$addresses"는 addresses 변수에 저장된 값들을 출력하고, wc -l은 라인 수를 출력합니다.
     이를 통해 추출된 정보의 개수를 파악할 수 있습니다.

     

     

     5. 추출된 정보들을 확인하면서 순서가 올바른지 확인합니다 :

    for i in $(seq 0 $(($count-1))); do
        address=$(echo "$addresses" | sed -n "$((i+1))p")
        netmask=$(echo "$netmasks" | sed -n "$((i+1))p")
        gateway=$(echo "$gateways" | sed -n "$((i+1))p")
        # ADDRESS 다음에 붙은 숫자 추출
        address_num=$(echo "$address" | awk -F'[=]' '{print $1}' | awk -F'[A-Za-z]+' '{print $2}')
        netmask_num=$(echo "$netmask" | awk -F'[=]' '{print $1}' | awk -F'[A-Za-z]+' '{print $2}')
        gateway_num=$(echo "$gateway" | awk -F'[=]' '{print $1}' | awk -F'[A-Za-z]+' '{print $2}')
        # 숫자와 인덱스가 일치하지 않으면 잘못된 순서로 간주하여 에러 출력
        if [ "$(($address_num))" != "$i" ] || [ "$(($netmask_num))" != "$i" ] || [ "$(($gateway_num))" != "$i" ]; then
            #순서가 잘못된 경우 err_chk 변수에 1을 대입
            err_chk=1
            echo "Sequence is not match."
            echo -e "$address\n$netmask\n$gateway\n"
        fi
    done

     위 코드에서는 for 루프를 사용하여 ADDRESS, NETMASK, GATEWAY 정보들을 출력하고,
     sed 명령어를 사용하여 각 라인에서 숫자 정보를 추출합니다.

     그리고 숫자 정보와 인덱스가 일치하지 않는 경우에는 에러를 출력하게 됩니다.
     만약 순서가 모두 올바르다면 err_chk 변수는 0이므로, "No abnormal sequence number."라는 문구를 출력니다.

    if [ $err_chk == 0 ]; then
        echo "No abnormal sequence number."
    fi

     

     6. 이제 완성된 스크립트를 실행해보겠습니다. route-bond0 파일에 대해서는 아래와 같이 출력됩니다 :

    #!/bin/bash
    
    USAGE()
    {
            echo "  USAGE : ./script_name.sh [FILENAME]"
            echo "  EX    : ./script_name.sh route-ens1f0"
    }
    
    if [ $# -eq 0 ]; then
        USAGE
        exit
    fi
    
    filename=$1
    echo "$filename"
    
    addresses=$(grep -E "^ADDRESS[0-9]+=.*" $filename)
    netmasks=$(grep -E "^NETMASK[0-9]+=.*" $filename)
    gateways=$(grep -E "^GATEWAY[0-9]+=.*" $filename)
    
    count=$(echo "$addresses" | wc -l)
    
    err_chk=0
    echo "============================================="
    
    for i in $(seq 0 $(($count-1))); do
        address=$(echo "$addresses" | sed -n "$((i+1))p")
        netmask=$(echo "$netmasks" | sed -n "$((i+1))p")
        gateway=$(echo "$gateways" | sed -n "$((i+1))p")
    
        address_num=$(echo "$address" | awk -F'[=]' '{print $1}' | awk -F'[A-Za-z]+' '{print $2}')
        netmask_num=$(echo "$netmask" | awk -F'[=]' '{print $1}' | awk -F'[A-Za-z]+' '{print $2}')
        gateway_num=$(echo "$gateway" | awk -F'[=]' '{print $1}' | awk -F'[A-Za-z]+' '{print $2}')
    
        if [ "$(($address_num))" != "$i" ] || [ "$(($netmask_num))" != "$i" ] || [ "$(($gateway_num))" != "$i" ]; then
            err_chk=1
            echo "Sequence is not match."
            echo -e "$address\n$netmask\n$gateway\n"
        fi
    done
    
    if [ $err_chk == 0 ]; then
        echo "No abnormal sequence number."
    fi
    echo "============================================="

     

    route-bond0 파일에 내용의 순서가 올바르다면 문제가 없다고 출력됩니다.

    # sh script.sh route-bond0
    
    route-bond0
    =============================================
    No abnormal sequence number.
    =============================================


     만약 route-bond0 파일이 순서가 다른 경우 아래와 같이 출력됩니다

    # cat route-bond0 
    
    ADDRESS0=10.10.10.128
    NETMASK0=255.255.255.128
    GATEWAY0=192.168.227.1
    
    ADDRESS1=20.20.20.64
    NETMASK1=255.255.255.192
    GATEWAY3=192.168.227.1
    
    ADDRESS5=30.30.30.32
    NETMASK2=255.255.255.224
    GATEWAY2=192.168.227.1
    
    ADDRESS3=40.40.40.16
    NETMASK3=255.255.255.240
    GATEWAY3=192.168.227.1
    # sh script.sh route-bond0
    
    route-bond0
    =============================================
    Sequence is not correct.
    ADDRESS1=20.20.20.64
    NETMASK1=255.255.255.192
    GATEWAY3=192.168.227.1
    
    Sequence is not correct.
    ADDRESS5=30.30.30.32
    NETMASK2=255.255.255.224
    GATEWAY2=192.168.227.1
    
    =============================================

    잘못된 순서로 기재된 부분이 출력되며, 이를 통해 파일 순서에 문제가 있음을 확인할 수 있습니다.


    Conclusion

    리눅스 서버에서 라우팅 설정 정보를 파일로 남겨 시스템을 재부팅 해도 설정된 내용이 유지되도록 할 때
    파일 내 작성된 정보의 순서에 오타가 있는 경우 정상적으로 라우팅 설정이 되지 않기 때문에 위 스크립트를 통하여
    라우팅 파일을 수정했을 때 점검 해볼 수 있습니다.

    728x90
    반응형