Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

리눅스 초보자를 위한 실전 쉘 스크립트 5선 – 파트 II

무언가를 배우려면 실패에 대한 두려움 없이 직접 해봐야 합니다. 저는 실습의 중요성을 믿기 때문에, 이번 글에서도 여러분과 함께 스크립팅 언어의 실전 세계로 들어가 보겠습니다.

이 글은 첫 번째 시리즈인 『리눅스 쉘과 기본 쉘 스크립팅 이해하기 – 파트 I』의 연장선입니다. 지난 시간에 맛보기로 스크립팅을 경험해 보셨다면, 이번 글에서도 실망시키지 않을 것입니다.

스크립트 1: 특수 패턴 그리기

사용자에게 5에서 9 사이의 숫자를 입력받아 다이아몬드 형태의 특수 패턴을 화면에 출력하는 스크립트입니다. 반복문과 조건문의 기본 개념을 익히기에 좋은 예제입니다.

#!/bin/bash
MAX_NO=0
echo -n "Enter Number between (5 to 9) : "
read MAX_NO
if ! [ $MAX_NO -ge 5 -a $MAX_NO -le 9 ] ; then
   echo "WTF... I ask to enter number between 5 and 9, Try Again"
   exit 1
fi
clear
for (( i=1; i<=MAX_NO; i++ )) do     for (( s=MAX_NO; s>=i; s-- ))
    do
       echo -n " "
    done
    for (( j=1; j<=i;  j++ ))     do      echo -n " ."      done     echo "" done ###### Second stage ###################### for (( i=MAX_NO; i>=1; i-- ))
do
    for (( s=i; s<=MAX_NO; s++ ))
    do
       echo -n " "
    done
    for (( j=1; j<=i;  j++ ))
    do
     echo -n " ."
    done
    echo ""
done
echo -e "\n\n\t\t\t Whenever you need help, Tecmint.com is always there"

위 코드의 대부분 키워드는 이미 익숙하거나 이름만 봐도 의미를 알 수 있을 것입니다. 예를 들어 MAX_NO는 변수의 최대값을 설정하고, for는 반복문으로 주어진 입력값 범위 동안 루프 내부의 명령을 계속 실행합니다.

실행 결과 예시

[admin@wsxdn.com ~]# chmod 755 Special_Pattern.sh
[admin@wsxdn.com ~]# ./Special_Pattern.sh
Enter Number between (5 to 9) : 6
       .
      . .
     . . .
    . . . .
   . . . . .
  . . . . . .
  . . . . . .
   . . . . .
    . . . .
     . . .
      . .
       .

                         Whenever you need help, Tecmint.com is always there

프로그래밍 언어를 조금이라도 접해 본 적이 있다면 위 스크립트를 배우는 것은 어렵지 않습니다. 설령 컴퓨터, 프로그래밍, 리눅스가 완전히 처음이더라도 크게 어렵지 않을 것입니다.

스크립트 2: 알록달록한 스크립트 만들기

리눅스는 무미건조하고 색이 없다고 말하는 사람이 누구인가요? 아래 코드를 아무 이름이나 붙여 .sh 확장자로 저장하고, 실행 권한을 부여한 뒤 실행해 보세요. 어떤 느낌인지 꼭 알려주시고, 이것을 어디에 활용할 수 있을지도 한번 생각해 보세요.

#!/bin/bash
clear 
echo -e "33[1m Hello World"
# bold effect
echo -e "33[5m Blink"
# blink effect
echo -e "33[0m Hello World"
# back to normal
echo -e "33[31m Hello World"
# Red color
echo -e "33[32m Hello World"
# Green color
echo -e "33[33m Hello World"
# See remaining on screen
echo -e "33[34m Hello World"
echo -e "33[35m Hello World"
echo -e "33[36m Hello World"
echo -e -n "33[0m"
# back to normal
echo -e "33[41m Hello World"
echo -e "33[42m Hello World"
echo -e "33[43m Hello World"
echo -e "33[44m Hello World"
echo -e "33[45m Hello World"
echo -e "33[46m Hello World"
echo -e "33[0m Hello World"

참고: 지금은 색상 코드에 신경 쓰지 않아도 됩니다. 중요한 코드들은 자연스럽게 몸에 익게 될 것입니다.

주의: 사용 중인 터미널이 깜빡임(blink) 효과를 지원하지 않을 수 있습니다.

실행 결과 예시

[admin@wsxdn.com ~]# chmod 755 Colorfull.sh
[admin@wsxdn.com ~]# ./Colorfull.sh

Hello World
Blink
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World

스크립트 3: 파일/디렉토리 암호화하기

이 스크립트는 파일을 암호화합니다(기억하시나요? 리눅스에서는 디렉토리, 드라이브 등 모든 것이 파일로 취급됩니다). 현재 스크립트의 한계는 TAB 키를 이용한 파일명 자동 완성을 지원하지 않는다는 점입니다. 또한 암호화할 파일과 스크립트를 같은 폴더에 위치시켜야 합니다. 필요하다면 yum이나 apt를 통해 “pinentry-gui” 패키지를 설치해야 할 수도 있습니다.

[admin@wsxdn.com ~]# yum install pinentry-gui
[admin@wsxdn.com ~]# apt-get install pinentry-gui

Encrypt.sh”라는 이름의 파일을 생성하고 아래 스크립트를 넣은 뒤, 실행 권한을 부여하고 실행하세요.

#!/bin/bash
echo "Welcome, I am ready to encrypt a file/folder for you"
echo "currently I have a limitation, Place me to thh same folder, where a file to be 
encrypted is present"
echo "Enter the Exact File Name with extension"
read file;
gpg -c $file
echo "I have encrypted the file successfully..."
echo "Now I will be removing the original file"
rm -rf $file

실행 결과 예시

[admin@wsxdn.com ~]# chmod 755 Encrypt.sh
[admin@wsxdn.com ~]# ./Encrypt.sh

Welcome, I am ready to encrypt a file/folder for you
currently I have a limitation, Place me to the same folder, where a file to be

encrypted is present
Enter the Exact File Name with extension

package.xml

                                                   ┌─────────────────────────────────────────────────────┐
                                                   │ Enter passphrase                                    │
                                                   │                                                     │
                                                   │                                                     │
                                                   │ Passphrase *******_________________________________ │
                                                   │                                                     │
                                                   │       <OK>                             <Cancel>     │
                                                   └─────────────────────────────────────────────────────┘

Please re-enter this passphrase

                                                   ┌─────────────────────────────────────────────────────┐
                                                   │ Please re-enter this passphrase                     │
                                                   │                                                     │
                                                   │ Passphrase ********________________________________ │
                                                   │                                                     │
                                                   │       <OK>                             <Cancel>     │
                                                   └─────────────────────────────────────────────────────┘

I have encrypted the file successfully...
Now I will be removing the original file

gpg -c: 이 명령은 암호(passkey, 즉 비밀번호)를 사용해 파일을 암호화합니다. 학습 과정에서 실제 배움이 이렇게 쉬울 수 있다고는 생각지 못했을 것입니다. 그렇다면 파일을 암호화한 후에는 무엇이 필요할까요? 당연히 복호화입니다. 여러분, 즉 학습자이자 독자인 여러분께서 직접 복호화 스크립트를 작성해 보시길 바랍니다. 걱정하지 마세요, 여러분을 중간에 버리고 가는 것이 아니라 이 글에서 무언가를 얻어 가셨으면 하는 것뿐입니다.

참고: 복호화 스크립트에는 gpg -d filename.gpg > filename 구문을 구현하면 됩니다. 성공적으로 작성하셨다면 댓글로 스크립트를 공유해 주세요. 어렵다면 제가 작성해 드릴 수도 있습니다.

스크립트 4: 서버 사용률 점검하기

서버 사용률 점검은 관리자의 중요한 업무 중 하나이며, 좋은 관리자란 일상적인 작업을 자동화하는 방법을 아는 사람입니다. 아래 스크립트는 서버에 대한 다양한 정보를 한꺼번에 보여줍니다. 직접 확인해 보세요.

#!/bin/bash
    date;
    echo "uptime:"
    uptime
    echo "Currently connected:"
    w
    echo "--------------------"
    echo "Last logins:"
    last -a |head -3
    echo "--------------------"
    echo "Disk and memory usage:"
    df -h | xargs | awk '{print "Free/total disk: " $11 " / " $9}'
    free -m | xargs | awk '{print "Free/total memory: " $17 " / " $8 " MB"}'
    echo "--------------------"
    start_log=`head -1 /var/log/messages |cut -c 1-12`
    oom=`grep -ci kill /var/log/messages`
    echo -n "OOM errors since $start_log :" $oom
    echo ""
    echo "--------------------"
    echo "Utilization and most expensive processes:"
    top -b |head -3
    echo
	top -b |head -10 |tail -4
    echo "--------------------"
    echo "Open TCP ports:"
    nmap -p- -T4 127.0.0.1
    echo "--------------------"
    echo "Current connections:"
    ss -s
    echo "--------------------"
    echo "processes:"
    ps auxf --width=200
    echo "--------------------"
    echo "vmstat:"
    vmstat 1 5

실행 결과 예시

[admin@wsxdn.com ~]# chmod 755 Server-Health.sh
[admin@wsxdn.com ~]# ./Server-Health.sh

Tue Jul 16 22:01:06 IST 2013
uptime:
 22:01:06 up 174 days,  4:42,  1 user,  load average: 0.36, 0.25, 0.18
Currently connected:
 22:01:06 up 174 days,  4:42,  1 user,  load average: 0.36, 0.25, 0.18
USER     TTY      FROM              admin@wsxdn.com   IDLE   JCPU   PCPU WHAT
tecmint   pts/0    116.72.134.162   21:48    0.00s  0.03s  0.03s sshd: tecmint [priv]
--------------------
Last logins:
tecmint   pts/0        Tue Jul 16 21:48   still logged in    116.72.134.162
tecmint   pts/0        Tue Jul 16 21:24 - 21:43  (00:19)     116.72.134.162
--------------------
Disk and memory usage:
Free/total disk: 292G / 457G
Free/total memory: 3510 / 3838 MB
--------------------
OOM errors since Jul 14 03:37 : 0
--------------------
Utilization and most expensive processes:
top - 22:01:07 up 174 days,  4:42,  1 user,  load average: 0.36, 0.25, 0.18
Tasks: 149 total,   1 running, 148 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.0%sy,  0.0%ni, 99.3%id,  0.6%wa,  0.0%hi,  0.0%si,  0.0%st

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    1 root      20   0  3788 1128  932 S  0.0  0.0   0:32.94 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      RT   0     0    0    0 S  0.0  0.0   0:14.07 migration/0

참고: 위 스크립트는 결과를 터미널에 바로 출력합니다. 나중에 참조할 수 있도록 파일로 저장하는 방법은 어떨까요? 리디렉션 연산자를 활용해 구현해 보세요.

  1. > : 리디렉션 연산자로 파일을 생성합니다. 이미 파일이 존재한다면 기존 내용을 덮어씁니다.
  2. >> : >>를 사용하면 내용을 교체하는 것이 아니라 추가합니다.
  3. >에 비해 >>가 더 안전합니다.

스크립트 5: 디스크 공간 확인 및 이메일 알림 발송

PART 파티션의 디스크 사용량이 허용 최대치를 초과하면 이메일을 받을 수 있다면 어떨까요? 약간만 수정하면 웹 관리자에게 생명줄 같은 스크립트가 됩니다.

MAX=95
admin@wsxdn.com
PART=sda1
USE=`df -h |grep $PART | awk '{ print $5 }' | cut -d'%' -f1`
if [ $USE -gt $MAX ]; then
  echo "Percent used: $USE" | mail -s "Running out of disk space" $EMAIL
fi

참고: “USER” 부분을 본인의 사용자 이름으로 변경하세요. 메일은 ‘mail’ 명령어로 확인할 수 있습니다.

스크립트 작성과 프로그래밍에는 경계가 없습니다. 필요에 따라 무엇이든 구현할 수 있습니다. 오늘은 여기까지입니다. 다음 글에서는 또 다른 맛의 스크립팅을 소개해 드리겠습니다. 그때까지 시원하게, 그리고 계속 지켜봐 주세요. 즐거운 코딩 되세요!