반응형
※ 해당 포스팅은 https://nirsa.tistory.com/318?category=861480 와 연계하여 사용 합니다. 도메인의 인증서 만료 날짜를 자동으로 가져와 license 파일을 업데이트하기 위하여 사용 합니다. 그 외 사용 목적으로 사용할 예정인 경우 스크립트 내용을 잘 확인 바랍니다.
쉘 스크립트 도메인 인증서 갱신 날짜 불러오기(bash shell domain certificate)

이전 포스팅에 추가하여 쉘스크립트 도메인 인증서 갱신 날짜를 불러와 자동으로 라이센스 파일에 내용을 변경 해주는 스크립트 입니다. "YOUR_LICENSE_FILE_PATH" , "YOUR_DOMAIN_URL" 부분은 본인의 환경에 맞게 변경 해주어야 합니다.

기타 자세한 내용은 추후 추가 예정 입니다.

#!/bin/bash
MONTHLY_STRING_LIST=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
MONTHLY_INT_LIST=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12")

MONTHLY_STRING_EXPR=`expr ${#MONTHLY_STRING_LIST[@]} - 1`
MONTHLY_INT_EXPR=`expr ${#MONTHLY_INT_LIST[@]} - 1`

LICENSE_DATE=`echo | openssl s_client -connect 172.16.1.2:443 2>/dev/null | openssl x509 -noout -dates | grep notAfter`
LICENSE_DATE_REPLACE=${LICENSE_DATE/notAfter=/}

YEAR_DATE=`echo $LICENSE_DATE_REPLACE | awk '{print $4}'`
DAY_DATE=`echo $LICENSE_DATE_REPLACE | awk '{print $2}'`

SSL_BEFORE=`cat /root/license/license | grep SSL`

declare -A map_monthly

function monthly_conv() {
    count=$3
    map_monthly[$1]=$2
    if [[ $count -eq $MONTHLY_STRING_EXPR ]]; then
        for _string in "${!map_monthly[@]}"
        do
            if [[ "$LICENSE_DATE_REPLACE" =~ "$_string" ]]; then
                if [[ "${map_monthly[$_string]}" -le "9" ]]; then
                    result=`echo "$YEAR_DATE-0${map_monthly[$_string]}-$DAY_DATE SSL인증서"`
                    sed -i 's/'"$SSL_BEFORE"'/'"$result"'/' /root/license/license
                else
                    result=`echo "$YEAR_DATE-${map_monthly[$_string]}-$DAY_DATE SSL인증서"`
                    sed -i 's/'"$SSL_BEFORE"'/'"$result"'/' /root/license/license
                fi
            fi
        done
    fi
}

for ((i=0;i<=${#MONTHLY_STRING_LIST[@]}&&i<=${#MONTHLY_INT_LIST[@]};i++))
do
    monthly_conv ${MONTHLY_STRING_LIST[$i]} ${MONTHLY_INT_LIST[$i]} $i
done
반응형
반응형
쉘 스크립트 파일 2개를 불러와 key-value 형태로 변환 (bash shell script key-value, bash shell script map)

아래와 같은 파일이 있을 때 쉘 스크립트의 map을 사용하여 key : key1 , value : value1 형태로 출력하는 코드 입니다.

 

#!/bin/bash
## 파일을 읽어 배열 형태로 저장
key_list=(`cat /root/test1`)
value_list=(`cat /root/test2`)

## 아래 코드 실행 중 길이를 넘어 에러를 발생하므로 key_list, value_list 측정 길이에서 -1
KEY_EXPR=`expr ${#key_list[@]} - 1`
VALUE_EXPR=`expr ${#value_list[@]} - 1`

## map을 사용하기 위한 배열 변수 선언
declare -A map_var

## 함수 선언
function map_func() {
        count=$3  ## 아래 코드에서 i로 전달받은 값을 count 변수에 저장
        map_var[$1]=$2   ## key=value 형태로 저장
        if [[ $count -eq $KEY_EXPR ]]; then  ## count와 key의 길이가 같을 경우 코드 시행
                for _key in "${!map_var[@]}"  ## map_var의 key를 _key 변수로 저장
                do
                        echo "key : $_key , value : ${map_var[$_key]}"  ## key value 출력
                done
        fi
}

if [[ $KEY_EXPR -eq $VALUE_EXPR ]]; then   ## key와 value의 행 개수가 같을 경우 코드 실행
        for ((i=0;i<=${#key_list[@]}&&i<=${#value_list[@]};i++))   ## 변수 i의 값이 key_list와 value_list의 길이보다 커질때까지 반복
        do
                map_func ${key_list[$i]} ${value_list[$i]} $i  ## map_func 함수에 key_list, value_list, i 변수 값을 전달
        done
else
        echo "key와 value의 길이가 다릅니다."   ## key와 value의 행 개수가 다를 경우 출력
fi
반응형
반응형
  • 쉘 스크립트 라이센스 만료 날짜 관리 프로그램 만들기 (bash shell script license management)

업무에 필요한 라이센스 날짜를 관리해주는 프로그램 입니다. 사실 관리보다는 라이센스 만료일 전(아래 예시는 1달전과 일주일 전)에 라이센스 만료가 다가오고 있음을 경고 해주는 메일을 발송하는 스크립트 입니다.

테스트 환경은 다음과 같으며, sendmail 설치 및 설정이 되어있어야 합니다. (sendmail 구축 방법 링크는 추후 개시할 예정)

  • OS : CentOS 7.9 2009
  • Tools : sendmail-8.14.7-6.el7.x86_64
  • Linux 시간 설정이 재대로 되어 있는지 확인 필요

 

가장 먼저는 편한 위치에 아래와 같이 파일을 생성 합니다.

저는 /test/license/license 로 생성했다고 가정하에 진행 하겠습니다. 아래와 같이 "만료일 이름" 형식으로 파일을 생성 합니다.

# 만료일 이름
2021-07-01 인증서
2021-07-01 도메인
...

 

아래는 쉘 스크립트 파일 입니다. 주석으로 코멘트를 달아놓은 곳들만 설정 하시면 됩니다.

  • license_file 라인 : 저의 경우 /test/license/license가 될 것 입니다. 위에서 라이센스 파일을 생성한 경로에 따라 바뀔 수 있습니다.
  • from 라인 : 보낸 사람의 이메일 주소 입니다.
  • recipients 라인 : 받는 사람의 이메일 주소 입니다.
#!/bin/bash
today=$(date +%Y-%m-%d)
license_file="[LICENSE FILE PATH]"  ## ex) /home/test/license
licenses=`awk '{print $1}' $license_file` 

for license in ${licenses[@]}
do
        expiration_1month=`date -d "$license 1 month ago" "+%Y-%m-%d"`
        expiration_7day=`date -d "$license 7 day ago" "+%Y-%m-%d"`
        # expiration_test=`date -d "$expiration_1month 24 day ago" "+%Y-%m-%d"`
        
        if [[ $expiration_1month == $today ]]; then
                subject="[경고] 라이센스 만료 1달전"
                from="[FROM EMAIL ADDRESS]"        ## ex) no-reply@test.com
                recipients="[YOUR EMAIL ADDRESS]"  ## ex) id@gmail.com
               				 				 ## 여러명일 경우 id@naver.com,id@gmail.com 등과 같이 작성
                license_name=`cat $license_file | grep $license | awk '{print $2}'`
                
                /usr/sbin/sendmail "$recipients" <<EOF
subject:$subject
from:$from
$license_name 라이센스 만료일까지 1달 전 입니다.
만료일: $license
EOF

        elif [[ $expiration_7day == $today ]]; then
                subject="[경고] 라이센스 만료 7일 전"
                from="[FROM EMAIL ADDRESS]"        ## ex) no-reply@test.com
                recipients="[YOUR EMAIL ADDRESS]"  ## ex) id@gmail.com 
                license_name=`cat $license_file | grep $license | awk '{print $2}'`
                
                /usr/sbin/sendmail "$recipients" <<EOF
subject:$subject
from:$from
$license_name 라이센스 만료일까지 7일 전 입니다.
만료일: $license
EOF

        fi
done

 

expiration_test 변수를 통해 테스트를 진행해볼 수 있습니다. 조건이 발생할 수 있도록 적당한 값을 넣은 뒤, if문의 expiration_1month 또는 expiration_7day 변수를 expiration_test 변수로 변경해주면 됩니다. expiration_test 변수의 날짜만 잘 조정 했다면 정상적으로 메일이 오는것을 확인할 수 있습니다.

또는 license 파일에서 직접 날짜를 변경하여 실행해보고 잘 작동하는지 확인할 수 있습니다. 정상적으로 작동할 경우 아래와 같이 메일이 옵니다.

재대로 작동하는것까지 확인 했다면, 크론탭에 등록하여 사용 하시면 됩니다.

* 상황에 또는 사용하는 플랫폼에 따라 스팸 메일로 가거나, 차단되어 메일이 도착하지 않을 수 있습니다. 해당 부분은 상황에 맞춰 어떤 부분이 문제(화이트도메인이 아닌 경우 등)인지 확인하여야 합니다. 

 

반응형
반응형
  • (연습 예제) CP 명령어 사용 시 중복된 파일의 이름을 자동으로 변경하기

배시 쉘 스크립트 연습 예제 입니다. 아래와 같은 상황에서 중복된 파일의 이름을 자동으로 변경해주는 스크립트를 만드는것이 목표 입니다.

  1. /root/test 디렉토리의 jpg 파일을 /root/data/ 으로 복사
  2. /root/test2 디렉토리의 jpg 파일을 /root/data/ 으로 복사
  3. test 디렉토리의 파일과, test2 디렉토리의 파일 중 test1.jpg ~ test5.jpg 파일명이 같음

 

이러한 문제를 해결하기 위해 고민한 부분은 크게 다음과 같습니다.

  1. 파일명을 어떻게 바꿔야 할까? → 랜덤 문자열 생성
  2. 파일명을 변경 시 경로 제외를 어떻게 할까? → awk로 마지막 레코드만 출력 후 변수에 저장
  3. 쉘 스크립트에서 cp 명령어로 파일명이 중복된다는걸 어떻게 캐치할 수 있을까?  → expect 사용

 

가장 문제가 되는것은 파일명 중복을 캐치하는 부분 인데, 파일명이 중복될 경우 "cp: overwrite" 프롬프트가 생성 됩니다. expect를 사용해 cp: overwrite 문자열이 확인될 경우 exit를 반환 합니다.

* expect를 사용하기 위해선 패키지를 설치해야 합니다. (yum -y install expect)

* exp 파일은 sh 명령이 아니라, expect 명령어로 파일을 실행해야 합니다.

* status code를 구분해 중복으로 판단될 경우 네이밍을 하기 위해 exit로 반환 합니다.

저는 아래와 같은 auto_overwrite.exp 파일을 생성 했습니다.

#!/usr/bin/expect -f

# timeout 시간 무제한
set timeout -1

# 쉘 스크립트에서 인자값으로 변수를 받아옴
set after_path [lindex $argv 0]
set item [lindex $argv 1]

# cp 명령 실행
spawn cp -i $item $after_path

# 특정 문자열 발생 시 exit 입력
expect "cp: overwrite* "
send "exit\r"

 

이제 중복 파일명을 확인할 수 있는 expect를 만들었으니, 쉘스크립트로 넘어 갑니다. 저의 경우 root 홈디렉토리 아래를 검색해 jpg로 끝나는 파일들을 file_name 이라는 변수에 배열로 담았습니다.

자세한 내용은 주석 처리한 내용을 확인하시면 됩니다.

#!/bin/bash
after_path="/root/data"
file_name=`find /root -name "*.jpg"`

## file_name의 배열들을 하나씩 꺼내가면서 반복중 실행
for item in ${file_name[*]}
do
	## /root/item-name 파일에 저장 (절대 경로 파일명이 저장됨)
        echo "$item" > /root/item-name
        
        ## 중복 파일을 네이밍하기 위한 랜덤 문자열 생성 후 변수에 저장
        random_name=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | sed 1q)
        
        ## awk로 마지막 레코드(파일명)을 추출 후 변수에 저장
        item_file_name=$(awk -F '/' '{ print $NF }' /root/item-name)
        
        ## 위에서 생성한 exp파일 실행, 뒤에 변수는 인자값 전달
        expect /root/auto_overwrite.exp $after_path $item
        
        ## status code를 변수에 저장
        state=`echo $?`

        ## status code 0 : Overwrite
        if [ "$state" == "0" ]; then
        	## Overwrite가 발생한 경우 중복 파일로 인지하고 네이밍을 새로 진행
                cp "$item" "$after_path"/"$item_file_name"-"$random_name"
        ## status code 1 : Success
        elif [ "$state" == "1" ]; then
                echo "Success"
        fi

		## 생성했던 item-name 파일 삭제
        rm -rf /root/item-name
done

 

스크립트 실행 결과는 아래와 같습니다.

반응형

+ Recent posts