RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
참 조잡하다 = ㅂ=)a
그래도 유용하게 잘 돌아간다~

#!/bin/bash
# scripts by uzoogom

export LANG_ALL=ko_KR.eucKR
day=$(date +%Y-%m-%d)
backuplist=$(cd /backup/ && ls -d *)
list="$day"backup_check.txt

echo "$day backup status" > $list
echo " " >> $list
echo "Success list--------------------------------" >> $list

echo " " > bad.txt
echo "Fail list--------------------------------" >> bad.txt

for checkname in $backuplist
do
        check=$(find /backup/$checkname -type f -name "backupTime($day).txt" | wc -l )

        if [ $check == 1 ]
        then
                echo "$checkname backup is successfully Done!" >> $list
        else
                echo "$checkname backup is Fail. plz check your system." >> bad.txt
        fi

done
cat bad.txt >> $list
success=$(grep "successfully" $list | wc -l)
nonsuccess=$(grep "Fail" $list | wc -l)
sed "1a Success  :"$success"\nFailure:"$nonsuccess"" $list > last.txt
cat last.txt > $list
cat $list | mail -s ""$day" real server backup status" uzoogom@dunet.co.kr serverbin@dunet.co.kr
mv $list /root/SH/checklog
rm -f /root/backup/*.txt

출처 : 대전국제IT교육센터 정성재 강사

 

1. shell이란?
shell은 커널과 사용자간의 다리역할을 하는 것으로 사용자로부터 명령을 받아 그것을 해석하고
프로그램을 실행하는 역할을 한다. shell은 커널에서 분리된 별도의 프로그램이기 때문에 새로운
종류의 shell이 지속적으로 개발되고 있다. 예전 Unix의 shell은 스티븐 본(Steven Bourne)이 개발한
Bourne Shell(sh)과 버클리 대학의 빌 조이(Bill Joy)가 개발한 C shell(csh)뿐이었지만, 현재는
이러한 shell을 기반으로 bash, ksh, tcsh, zsh같은 shell이 개발되었다. Linux에서는 sh을 기본으로
ksh와 csh계열의 장점을 결합한 bash(Bourne Again shell)을 표준으로 하고 있다.

2. shell의 종류와 소개
(1) bash
   Bourne Again Shell의 약자로 GNU 프로젝트에 의해 개발되었다. 리눅스의 표준쉘로 자리잡고 있
  으며 유닉스의 표준 쉘이자 bash의 모태가 된 Bourne Shell(보통 sh이라고 함)과 호환된다.
(2) C shell
   C 쉘은 C 프로그래밍언어와 유사한 형태를 가지고 있기 때문에 붙여졌다. 대부분의 유닉스 프로그
  래머들이 C 언어로 프로그램을 짰기 때문에 많이 사용되었다. 히스토리 기능, 명령어 완성기능, 작
  업 제어 등의 기능이 있고, 버클리 대학의 빌 조이가 개발하였다.
(3) ksh
   Korn Shell(ksh)이라 불리우며 AT&T사의 데이비드 콘(David Korn)이 개발하였다. 역시 명령어 완
  성기능, 히스토리 등의 기능이 있다.
(4) tcsh
   The Enhanced C Shell의 약자로 말 그대로 csh를 기능을 강화시킨 쉘이다. 명령어 라인 에디트
  기능 등을 추가로 지원한다.

3. shell의 사용법
(1) 특징: shell명령문의 일반적 형태는 단순히 명령어만 입력하거나, 명령어 뒤에 각종 옵션과
         인자(argument)를 함께 입력하여 사용할 수 있다. 또한 여러 명령어를 함께 사용할 수
         있다.
(2) 사용법
    command [option] [argument]
(3) 사용예
   1) pwd
       => 현재 작업중인 디렉토리를 표시한다.
   2) wc -l bash_scripts
       => bash_scripts파일의 라인 수를 표시한다.
   3) find / -name bash -print
       => 이름이 bash인 파일이나 디렉토리를 루트(/)디렉토리 아래에서 찾아 표시한다.
   4) ls -alF ; pwd
       => ls -alF 수행후에 pwd 명령을 수행한다.
(4) shell의 명령문 처리 과정
   1) 사용자 터미널, 파일 또는 명령행 옵션으로부터 입력을 받아들인다.
   2) 입력문을 인용법칙에 따라 단어와 연산자로 분리한다. Alias가 있을 경우 이 때 변환한다.
   3) 위에서 분리한 단어(token)들을 단순 또는 복합 명령어로 변환한다.
   4) shell확장법에 따라 token을 확장한 후, 명령어, 파일명, 인자등으로 구분한다.
   5) I/O재지정을 한 후, 인자로 부터 I/O 재지정 연산자를 제거한다.
   6) 명령을 수행한다.
   7) 명령의 종료를 기다린 후, 종료 상태를 검사한다.
(5) 명령의 실행 결과를 명령문으로 대체
   1) 설명 : 명령의 실행결과를 명령문의 일부로 대체한다. 이 경우에 ``(back quotes)나 $()을
           사용한다.
   2) 사용법
     command `command`
     command $(command)
   3) 사용예
     [조건] : man이라는 명령어를 알고 있다. 이 명령어의 위치와 더불어 해당 파일의 소유권, 파일
             의 크기 등을 알고 싶다. 어떠한 방법으로 써야 하는가?
    ㄱ. 일반적인 방법
       [posein@www posein]$ which man
       /usr/bin/man
         => which 명령을 이용하여 파일의 위치를 알아낸다.
       [posein@www posein]$ ls -l /usr/bin/man
       -rwxr-xr-x    1 root     root        39192  9월  3  2002 /usr/bin/man
         => which 명령을 이용하여 알아낸 파일의 위치를 ls명령어를 이용하여 확인한다.
    ㄴ. 명령대체 이용하기
      a. Back Quote(` `) 이용
        [posein@www posein]$ ls -l `which man`
        -rwxr-xr-x    1 root     root        39192  9월  3  2002 /usr/bin/man
      b. $() 이용
        [posein@www posein]$ ls -l $(which man)
        -rwxr-xr-x    1 root     root        39192  9월  3  2002 /usr/bin/man

4. Shell 확인 및 변경
(1) 일단 현재 사용중인 쉘을 확인해보자.
   [posein@www posein]$ echo $SHELL
   /bin/bash
    => 현재 배쉬셀을 사용중이다. 참고로 SHELL은 꼭 대문자로 표기해야 한다.
(2) 쉘을 변경
   1) 임시변경
    ㄱ. 설명: 일시적으로 다른 쉘을 사용할 경우에 쉘상에서 '/bin/csh' 또는 '/bin/bash'이라고
             입력하면 임시로 변경된다. 사용중인 쉘에서 나오려면 exit를 치면 된다.
    ㄴ. 사용예
       [posein@www posein]$ /bin/csh
       [posein@www ~]$
         => 쉘이 바뀌면서 프롬프트가 변경됨을 알 수 있다.
       [posein@www ~]$ exit
       exit
       [posein@www posein]$
         => 원래의 쉘인 bash로 전환된다.
   2) login shell 변경
    ㄱ. 설명: 사용하는 쉘을 완전히 전환할 때는 chsh(change shell의 약자)명령을 이용한다.
    ㄴ. 사용예
       [posein@www posein]$ chsh          // 명령어를 입력한다.
       Changing shell for posein.         // 해당사용자의 패스워드를 물어본다.
       Password:                          // 패스워드를 입력한다.
       New shell [/bin/bash]: /bin/csh    // 사용하고자하는 쉘을 입력한다.
       Shell changed.                     // 쉘이 변경이 완료되었다.
        => C-Shell로 바꾸는 과정이다. 변경된 쉘의 사용은 다음 로그인부터이다.
   3) 다른 방법으로 쉘을 변경
    ㄱ. 설명: root만 가능한 방법으로 사용자와 관련된 파일인 /etc/passwd 파일에서 직접수정한다.
    ㄴ. 방법
      a. vi편집기등을 이용하여 /etc/passwd 파일을 연다.
      b. 변경하고자하는 사용자를 찾는다. 예를 들면 사용자가 posein이면 vi의 명령모드에서
        /posein을 입력하여 해당 라인으로 이동한다.
      c. posein:x:500:500::/home/posein:/bin/bash 에서 bash를 csh로 변경한뒤 저장하고 종료한다.
      d. 다시 로그인하면 변경된 쉘을 이용할 수 있다.
(참고) 지원하는 쉘의 목록
        지원하는 쉘의 목록은 /etc/shells라는 파일에 기록되어 있다. 쉘의 종류가 절대경로로 표시
       되어 있다.

5. 간단한 쉘스크립트(Shell Script)만들기
(1) 개요 : 쉘스크립트란 쉘에 의해 실행될 명령들을 포함하는 파일이다. 쉘스크립트에 있는 명령은
           쉘프롬프트에서 입력할 수 있는 어떤 명령도 될 수 있다. 쉘스크립트를 만드는 가장 쉬운
           방법은 파일명을 명령줄에서 주는 것이다. 쉘 스크립트 실행시 쉘은 스크립트에 있는
           명령을 하나하나씩 실행한다. 그러므로 쉘스크립트를 사용하면 복잡한 일련의 작업 혹은
           반복적인 처리를 간단하고 빠르게 할 수 있다.
(2) 사용예 : 'who2'라는 세 개의 명령줄을 포함한 쉘스크립트를 만들기
   1) 설명: who라는 명령을 기반으로 하여 명령실행하는 순간 현재 시간과 간단한 메시지를 넣도록
           하는 who2 라는 쉘스크립트를 만든다.
   2) 방법
    ㄱ. 먼저 vi로 who2라는 파일을 생성한다.
       [posein@www posein]$ vi who2
       date
       echo "현재 로그인한 사용자의 목록입니다."
       who
    ㄴ. 실행권한 부여 : 실행파일로 만든다.
       [posein@www posein]$ chmod 755 who2
    ㄷ. 실행
       [posein@www posein]$ ./who2
       수  4월 30 21:53:53 KST 2003
       현재 로그인한 사용자의 목록입니다.
       root     :0           Apr 27 21:40
       xitem    pts/5        Apr 29 19:00 (203.xxx.xxx.xxx)
       posein   pts/4        Apr 30 17:17 (203.xx.xxx.xxx)
        => PATH가 되어 있지 않으므로 PATH가 설정된 디렉토리로 옮기든지 아니면 ./who2 라고 실행
          시켜야 한다.
   3) 관련명령어 : sh
    ㄱ. 설명: 실행권한과 상관없이 직접실행시키는 명령어이다.
    ㄴ. 사용예
     [posein@www posein]$ sh who2
       => 실행권한에 상관없이 실행시킨다.
   4) 참고 : 쉘스크립트를 위치에 상관없이 실행시키기
    ㄱ. 설명: 쉘에서 실행명령을 내리면 PATH라는 환경변수에 설정된 경로에서 해당 명령이 찾아
             있으면 실행시켜주고 없으면 실행되지 않는다. 따라서 자신의 홈디렉토리처럼 PATH가
             설정되어 있지 않은 디렉토리에 쉘스크립트를 생성하면 실행시마다 절대경로
             (예 /home/posein/who2)를 입력하거나 ~/who2 라고 입력해야 한다. 따라서 특정 쉘스크
             립트를 계속적으로 사용하려면 PATH에 등록된 경로에 해당 파일을 옮겨놓으면 어떤 위치
             에서라도 해당 명령을 실행시킬 수 있다.
    ㄴ. 설정법
      a. 현재 설정된 패스를 확인한다.
        [posein@www posein]$ echo $PATH
         /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
          => 현재 설정된 패스이다. 임의대로 접근이 가능한 디렉토리는 /home/posein/bin 디렉토리
            이므로 해당 디렉토리에 해당파일을 옮긴다.
      b. 홈디렉토리에 bin 디렉토리 생성하기
        [posein@www posein]$ mkdir bin
         => 패스에는 /home/posein/bin 이라는 디렉토리가 생성되어 있지만 실제로는 생성되어 있지
           않으므로 생성한다.
      c. 해당 디렉토리에 생성한 스크립트을 옮긴다.
        [posein@www posein]$ mv who2 bin

(참고) echo명령
  (1) 설명: echo는 문자열을 그대로 출력하는 명령어이다.
  (2) 사용법
     echo 문자열
  (3) 사용예
    1) [posein@www posein]$ echo I love linux
       I love linux
         => I love linux라는 문자열이 그대로 출력된다.
    2) [posein@www posein]$ echo $PATH
       /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
         => 현재 설정된 PATH를 보여준다.
    3) [posein@www posein]$ user=posein            // 변수와 값을 지정
       [posein@www posein]$ echo user              // 뒤에 있는 문자열 그대로 출력
       user
       [posein@www posein]$ echo $user            
       posein
        => $가 붙으면 뒤에 문자열은 변수로 인식하여 변수의 값을 출력한다.

6.bash shell의 특징
(1) 명령어 History기능 : 전에 사용했던 명령을 다시 사용하고 싶은 경우, 위/아래 방향키를 사용하
                        여 검색할 수 있는 기능이다. 이 명령어들은 ~/.bash_history파일에 저장되
                        어 있으며, history명령을 실행하면 히스토리 리스트에 있는 명령어들이
                        출력된다. 처음 로그인한 경우에는 .bash_history파일이 생성되지 않는다.
                        일단 한번 로그아웃해야 생성이 된다.

(참고) .bash_history파일 없애기
   히스토리파일은 어떠한 명령을 내렸는지를 기록하는 역할을 한다. 나중에 명령을 확인할 수 있다
  는 장점이 될 수 있지만 경우에 따라서는 다른 사람에게 내가 작업한 내용이 노출될 수도 있다.
  따라서, 이런 기능을 없애보자. 일단 .bash_history파일을 삭제하고, mkdir명령을 이용하여
  .bash_history라는 디렉토리를 생성한다. 그러면 동일한 장소에는 동일한 이름으로 파일이나 디렉
  토리의 생성이 불가능하다. 또한 디렉토리가 파일보다 우선순위가 높다.

(2) Alias 기능 : 실행할 명령어에 별명(alias)를 만들어 사용하게 해준다.
   1) 사용법
     alias 별명이름='실행될 명령어 정의'
   2) 사용예
     alias ls='ls -alF'
     => ls라고 명령을 내리면 ls -alF의 결과가 나타난다.
   3) 특징: 쉘에서 설정한 앨리어스는 로그아웃하거나 시스템이 재부팅되면 사라진다.

(참고) 설정한 alias 지속적으로 사용하기
   설정한 alias를 지속적으로 사용하려면 ~/.bashrc(bash run command)파일에 추가하여 사용한다.
  이 파일에 설정한 뒤에 재부팅하거나 source .bashrc를 실행시키면 된다.

(3) [TAB]키를 이용한 파일 이름 완성 기능
   명령어나 파일의 이름이 길거나 일부만 생각날 경우, 그 앞부분 일부만 명령행에 입력한 후에
  [TAB]키를 누르면, 가능한 파일이름을 자동으로 완성시켜 주는 기능이다.
(4) 작업 제어 기능 : 작업을 백그라운드와 포그라운드에서 실행할 수 있으며, 이 들을 서로 전환하
                   여 실행할 수 있다.
   1) 사용예
     [root@www /root]# updatedb &    // db를 업데이트하는 명령을 백그라운드(&)로 실행시킴
     [1] 17294                       // job번호가 1이고 프로세스번호가 17294이다.
     [root@www /root]# jobs          // jobs명령은 현재 진행중인 일과 job번호를 출력한다.
     [1]+  Running                 updatedb &  // updatedb &가 실행중이다.
     [root@www /root]# fg %1         // 현재 백그라운드로 진행중인 job번호가 1인 작업을 포그
     updatedb                        //라운드로 전환하였다. 작업이 하나이므로 %1 생략가능하다.
     [1]+  Stopped                 updatedb  // 포그라운드로 전환하면 다른 작업을 입력불가하다.
                                             //따라서, [CTRL]+[Z] 명령으로 작업을 중단시킨다.
     [root@www /root]# bg            // 다시 백그라운드로 전환한다.
     [1]+ updatedb &

(5) 명령문 편집 기능 : 단순히 명령어만 입력하거나 명령어 뒤에 각종 옵션(option)과 파라미터(pa
                     rameter)등의 인자를 함께 입력하여 사용할 수 있다. 또한 여러 명령을 세미
                     콜론(;)으로 분리해서 사용할 수 있다.
(6) 산술 연산 기능
(7) prompt 제어 기능
(8) 확장된 내부명령어


7.shell에서 사용되는 특수문자
쉘에서는 특별한 의미를 가지고 있는 특수 문자들이 있는데, 이를 메타문자(meta character)라고
한다.
(1) 종류
   ~(tilde)  : 홈디렉토리
    예) ~posein : posein이라는 사용자의 홈디렉토리를 나타낸다.
        ~+ : 현재디렉토리를 나타낸다. '.'과 같다.
   ' : 작은따옴표(Single quotes)는 모든 문자나 특수문자들을 일반문자로 취급한다.
   " : 큰따옴표(Double quotes)는 $,`(Backquotes), \(Backslash)를 제외한 모든 문자들을 일반문자
      로 취급한다.
   `  : 명령 대체(command substitution), Back quote라고 부른다. 큰따옴표안에서 명령어들이 문자
       열이 아닌 명령어의 역할을 하도록 해준다.
   #  : 주석(comment)
   $  : Shell변수
   &  : 후면 작업(background job)
   *  : wildcard라고 부르며, 모든 문자를 뜻한다. 아무것도 없는 경우도 포함한다.
   ?  : 한 문자를 대체할 때 사용하는 wildcard로 사용하고 특정명령에 대한 결과를 갖는 Return
       변수로도 쓰인다. 쉘상에서 내린 명령의 에러유무를 확인할 수 있다.
   () : 부속shell(subshell)
   \  : escape문자. 바로 다음에 오는 특수문자의 기능을 없앤다.
   |  : 파이프(pipe)
   [] : bracket이라고 부르며 [ 과 ]사이에 선택할 수 있는 문자를 나열하여 '~중의 하나'라고 표현
       된다. 범위를 지정할 때는 -를 사용한다. 문자집합을 뜻한다.
    예)
       [abc]    : a,b 또는 c
       [.,;]    : period, comma 또는 semicolon
       [-_]     : dash(-) 또는 underscore(_)
       [*?]     : * 또는 ? => []안의 와일드카드는 의미가 없다.
       [a-c]    : a,b 또는 c
       [a-z]    : a에서 z까지 알파벳 소문자
       [!0-9]   : 숫자가 아닌 문자
       [!chars], [^chars] : c, h, a, r, s중 없는 문자중의 하나로 대체
       [a-zA-Z] : 모든 알파벳문자
   ; : shell 명령 분리자
   {} : {}안에 제시된 문자열 중 하나로 대치시킨다.
     예)
        b{ed,olt,ar}s : beds, bolts, bars
        b{ar{d,n,k},ed}s : bards, barns, barks, beds
   <  : 입력재지정
   >  : 출력재지정
   /  : 경로명 디렉토리 분리자
   !  : 명령문 history
(2) 사용예 : 현재 디렉토리에 a, a.c, a.txt, a.o, b.txt, c.txt, d.o, ab.txt 라는 파일이 있다고
             가정
   1) [posein@www posein]$ ls a*
      a  a.c  a.o  a.txt  ab.txt
       => *는 모든 문자를 뜻한다. 즉 a로 시작하는 모든 파일을 보여준다. 물론 a라는 이름이 파
         일도 찾아준다.
   2) [posein@www posein]$ ls a.?
      a.c  a.o
       => ?는 한문자만 대체한다.
   3) [posein@www posein]$ ls [a-c].*
      a.c  a.o  a.txt  b.txt  c.txt
       => [a-c]는 a,b 또는 c 한문자를 가리킨다.
   4) [posein@www posein]$ ls [!ab].*
      c.txt  d.o
       => a나 b가 들어가지 않는 파일만을 찾아 출력한다.
(3) 응용예
   1) [posein@www posein]$ cp test.txt{,-bak}
       => cp test.txt test.txt-bak 와 같다.
   2) [posein@www posein]$ mkdir work
      [posein@www posein]$ mkdir -p work/{www,ftp,mail}/{data,backup,file}
      [posein@www posein]$ cd work
      [posein@www work]$ ls
      ftp  mail  www
      [posein@www work]$ ls ftp
      backup  data  file
      [posein@www work]$ ls mail
      backup  data  file
      [posein@www work]$ ls www
      backup  data  file
   3) [posein@www work]$ echo "Hostname: hostname"
      Hostname: hostname
      [posein@www work]$ echo "Hostname: `hostname`"
      Hostname: www
      [posein@www work]$ echo "Hostname: $(hostname)"
      Hostname: www
      [posein@www work]$ echo 'Hostname: `hostname`'
      Hostname: `hostname`
   4) [posein@www posein]$ mkdir data
      [posein@www posein]$ echo $?
      0
       => 0 이면 에러없이 잘 수행되었다는 뜻이다. 반환되는 값은 각 프로그램마다 다르지만 대체
        적으로 값이 0이면 성공을 뜻한다.
      [posein@www posein]$ mkdir data             // 다시 한번 명령을 내린다.
      mkdir: cannot create directory `data': 파일이 존재합니다
      [posein@www posein]$ echo $?
      1
       => 0이 아니므로 에러가 발생했음을 알 수 있다.

(참고) 쉘스크립트에서 상태
   0          : 종료상태로 성공적인 수행을 나타낸다.
   0이 아닌값 : 에러를 나타낸다.


(참고) ; 과 &&, ||
  1. 의미
    ;  : 단순히 한줄에 여러 명령을 나열하기 위해 사용한다.
    || : 논리적 OR(Logical-OR)라 부르며 앞선 명령이 성공이면 앞 명령결과를 출력하고 그렇지 않
       으면 뒤의 명령결과를 출력한다.
    && : 논리적 AND(Logical-AND)라 부르며 앞의 명령이 성공적으로 수행되어야만 다음 명령을 수행
        한다.
  2. 사용예
   (1) clear ; ls ; pwd
        => clear 명령 후 차례대로 ls, pwd 명령을 실행시킨다.
   (2) clear; aaa ; pwd
        => 명령을 순서대로 수행하되 앞의 명령의 수행결과의 성공유무에 상관없이 다음명령을 실행
         한다. 즉 clear 명령후에 존재하지 않는 aaa 명령을 실행하고 pwd 명령을 실행한다.
   (3) [posein@www posein]$ grep babo /etc/passwd || echo 'No babo'
       No babo
       [posein@www posein]$ grep posein /etc/passwd || echo 'No posein'
       posein:x:500:500::/home/posein:/bin/bash
        => babo라는 계정은 없고 posein이라는 계정이 있을 때의 경우이다.
   (4) [posein@www data]$ ls
       test.txt
       [posein@www data]$ mv test.txt test.bak && ls
       test.bak
       [posein@www data]$ cp test.txt test.bak && ls
       cp: cannot stat `test.txt': 그런 파일이나 디렉토리가 없음

8. shell에서의 인용부호
문자나 단어의 특별한 의미를 없앨 때 인용부호를 사용한다. 즉 메타 문자가 가지고 있는 특수한
기능을 제거할 때 사용한다.
(1)달러 표시(Dollar sign :$)
   1) 설명: $은 shell변수를 나타낼 때 사용한다. 변수에 특정한 값으로 부여할 때는 =를 사용한다.
   2) 사용예
    ㄱ. [posein@www posein]$ name=posein
        [posein@www posein]$ echo $name
        posein
    ㄴ. [posein@www posein]$ echo $PATH
        /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
         => 경로를 나타내는 변수(PATH)값을 표기한다.

(참고) echo는 텍스트문자열을 그대로 출력하는 명령어이고, PATH는 경로를 나타내는 환경변수이다.

(2)작은 따옴표(Single Quotes: ' ')
   1) 설명: 모든 특수문자의 의미를 제거한다.
   2) 사용예
     [posein@www posein]$ echo '$PATH'
     $PATH
      => ' '안의 $PATH를 단순한 문자열로 표기한다.(변수명 자체를 그냥 문자열로 표기)
(3)큰따옴표(Double Quotes:" ")
   1) 설명: 따옴표 안에 있는 $, `, \를 제외한 모든 문자들의 특별한 의미를 없앤다.
   2) 사용예
     [posein@www posein]$ echo "$PATH"
     /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
      => " "안의 $PATH에 들어갈 내용으로 바꾸어 표기한다.(변수에 들어간 내용을 표기)
(4)백슬래쉬(Backslash : \)
   1) 설명: 다음에 나오는 문자의 특별한 의미를 제거하거나 명령행이 긴 경우 다음라인까지 이어
          서 사용한다는 의미에서도 사용한다.
   2) 사용예
    ㄱ. [posein@www posein]$ echo \$PATH
        $PATH
         => \뒤에 오는 shell변수에 사용되는 $의 특수한 기능을 없애고, 단순한 문자열로 인식
    ㄴ. [posein@www posein]$ echo \$$PATH
        $/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
        => \뒤에 오는 첫번째 $의 특수한 기능을 없애고, 그다음 $PATH는 환경변수로 인식하여 경로
          를 출력한다.
    ㄷ. [root@www php-4.2.3]# ./configure --with-mysql=/usr/local/mysql \
        > --with-apache=../apache_1.3.26 --enable-track-vars
         => 명령어를 입력하다가 \ 를 입력하면 라인이 바뀌면서 2차프롬프트로 >가 나타나면서
          계속 입력할 수 있다.
(5)백쿼터(Back quotes :` `)
   1) 설명: 명령어 대체(command substitution) 즉 ` `로 묶여진 문자열은 명령어로 인식된다.
   2) 사용예
    [posein@www posein]$ echo "Current directory `pwd`"
    Current directory /home/posein
     => ' '안의 pwd를 명령어로 인식하여, 그 결과값인 현재 디렉토리 /home/posein를 출력한다.

9. shell 관련파일 및 디렉토리
(1) /etc/profile : 시스템 전체에 영향을 미치는 환경설정과 시작관련 프로그램 설정을 한다.
(2) /etc/bashrc : 시스템 전체에 영향을 미치는 함수와 aliases관련 설정을 한다.
(3) ~/.bash_profile : 개인 사용자의 환경설정과 시작 프로그램 설정과 관련이 있는 파일로 로그
                      인시에 읽어들인다. 경로, 환경변수 등의 설정이 들어있다.
(4) ~/.bashrc : 개인 사용자가 정의한 aliases와 함수들이 있는 파일이다.
(5) ~/.bash_logout : 개인사용자가 로그아웃할 때 수행하는 설정들이 들어있는 파일이다.
(6) /etc/profile.d : 몇몇 응용프로그램을 위한 시작 스크립트들이 위치하는 디렉토리이다. 보통
                     /etc/profile 에서 호출되어 지는 스크립트들이 위치한다.

10. 명령행에서 사용할 수 있는 테크닉: 명령행 라인에디터 기능
(1) [CTRL] + [A] : 커서를 라인의 첫부분으로 이동시킨다.
(2) [CTRL] + [E] : 커서를 라인의 끝부분으로 이동시킨다.
(3) [CTRL] + [K] : 커서위치부터 라인끝까지 지운다.
(4) [ESC] 후에 [F] : 커서를 다음 단어 처음에 위치시킨다.
(5) [ESC] 후에 [B] : 커서를 이전 또는 현재 단어의 처음에 위치시킨다.
(참고) 명령어 입력스타일도 vi 스타일이냐 emacs스타일로 전환할 수 있다.

11. shell관련 명령어
(1) chsh
   1) 설명 : 쉘을 변경한다.
   2) 사용법
     chsh [option] [shell]
   3) option
     -l : 변경가능한 쉘의 목록을 보여준다. 이 때 참조되는 파일은 /etc/shells이다.
     -s shell_name : 선택한 쉘로 변경한다.
   4) 사용예
    ㄱ. chsh
          => 패스워드를 입력후에 원하는 쉘을 입력하고 변경한다.
    ㄴ. [posein@www posein]$ chsh -l
        /bin/bash2
        /bin/bash
        /bin/sh
        /bin/ash
        /bin/bsh
        /bin/tcsh
        /bin/csh
        /bin/ksh
        /bin/zsh
    ㄷ. [posein@www posein]$ chsh -s /bin/csh
         => 패스워드 입력후에 바로 csh로 쉘을 변경한다.

안타깝게도 CPU 타잎 확인 하는 부분은 제대로 계산이 안된다.
이유는 쿼드코어, 코어2듀오, 듀얼코어, 하이퍼스레딩 등 때문에...
사실 좀 더 세밀하게 짜면 정상적으로 할 수있는데 귀찮아서..........

#!/bin/bash
LANG=C
unset GREP_OPTIONS GREP_COLOR

echo "
################################ SYSTEM CHECK uzoogom edition. ################################

1) Network Information-------------------------------------------------------------------------
1-1) HOSTNAME: `hostname`

1-2) Ethernet Information
`ifconfig | grep -v "127.0.0.1" | grep "addr"`

1-3) Route(gateway) Information
`route | egrep '(default|Gateway)'`


2) SYSTEM Information-------------------------------------------------------------------------
2-1)CPU Information
CPU : `cat /proc/cpuinfo | grep "processor" | wc -l` EA
`cat /proc/cpuinfo | grep "model name" | uniq`
`cat /proc/cpuinfo | grep "MHz" | uniq`

2-2) Memory Information
`free -m`

2-3) Partition Information
`fdisk -l | grep dev`

2-4) Disk Information
`df -h`


3) PROCESS Information-------------------------------------------------------------------------
`pstree`


4) Open Port Scanning-------------------------------------------------------------------------
`netstat -antp | egrep '(LISTEN|Address)'`


5) Auto start processor-------------------------------------------------------------------------
5-1) Crontab
`crontab -l`

5-2) chkconfig list
`chkconfig --list | grep "3:on"`

5-3) rc.local
`egrep -v "(#|touch)" /etc/rc.local`
"
후리켓  | 2009.10.08 16:06 신고
테스트 패치ㅋ

--- test.sh.ori 2009-10-08 06:55:51.000000000 +0900
+++ test.sh 2009-10-08 06:55:27.000000000 +0900
@@ -2,6 +2,10 @@
LANG=C
unset GREP_OPTIONS GREP_COLOR

+if [ ! $LOGNAME = root ] && [ ! $UID = 0 ];then
+ exit
+fi
+
echo "
################################ SYSTEM CHECK uzoogom edition. ################################
요즘에 회사에서 써먹을려고 다시 짠 백업 스크립트
행여나 이 블로그에 흘러들어와서 그걸 그대로 쓴다면 무궁무진한 오류가 뜨니 주의하시요!

#!/bin/bash
#edit by uzoogom 090723
#
# backup configure
host=$(hostname)
day=$(date +%Y-%m-%d)
check=$(mount | grep -c "backup")

# Backup Storage Mounting Check
if [ $check == 1 ]
        then
                echo "Backup Storage Mounting Check .... OK!!"
        else
                echo "Backup Storage Mounting Check .... FAIL!!"
                echo "Exit backup scripts"
                exit 0
fi

# Make a backup Directory
mkdir -p /backup/${host}/{webdata,data,config} 2>/dev/null
mkdir /root/backup/reference 2>/dev/null

# 백업 할 디렉토리를 적을 파일 생성

touch /root/backup/reference/{webdir,datadir,configfile}

# Lists to Backup 백업 할 디렉토리를 적을 파일 생성
WEBDATA=$(grep -v "^#" /root/backup/reference/webdir)
DATA=$(grep -v "^#" /root/backup/reference/datadir)
CONFIG=$(grep -v "^#" /root/backup/reference/configfile)

# TMP Directory
LIST="/tmp/backuplist_$$.txt"

# Target Backup Locations
WEBDATABACKUP="/backup/${host}/webdata"
DATABACKUP="/backup/${host}/data"
CONFIGBACKUP="/backup/${host}/config"
DATABASEBACKUP="/backup/${host}/database"

#
echo "
========================================================================
Starting backup at `date +%Y-%m-%d\ %H:%M:%S`
========================================================================
"

# date to nubmer 증분 백업을 위해서 날자 지정
# 1-Mon, 2-Tue, 3-Wed, 4-Thu, 5-Fri, 6-Sat, 7-Sun
set $(date '+%u')

# backup Time stamp
rm -f /backup/${host}/backupTime*.txt
echo Starting at `date +%Y-%m-%d\ %H:%M:%S` > "/backup/${host}/backupTime($day).txt"

if test "$1" = "6" ;
then
        # weekly a full backup of all data and config. settings:
        #
        echo "Step1. Performing Full Data Backup--------------------------------------"
        tar zcf "$DATABACKUP/data_full_$day.tgz" $DATA 2>/dev/null

        echo "Removing incremental data backups..."
        rm -f $DATABACKUP/data_diff*

        echo "Removing four week old full Data backup..."
        find $DATABACKUP -depth -type f \( -ctime +20 -o -mtime +20 \) -print > $LIST
        rm -f `cat $LIST`
        echo "------------------------------------------------------------------Done +"
        echo ""

        #
        echo "Step2. Performing Full WebData Backup-----------------------------------"
        tar zcf "$WEBDATABACKUP/webdata_full_$day.tgz" --exclude-from=./reference/exclude  $WEBDATA 2>/dev/null

        echo "Removing incremental data backups..."
        rm -f $WEBDATABACKUP/webdata_diff*

        echo "Removing four week old full WebData backup..."
        find $WEBDATABACKUP -depth -type f \( -ctime +20 -o -mtime +20 \) -print > $LIST
        rm -f `cat $LIST`
        echo "------------------------------------------------------------------Done +"
        echo ""

        #
        echo ""
        echo "Step3. Performing Full Config Backup------------------------------------"
        tar zcf "$CONFIGBACKUP/config_full_$day.tgz" $CONFIG 2>/dev/null

        echo "Removing incremental config backups..."
        rm -f $CONFIGBACKUP/config_diff*

        echo "Removing four week old full config backup..."
        find $CONFIGBACKUP -depth -type f \( -ctime +20 -o -mtime +20 \) -print > $LIST
        rm -f `cat $LIST`
        echo "------------------------------------------------------------------Done +"
else
        # incremental data backup:
        #
        echo "Step1. Performing Incremental Data Backup-------------------------------"
        find $DATA -depth -type f \( -ctime -1 -o -mtime -1 \) -print > $LIST
        tar zcfT "$DATABACKUP/data_diff_$day.tgz" "$LIST" 2>/dev/null
        rm -f "$LIST"
        echo "------------------------------------------------------------------Done +"
        echo ""

        # incremental webdata backup:
        #
    echo "Step2. Performing Incremental WebData Backup----------------------------"
        find $WEBDATA -depth -type f \( -ctime -1 -o -mtime -1 \) -print > $LIST
        tar zcfT "$WEBDATABACKUP/webdata_diff_$day.tgz" --exclude-from=./reference/exclude "$LIST" 2>/dev/null
        rm -f "$LIST"
        echo "------------------------------------------------------------------Done +"
        echo ""

        # incremental config backup:
        #
        echo "Step3. Performing Incremental Config Backup-----------------------------"
        find $CONFIG -depth -type f  \( -ctime -1 -o -mtime -1 \) -print > $LIST
        tar zcfT "$CONFIGBACKUP/config_diff_$day.tgz" "$LIST" 2>/dev/null
        rm -f "$LIST"
        echo "------------------------------------------------------------------Done +"
fi

# MySql 용 백업 설정이나, MySql을 마땅히 백업할 서버가 없어서 주석처리
# Database Backup
#
#mkdir -p /backup/${host}/database 2>/dev/null
#DB_DIR="/usr/local/mysql/data"
#
# Create SQL dump of databases and compress:
#echo "
#Archiving Databases...
#"
# Find current databases
# DB=( $(find ${DB_DIR}/ -maxdepth 1 -type d ! -name ".*" | sort | sed -e 's/\/usr\/local\/mysql\/data\///g') )
# Set for loop max counter based on number of databases
# j=${#DB[@]}
# for (( i=0; i&lt;j; i++ )); do
#         mysqldump -u user --password=passwd --opt ${DB[i]} | gzip >"$DATABASEBACKUP/${DB[i]}_$day.sql.gz"
# done
#
#echo "
#Removing two week old database backups...
#"
#find $DATABASEBACKUP -depth -type f \( -ctime +13 -o -mtime +13 \) -print > $LIST
#rm -f `cat $LIST`
#rm -f "$LIST"
#

# backup Time stamp
echo Finished at `date +%Y-%m-%d\ %H:%M:%S` >> "/backup/${host}/backupTime($day).txt"
echo "
========================================================================
Finished: `date +%Y-%m-%d\ %H:%M:%S`
========================================================================
"
exit 0
모든 스크립트의 기본은 정말이지 단순하다.
얼마나 그 명령어에 대해 이해를 하고 있느냐.
단지 그것 뿐이다.

여기에서는 가장 기본적으로 그 해당 명령어를 사용하는 방법은 알고 있으리라 생각하고 적는다.
괜시리 명령어 사용법도 모르면서 스크립트에 덤벼들지 마라. 잘못하면 시원하게 파일을 날릴 수 있으니까!

어찌보면 가장 단순하지만, 가공할만한 잠재력을 가진 명령어 중 하나인 find!
find만 잘 응용해도 열 스크립트 안 부럽다!


1. 특정 파일 속 특정 단어 찾기
ex) html 파일에서 mms:// 찾기
find . -type f -name "*.html" -exec grep "mms://" {} /dev/null \;
(뒤에 /dev/null을 붙이는 이유는 해당 파일명을 보기 위함이다.)

2. 특정 파일 속 특정 단어 바꾸기
ex) html 파일에서 mms://를 http://로 바꾸기
find . -type f -name "*.html" -exec perl -pi -e 's/mms/http/g' {} \;
(유의 할 점은 특수기호[가령 / 같은..]는 인식을 못하기 때문에 문자로 쓰기 위해선 꼭 \를 붙여줘야한다)

3. 특정 파일만 압축하기
ex) html 파일만 찾아서 압축하기
for i in $(find . -name '*.html'); do tar -zrvf html.tgz $i; done

4. 5일 지난 파일 삭제하기
rm -f 'find . -mtime +5'

뭐 기본적으로 이정도만 응용해도 꽤나 훌륭한 결과를 얻을 수 있다.



우주곰:지구곰이 아닙니다.
지구곰이 아닙니다.
Categories (190)
Information (5)
About uzoogom (5)
My Advanced Linux (73)
Learning Linux (96)
OperatingSystem (5)
Databases (4)
Tips! (1)
OpenSource (1)
«   2018/12   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
  1. 2012/12 (2)
  2. 2012/04 (3)
  3. 2012/03 (6)
  4. 2012/02 (6)
  5. 2012/01 (2)