[클라우드 With리눅스/쉘프로그래밍(3) - IF문,연산자,case 실습]

SooYeon Yeon·2022년 8월 22일

클라우드 With리눅스

목록 보기
28/39

IF문

if [ 조건 ] 
then
	참일 경우 실행
fi
  • 조건 대신 명령이 들어가면 명령이 정상적으로 실행되었을 때가 참이 된다.

  • 조건

if [ "woo" = 'woo" ]
then
	echo "참"
fi
  • 명령이 정상적 실행 시 참
  • pwd를 출력하지는 않게 하기
#!/bin/bash

if pwd > /dev/null
then
        echo "finished"
fi
  • 사용자로부터 검색하고 싶은 사용자의 이름을 입력받고 해당 사용자가 있다면 화면에 결과출력
#!/bin/bash

echo -n "user name ? : "
read testuser

if grep $testuser /etc/passwd
then
        echo "OK"
else
        echo "no user $testuser"
fi
[root@sooyeon 0726]# ./test3.sh
user name ? : user1
user1:x:1000:1000:user1:/home/user1:/bin/bash
OK

Quiz

사용자로부터 httpd가 설치되어있는 지 여부를 확인하고 설치되어 있지 않다면 해당 패키지를 설치하도록 하라. 만약 설치되어 있다면 버전을 출력하고 그렇지 않다면 설치하는 프로그램을 작성하세요.

검색하고 싶은 패키지? : httpd

설치되어 있지 않다.

설치가 진행됨

검색하고 싶은 패키지? : httpd

설치되어 있음

httpd version출력

rpm -qa | grep httpd 하고 $?를 했을 때 1이면 정상X, 파일이 있다면 내용이 나옴

#!/bin/bash

echo -n "설치하고 싶은 패키지? : "
read packagename

if rpm -qa | grep ${packagename}-
then
        echo "설치되어 있음"
        ${packagename} --verion
else
        echo "설치되어 있지 않음"
        yum -y install ${packagename}
fi
  • 변수 명 지정시 $name=gildong, echo $nameis … 할 시 nameis로 되어버리기 때문에 중괄호로 감쌈

연습

testuser를 /etc/passwd에서 찾아서 있다면 OK 출력, 없다면 NO USER 후 사용자의 디렉토리가 있는 지 확인 하고 있다면 디렉토리가 있다고 출력

#!/bin/bash

testuser=user11

if grep $testuser /etc/passwd
then
        echo "OK"
else
        echo "NO USER"
        if ls -d /home/$testuser
        then    echo "DIR IS THERE!!"
        fi
fi
  • 유저 만들고, 디렉토리는 남겨둔 채로 삭제 후 확인
[root@sooyeon 0726]# useradd user11
[root@sooyeon 0726]# ls /home
user1  user11
[root@sooyeon 0726]# userdel user11
[root@sooyeon 0726]# ls /home
user1  user11

[root@sooyeon 0726]# ./test5.sh
NO USER
/home/user11
DIR IS THERE!!

실습 문제

원격지에 접속한 특정 사용자의 ssh 연결을 종료시켜라

who - 서버에 접속한 사용자를 볼 수 있음

who | grep 192.168.1.14

ps -ef | grep sshd: sshd에서 프로세스 확인

해당 PID를 종료하려면 kill -9 [PID] . PID는 두번째 것

  • HINT
[root@sooyeon 0726]# who
root     tty1         2022-07-26 09:26
root     pts/0        2022-07-26 09:30 (192.168.1.15)

# 현재 시스템에서 동작하는 프로세스 중 sshd 관련 프로세스 출력
[root@sooyeon 0726]# ps -ef | grep sshd
root        972      1  0 09:09 ?        00:00:00 /usr/sbin/sshd -D
root       1522    972  0 09:30 ?        00:00:02 sshd: root@pts/0
root      12351   1524  0 11:51 pts/0    00:00:00 grep --color=auto sshd

# 위의 결과 중 pts/0과 매치하는 행이 있다면 출력
[root@sooyeon 0726]# ps -ef | grep sshd | grep pts/0
root       1522    972  0 09:30 ?        00:00:02 sshd: root@pts/0
root      12353   1524  0 11:51 pts/0    00:00:00 grep --color=auto sshd

# 앞선 결과는 실제 pts/0과 grep 명령어에서 pts/0을 사용하는 것 두가지가 보인다. 
# 이중 실제 우리가 원하는 pts만 골라내기 위해 아래의 결과는 버림
[root@sooyeon 0726]# ps -ef | grep sshd | grep pts/0 | head -1
root       1522    972  0 09:30 ?        00:00:02 sshd: root@pts/0

# 위와 같은 결과에서 gawk를 사용하면 한 행에 있는 각 열을 $1부터 위치 변수에 담을 수 있음
# 우리가 원하는 PID는 $2이므로 $2를 골라 출력
[root@sooyeon 0726]# ps -ef | grep sshd | grep pts/0 | head -1 | gawk '{print $2}'
1522

# 강제종료
kill -9 [PID]

연결을 종료하고 싶은 IP를 입력하세요 : 192.168.1.11

결과(잘못된 IP 입력시)

해당 IP는 연결정보가 없습니다

결과(연결된 IP 있다면)

해당 연결을 종료하였습니다. 출력 후 ssh 연결 종료됨

Shell

#!/bin/bash

# 변수 선언
ipaddr=''

echo -n "차단할 IP주소 입력 : "
read ipaddr

if who | grep $ipaddr
then
        pts=$(who | grep $ipaddr | gawk '{print $2}')
        pid=$(ps -ef | grep sshd | grep $pts | gawk '{print $2}')
        echo "${ipaddr}은 차단될 예정입니다"
        sleep 2

        # 연결 종료된 IP를 영구적으로 차단
        route add -host $ipaddr reject

        kill -9 $pid

else
        echo "해당 IP는 연결정보가 없습니다."
fi
  • 차단 된 것 확인하려면
route

없으면

yum -y install net-tools
  • 차단을 해제하고싶다면
route del -host $ipaddr reject

elif

if command1
then
	commands
elif command2
then
	commands
fi

비교연산자

문자열비교결과
“문자열1”=”문자열2”두 문자열 같으면 참
“문자열1”!=”문자열2”두 문자열 같지 않으면 참
-n “문자열”문자열이 NULL이 아니면 참
-z “문자열”문자열이 NULL이면 참

z 자주 사용

산술비교연산자

산술비교결과
수식1 -eq 수식2(또는 변수)두 수식(또는 변수)가 같으면 참
수식1 -ne 수식2(또는 변수)두 수식(또는 변수)가 같지않으면 참

파일 관련 조건

파일조건결과

부울연산자

[ 조건식1 ] $$ [ 조건식2 ] : 두 조건 모두 만족하면 참

[ 조건식1 ] || [ 조건식2 ] : 두 조건 중 하나라도 만족하면 참

이중 대괄호 사용하기

  • 문자열 비교에 대한 고급 기능 제공
  • [[ ]]로 패턴을 입력할 수 있다
  • 문자열값, 비교할 정규표현식 정의 가능
# USER가 r로 시작하면 참
if [[ $USER == r* ]]
then
	~
else
	~
fi
  • 지중 등호(==)는 오른쪽 문자열(r*)을 패턴으로 간주

[[ $a == user1 ]] && [[ $b == gildong ]]과 같이 사용도 가능

case

case "$1" in
	start)
		echo "시이이작"
		echo "시작";;
	stop)
		echo "중지";;
	*)
		echo "그외";;
esac

0개의 댓글