본문 바로가기
모의해킹 침해대응 과정/본 과정

쉘 프로그래밍(bash)_1 / day29

by 알거음슴 2021. 5. 6.

1. 디렉토리 제작 프로그램

#!/bin/bash

BASEDIR=/test

for i in $(seq 1 4)
do
    mkdir -p $BASEDIR/$i
    for j in $(seq 1 4)
    do
        mkdir -p $BASEDIR/$i/$j
    done
done

 반복문 내에 반복문을 만들때는 하나하나 반복문을 우선 만들어보고 그다음 천천히 체크하면서 반복구문을 합치는쪽으로 진행하는것이 좋다.

 

 

2. 계산기 프로그램

 1) 계산기 ver 1

A 와 B의 값을 받고 선택지를 주어 선택지에 맞는 결과값을 도출해내는 계산기를 만들어보자.

#!/bin/bash

echo -n "Enter A : "
read A

echo -n "Enter B : "
read B

cat << EOF
======================================================================
           (1).  +      (2). -       (3). *       (4). /
======================================================================
EOF

echo -n "Enter your choice? (1/2/3/4): "
read OP

case $OP in
    1) echo "$A + $B = $(expr $A + $B)" ;;
    2) echo "$A - $B = $(expr $A - $B)" ;;
    3) echo "$A * $B = $(expr $A \* $B)" ;;
    4) echo "$A / $B = $(expr $A / $B)" ;;
    *) echo " [ FAIL ] Error - not operator "
        exit 1  ;;
esac

  2) 계산기 ver 2

A 와 계산식, B의 값을 받아서 계산결과를 도출해내는 계산기를 만들어보자.

#!/bin/bash

echo -n " Enter A : "
read A

echo -n " Enter OP : "
read OP

echo -n " Enter B : "
read B

#echo -n " $A $OP $B = $ANSWER "

case $OP in
    '+') echo "$A + $B = $(expr $A + $B)" ;;
    '-') echo "$A - $B = $(expr $A - $B)" ;;
    '*') echo "$A * $B = $(expr $A \* $B)" ;;
    '/') echo "$A / $B = $(expr $A / $B)" ;;
    *) echo " [ FAIL ] Error - not operator "
        exit 1  ;;
esac

 

 

3. /etc/hosts 파일 생성 프로그램

/etc/hosts 파일 내에 IP와 도메인, 이름들을 여러개 생성할경우, 이를 자동으로 할 수 있는 프로그램을 만들어보자

#!/bin/bash

# HOSTS=hosts  # 원본파일을 바로 건드는것 보다는 임시 파일로 테스트과정을 마친 후 적용하는것이 좋다.
HOSTS=/etc/hosts
NET=192.168.10.

cat << EOF >> $HOSTS


#
# Sfecific configuration
#
EOF
for i in $(seq 200 230)
do
    echo "$NET$i   linux$i.example.com    linux$i" >> $HOSTS
done

 정상적으로 생성이 된다, 문제가 있다, 내 server 가 linux201번일 경우. 내 server 의 값도 들어가버린다. 나의 값은 제외하고 적용할 필요가 있다.

위 내용을 개선하여 적용해보자.

#!/bin/bash

HOSTS=/etc/hosts
# HOSTS=hosts
NET=192.168.10.

cat << EOF >> $HOSTS


#
# Sfecific configuration
#
EOF
CIP1=$(
ifconfig ens33 | grep -w inet | awk '{print $2}' | awk -F. '{print $4}'
)

for i in $(seq 200 230)
do
    [ $CIP1 = $i ] && continue
    echo "$NET$i   linux$i.example.com    linux$i" >> $HOSTS
done

반복문 내에 continue를 활용하여 본인의 IP 정보는 /etc/hosts 내에 포함되지 않도록 만들었다.

 

 

4. 사용자 관리 프로그램

사용자 추가, 확인, 삭제, 종료 하는 프로그램을 만들어보자

 1) 사용자 추가 프로그램

[root@linux200 ~/bin]# cat user.list
user1	user1
user2	user2
user3	user3
* 해당 파일을 참조해서 제작을 한다.

#!/bin/bash

USERLIST=/root/bin/user.list

cat $USERLIST | while read UNAME UPASS
do
    useradd $UNAME >/dev/null 2>&1
    echo $UPASS | passwd --stdin $UNAME >/dev/null 2>&1
    echo "$UNAME is added."
done

 2) 사용자 목록생성 프로그램

#!/bin/bash

USERLIST=/root/bin/user.list
> $USERLIST # user.list 안의 내용을 비움 

for i in $(seq 1 20)
do
    echo "user$i    user$i" >> $USERLIST
done

 3) 사용자 삭제 프로그램

#!/bin/bash

USERLIST=/root/bin/user.list

cat $USERLIST | while read UNAME UPASS
do
    userdel $UNAME
    echo " $UNAME is delete. "
done

위 3가지 코드를 활용하여 사용자 관리 프로그램을 작성해보자.

#!/bin/bash

MENU () {
cat <<EOF
1) User Add
2) User Verify
3) User Delete
4) Quit
EOF

}

PASSWD=/etc/passwd

IsUSER() {
    CHKUSER=$1
    awk -F: '$3 >= 1000 && $3 <= 60000 {print $1}' $PASSWD | grep -qw $CHKUSER
    [ $? -eq 0 ] && echo True || echo False
}


USERADD() {
    echo -n " Whice username to add? : "
    read UNAME

        if [ $(IsUSER $UNAME) = 'False' ] ; then
            useradd $UNAME >/dev/null 2>&1
            echo $UNAME | passwd --stdin $UNAME >/dev/null 2>&1
            echo "[  OK  ] create user $UNAME "
        else
            echo "[ FAIL ] $UNAME is exist "
        fi
        echo
}

USERLIST() {
    awk -F: '$3 >= 1000 && $3 <= 60000 {print $1}' $PASSWD
    echo
}

USERDEL () {
    echo -n "Which username to delete? "
    read UNAME
        if [ $(IsUSER $UNAME) = 'True' ] ; then
            userdel $UNAME >/dev/null 2>&1
            echo "[  OK  ] $UNAME is delete. "        
        else
            echo "[ FAIL ] $UNAME is not found. "
        fi
        echo
}

USAGE() {
    echo "You must choose number (1,2,3,4) reselect number."
}

while true
do
    MENU
    echo -n "Enter your select (1,2,3,4)? :"
    read CHOICE
    
    case $CHOICE in
        1) USERADD ;;
        2) USERLIST ;;
        3) USERDEL ;;
        4) break ;;
        *) USAGE ;;
    esac
done

 * 작성시 각 매뉴 하나하나를 만들고 테스트 하면서 코딩한다.

 

 

5. 서비스 ON/OFF 비교

 server가 2개 있을경우 양 서버를 비교하여 service 가 동작중인지 확인하고 키고 끌수 있게끔 프로그램을 만든다.

[참고]

systemctl -t service |sed -n '2,/^LOAD/p' | sed '$d' | awk '{print $1, $3}' 

 -> 서비스 목록 중 서비스 이름과, 켜져있는 여부를 가져오는 명령어.

#!/bin/bash

if [ $# -ne 2 ] ; then
    echo "Usage: $0 <IP1> <IP2>"
    echo "Example: $0 192.168.10.200 192.168.10.200"
    exit 1
fi


IP1=192.168.10.200
IP2=192.168.10.201

TMP1=/tmp/.tmp1
TMP2=/tmp/.tmp2
TMP3=/tmp/.tmp3

ssh $IP1 systemctl -t service | sed -n '2,/^LOAD/p' | sed '$d' | awk '{print $1, $3}' > $TMP1

ssh $IP2 systemctl -t service | sed -n '2,/^LOAD/p' | sed '$d' | awk '{print $1, $3}' > $TMP2

diff $TMP1 $TMP2 > $TMP3

echo "==========$IP1=========="
cat $TMP3 | fgrep '<' | cut -c3-
echo
echo "==========$IP2========="
cat $TMP3 | fgrep '>' | cut -c3-
echo

 

 

6. 보고서 내 일부 내용 추출 하는 프로그램

 우선 보고서 파일제작을 한다.

[root@linux200 ~/bin]# vi report.txt

[U-1] Password policy check   # [U-1] /etc/login.defs (암호 최소 길이, 정기적인 암호 변경, ...)
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

[U-2] End user check   # [U-2] /etc/passwd     (사용자 정보 점검)
user01:x:501:501::/home/user01:/bin/bash
user02:x:502:502::/home/user02:/bin/bash
user03:x:503:503::/home/user03:/bin/bash

[U-3] PAM check   # [U-3] /etc/pam.d/su   (su 명령어를 사용할 수 있는 사용자 점검)
auth       sufficient  pam_wheel.so trust use_uid

위 내용의 U-1 ,U-2, U-3 를 커맨드화 하여 프로그램을 제작한다.

#!/bin/bash

if [ $# -ne 1 ] ; then
    echo "Usage : $0 <Check Num>"
    echo "Example : $0 U-1"
    exit 1
fi

CheckNum=$1
CheckNum2nd=$(echo $CheckNum | awk -F- '{print $2}')
CheckInc=$(expr $CheckNum2nd + 1)

echo "$CheckNum : $CheckNum2nd"

FILE1=/root/bin/report.txt
sed -n "/$CheckNum/,/U-$CheckInc/p" $FILE1 | grep -v "U-$CheckNumInc"

 

 

7. 중요 파일 변경 상태점검 프로그램

운영체제 내 중요한 파일이 변경됫는지 확인하는 파일을 제작한다, 원본 파일과 백업 파일을 매일 비교하여 메일로 수신받아 볼 수 있도록 프로그램을 작성한다.

[root@linux200 ~/bin/backup]# cat check.list 
/root/bin/backup/passwd
/root/bin/backup/group
/root/bin/backup/hosts
* 위 리스트를 참조하여 제작한다.

#!/bin/bash

FILE1=/root/bin/backup/check.list
EMAIL=root
RESULT=/root/bin/backup/result.txt

TMP1=/tmp/tmp1
TMP2=/tmp/tmp2
TMP3=/tmp/tmp3

> $RESULT

# RESULT 파일을 제작하는 코드.
for i in $(cat $FILE1)
do
    #echo $i
    if [ ! -f $i.OLD ] ; then
        cp -p $i $i.OLD    
    else
        diff $i $i.OLD > $TMP1

        if [ -s $TMP1 ] ; then
            echo "[ WARNING ] $i" >> $RESULT
            echo "======================================" >> $RESULT
            cat $TMP1 | egrep '^<|^>' | cut -c3- >> $RESULT
            echo "======================================" >> $RESULT
        else
            echo "[   OK   ] $i" >> $RESULT
        fi
    fi

done

#  비교결과에 따른 메일발송 / 백업 파일의 변경처리
fgrep '[ WARNING ]' $RESULT > $TMP2

if [ $? -eq 0 ] ; then
    mailx -s "[ WARNING ] Check report!!! " $EMAIL < $RESULT
    cat $TMP2 | awk '{print $4}' > $TMP3
        for j in $(cat $TMP3)
        do
            cp -p $j $J.$(date +%Y_%m%d_%H%M%S)
            cp -p $j.OLD $j.OLD.$(date +%Y_%m%d_%H%M%S)
            cp -p $j $j.OLD
        done
else
    date | mailx -s "[  OK  ] No problem with the FILE" $EMAIL
fi