3. 쉘 스크립트 프로그램 작성 실습
*실습 리스트*
[실습1] 디렉토리 구조 생성 프로그램
* adddir.sh
[실습2] 계산기 프로그램
* calculator_ver1.sh
* calculator_ver2.sh
[실습3] /etc/hosts 파일 내용 추가 프로그램
* hosts.sh
* hosts2.sh
[실습4] 사용자 추가 프로그램
* add_user.sh
* del_user.sh
* add_userlist.sh
* user_admin.sh
[실습5] 두대의 서버에 서비스 비교 프로그램
* check_service.sh
[실습1] 디렉토리 구조 생성 프로그램
* adddir.sh
#!/bin/bash
TargetDir=/test
StartNum=1
EndNum=4
[ ! -d /test ] && mkdir -p /test || rm -rf /test/*
for i in `seq $StartNum $EndNum`
do
#echo $i
mkdir -p $TargetDir/$i
for j in `seq $StartNum $EndNum`
do
mkdir -p $TargetDir/$i/$j
done
done
tree -C $TargetDir
[실습2] 계산기 프로그램
* calculator_ver1.sh
#!/bin/bash
echo -n "Enter A : "
read A
echo -n "Enter B : "
read B
# echo "$A : $B"
cat << EOF
================================
(1) + (2) - (3) * (4) /
================================
EOF
echo -n "Enter your choice (1/2/3/4) : "
read C
case $C 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 "Unknown Number" ; exit 1 ;;
esac
* calculator_ver2.sh
#!/bin/bash
echo -n "Enter A : "
read Num1
echo -n "Enter Operator : "
read OP
echo -n "Enter B : "
read Num2
case $OP in
'+') echo "$Num1 + $Num2 = `expr $Num1 + $Num2`" ;;
'-') echo "$Num1 - $Num2 = `expr $Num1 - $Num2`" ;;
'*') echo "$Num1 * $Num2 = `expr $Num1 \* $Num2`" ;;
'/') echo "$Num1 / $Num2 = `expr $Num1 / $Num2`" ;;
*) echo "Unknown Operator" ; exit 1 ;;
esac
[실습3] /etc/hosts 파일 내용 추가 프로그램
* host.sh
#!/bin/bash
#Hosts=/etc/hosts
Hosts=hosts
StartNum=200
EndNum=230
for i in `seq $StartNum $EndNum`
do
echo -e "172.16.6.$i linux$i.example.com linux$i" >> $Hosts
done
cat $Hosts
* hosts2.sh
#!/bin/bash
#Hosts=/etc/hosts
Hosts=hosts
StartNum=200
EndNum=230
IP1=`ifconfig ens32 | grep netmask | awk '{print $2}' | awk -F. '{print $4}'`
for i in `seq $StartNum $EndNum`
do
[ $IP1 = $i ] && continue
echo "172.16.6.$i linux$i.example.com linux$i" >> $Hosts
done
cat $Hosts
[실습4] 사용자 추가 프로그램
* useradd .sh
#!/bin/bash
UserList=user.list
cat $UserList | while read User Pass
do
#echo "$User : $Pass"
useradd $User
echo $Pass | passwd --stdin $User
done
* userdel.sh
#!/bin/bash
UserList=user.list
PassFile=/etc/passwd
cat $UserList | while read User Pass
do
awk -F: '{print $1}' $PassFile | grep -w $User >/dev/null 2>&1
if [ $? -eq 0 ] ; then
echo "[ Reomoved ] $User deleted."
userdel -r $User
else
echo "[ WARN ] $User does not exits."
fi
done
* add_userlist.sh
#!/bin/bash
UserList=user.list
StartNum=1
EndNum=14
> $UserList
for i in `seq $StartNum $EndNum`
do
echo "[ OK ] user$i added in $UserList file."
echo "user$i user$i" >> $UserList
done
* user_admin.s
#!/bin/bash
MainMenu() {
cat << EOF
(관리 목록)
===========================
1) 사용자 추가
2) 사용자 확인
3) 사용자 삭제
4) 프로그램 종료
===========================
EOF
}
UserAdd() {
echo -n "추가 할 사용자 이름을 입력하시오 : "
read Uname1
echo
cat /etc/passwd | awk -F: '{print $1}' | grep -w $Uname1 >/dev/null 2>&1
if [ $? -eq 0 ] ; then
echo
echo "------------------------------"
echo " 사용중인 사용자입니다. "
echo "------------------------------"
echo
else
useradd $Uname1 >/dev/null 2>&1
echo $Uname1 | passwd --stdin $Uname1 >/dev/null 2>&1
ehco
echo "--------------------------"
echo " 사용자가 추가 되었습니다 "
echo "--------------------------"
echo
fi
}
UserModify() {
awk -F: '$3 >= 1000 && $3 <= 60000 {print $1}' /etc/passwd | cat -n
}
UserDel() {
echo -n "삭제 할 사용자를 입력하시오 : "
read Uname2
cat /etc/passwd | awk -F: '{print $1}' | grep -w $Uname2 >/dev/null 2>&1
if [ $? -eq 0 ] ; then
userdel -r $Uname2
echo "--------------------------"
echo " 사용자가 삭제 되었습니다 "
echo "--------------------------"
else
echo "--------------------------"
echo " 사용자가 없습니다 "
echo "--------------------------"
fi
}
while true
do
MainMenu
echo -n "번호를 선택 하세요 : "
read Choice1
case $Choice1 in
1) UserAdd ;;
2) UserModify ;;
3) UserDel ;;
4) Break ;;
*) echo "Invalid Number" ;;
esac
echo ; echo
done
[실습5] 두대의 서버에 서비스 비교 프로그램
* check_service.sh
#!/bin/bash
export LANG=en_US.UTF-8
IP1=172.16.6.249
MyHost=`hostname`.txt
OtherHost=linux249.txt
TMP1=diffservice.txt
systemctl -t service \
| sed -n '2,/^LOAD/p' \
| sed '$d' \
| awk '{print $1, $3}' \
| egrep -v '^$' > $MyHost
ssh $IP1 systemctl -t service \
| sed -n '2,/^LOAD/p' \
| sed '$d' \
| awk '{print $1, $3}' \
| egrep -v '^$' > $OtherHost
diff $MyHost $OtherHost > $TMP1
echo ; echo
echo "--------$MyHost---------"
cat $TMP1 | fgrep '<' | cut -c2-
echo ; echo ; echo
echo "------$OtherHost-------"
cat $TMP1 | fgrep '>' | cut -c2-
echo
echo
[참고] 위 작업 전 선수 작업 : ssh keygen 생성해서 다른 서버에 넘기고 연결하기
# cd ~/.ssh && rm -f ~/.ssh/*
# ssh-keygen -t rsa : 키를 생성한 뒤
# ssh-copy-id -i id_rsa.pub root@172.16.6.xxx
원하는 곳으로 키를 넘겨준다.
# ssh 172.16.6.xxx hostname
으로 접속해 두면 이후부터는 password 입력 없이 들어갈 수 있다.
(주의) 다른 서버의 파일 비교작업을 할 때 중요한건 언어변수를 통일시켜 주는것.
만들려는 쉘 프로그램의 스크립트 상단에 언어 변수를 작성해 주자
ex) export LANG=en_US.UTF-8
[과제] 로그 모니터링 프로그램 제작
과제 기간: 2020.10.20(화) ~ 2020.10.21(수)
과제 내용: 다음 조건을 갖는 로그 모니터링 프로제그 제작
이름: /root/scripts/logmon.sh
목적: 로그 파일을 모니터링 하는 프로그램 작성
● 로그 내용 중 이상이 있을만한 메세지를 캡쳐하여 관리자에게 정기적으로 메일로 보내주는 프로그램
기능:
● 로그 파일의 내용 중 이상이 있을만한 추가된 내용(ex: warn|error|...)을 확인하고
● 로그 파일의 추가된 내용이 존재한다면 관리자에게 메일로 전송(To: root) 한다.
● 이 프로그램은 종료되면 안된다.(EX: Daemon 처럼 백그라운드 실행, nohup CMD &)
● 사용하는 명령어: egrep -i 'warn|error|critical|alert|emerg|fail' /var/log/messages
● 30초에 한번씩 로그 파일의 내용에 추가된 내용을 확인한다.
● 반드시, 제출 보고서 내용에는 확인하는 실습이 들어 있어야 한다.
● 과제 제출 폴더: \00_공지사항\제21기_오전반_과제제출
#!/bin/bash
# TMP1=$(mktemp) / TMP1=`mktemp`
TMP1=/tmp/tmp1
TMP2=/tmp/tmp2
TMP3=/tmp/tmp3
LOGFILE=/var/log/messages
MAIL=root
egrep -i 'warn|error|crit|alert|emerg|fail' $LOGFILE > $TMP1
while true
do
sleep 30
egrep -i 'warn|error|crit|alert|emerg|fail' $LOGFILE > $TMP2
diff $TMP1 $TMP2 > $TMP3 && continue
mail -s "[WARN] Check Log Mail" $MAIL < $TMP3
egrep -i 'warn|error|crit|alert|emerg|fail' $LOGFILE > $TMP1
done
[참고1]위와 같은 로그 기록 프로그램은 사용자가 로그아웃 한 후에도 수행되어야 한다.
그때 사용하는 커맨드가 바로
# nohup CMD
# nohup /root/bin/logmon.sh &
[참고2] 스크립트 파일 실행시
# bash -x 파일명
으로 실행하면 프로그램 동작 과정을 볼 수 있다.
[참고3] 쌓인 메일을 삭제할 때
# > /var/spool/mail/사용자
[목적] 로그 파일을 모니터링 하는 프로그램
[기능]
1. 로그 파일의 추가된 내용을 확인
2. 로그 파일의 추가된 내용이 존재한다면 메일로 전송(To: root)
3. 이 프로그램은 종료되면 안된다.(EX: Daemon)
4. 사용하는 명령어: egrep -i '(warn|err|crit|alert|emerg|fail)' /var/log/messages
5. 30초에 한번씩 로그 파일의 내용에 추가된 내용을 확인한다.
[참고] 네트워크 확인 관련
# ifconfig
# netstat -nr : 커널 IP 라우팅 현황
# cat /etc/resolv.conf : 네임서버 확인
# ping 172.xxx.xx.x
# nmcli connection
# nslookup www.daum.net
'정보보안공부 > 정보보안전문과정' 카테고리의 다른 글
정보보안 과정 Day33~34 : 쉘 프로그래밍 실습 3,4 (0) | 2020.10.23 |
---|---|
정보보안 과정 Day32 : 쉘 프로그래밍 실습 2 (0) | 2020.10.21 |
정보보안 과정 Day30 : 쉘 스크립트 (1) | 2020.10.19 |
정보보안 과정 Day28+29 : 웹 서버 FTP 서버 구축, bash shell script (0) | 2020.10.16 |
정보보안 과정 Day26+27 (0) | 2020.10.14 |