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

 

728x90

+ Recent posts