목차
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
리눅스 서버에서 라우팅 설정 정보를 파일로 남겨 시스템을 재부팅 해도 설정된 내용이 유지되도록 할 때
파일 내 작성된 정보의 순서에 오타가 있는 경우 정상적으로 라우팅 설정이 되지 않기 때문에 위 스크립트를 통하여
라우팅 파일을 수정했을 때 점검 해볼 수 있습니다.
'Shell Script > Routing Check' 카테고리의 다른 글
(Shell Script) 리눅스 라우팅 정보 추가를 위한 Bash 스크립트 (0) | 2023.10.12 |
---|---|
(Bash) 리눅스 라우팅 파일 검증 스크립트 (0) | 2023.09.15 |