본문으로 바로가기

쉘 스크립트_2

category Security/shell scripts 2017. 10. 2. 14:40
  • 쉘의 특성

리다이렉션(Redirection)                    : <  <<  >  >>  2>  2>>

파이프(pipe)                                  :  |

셀 자체의 기능(bash function)           : set -o vi

변수(Variable)                                : export VAR=5

메타캐릭터(Metacharacter)                : ''  ""  ``  ;

히스토리(History)                            : history

환경파일(Environment Files)                : /etc/profile, ~/.bash_profile, ~/.bashrc


    • 리다이렉션 

fd (file description, 파일 기술자 )

0    표준 입력 ( stdin ( keyboard ))

1    표준 출력 ( stdout ( screen ))

2    표준 에러 ( stderr  ( screen ))


- 입력 리다이렉션

# CMD < file1

# CMD 0< file1


# cat < /etc/passwd

# mail -s "TEST" root < /etc/hosts


- 출력 리다이렉션

# CMD > file1

# CMD 1> file1

# CMD >> file1

# CMD 1>> file1


# ls -l > file.list

# echo 1111 > file1

# echo 2222 >> file1


# tty

# echo hello redirection > /dev/pts/2


# CMD 2> file1 /* 에러 리다이렉션 */

# CMD 2>> file1


# ls -l /test /nodir > file1 2>&1  /* file1에 정상출력과 에러 출력 입력 */

# ./configure --prefix=/usr/local/apache2 >apache.log 2>&1

$ find / -name core -type -f 2>/dev/null


- 파이프 

# CMD | CMD

# CMD | CMD | CMD


# ps -ef | more

# ps -ef | grep httpd | grep -v grep | wc -l


# cal > cal.txt

# cal | tee cal2.txt     /* 리다이렉션은 모니터에 출력없이 바로 cal.txt로 넣어버리지만 tee는 모니터에도 출력됨 */


# script -a /dev/null | tee /dev/pts/3 | tee /dev/pts4


- 쉘 자체의 기능

# set -o

# set -o vi

# set +o vi


- 변수

1. 지역변수 

2. 환경 변수

3. 특수 변수


변수 선언 방법(env/set)

변수의 이름 : 대문자, 소문자, 숫자, _ ( 숫자는 맨 앞에 올수 없다. ) 

‘=’양쪽에 공백이 있으면 안된다. 모두 문자열로 인식 (숫자연산가능)


# VAR=5    /* 지역변수 선언 */

# export VAR    /* 환경 변수로 선언 */

# echo $VAR /* 확인 */

# unset VAR /* 변수 삭제 */


변수의 export 의미 ( 지역변수 / 환경변수 )

# ps

# VAR1=5

# echo $VAR1

# bash

# echo $VAR1

# exit

# echo $VAR1


# VAR2=10

# export VAR2 (# export VAR2=10)

# echo $VAR2

# bash

# echo $VAR2

# exit

# echo $VAR2


***특수 변수

$$ : 현재 쉘의 PID 번호 저장(EX: 임시 파일 생성, /tmp/.tmp.$$)

$! : 바로 이전 수행된 백그라운드 프로세스의 PID 번호 저장

$? : 바로 이전 수행된 명령어의 return value 저장(0 ~ 255)


$* : 모든 인자($* == $@)

$# : 인자의 개수

$0 : 프로그램 이름

$1 : 프로그램에 대한 첫번째 인자

$2 : 프로그램에 대한 두번째 인자

$3 : 프로그램에 대한 세번째 인자


= 임시 파일을 생성하는 경우 ( $$ )

# echo $$

# ps

# touch /tmp/tmp.$$

# ls -l /tmp/tmp.*

[참고] mktemp ( 랜덤으로 파일이름 생성)

# mktemp /tmp/tmp.XXXXXXXX    /* X의 개수만큼 랜덤으로 지정되어 파일을 만든다 */

/tmp/tmp.KPKy4724


= 바로 이전에 수행된 백그라운드 프로세스를 종료하는 경우

# sleep 20 &

# echo $!

# sleep 200 &

# kill $!


= 명령어의 정상 동작 유무 확인하는 경우 /* 0이면 정상 다른 숫자면 오류 */

# date

# echo $?

# cd /nodir

# echo $?

[ 참고 ] #? 로 확인 할 수 없는 명령어
# nslookup www.lakdsfjaksdfj.com  /* 존재하지 않는 도메인 */
# echo $?     /* 0 이 나온다. */
 -> 명령어는 제대로 실행이 됬다고 판단하기 때문이다.

- 쉘 메타캐릭터
'', "", ``, \, ; 

'' : 작은따옴표 ( single quotation )
# echo $SHELL
# echo '$SHELL'

# echo hello linux

# echo hello         linux

# echo 'hello         linux '


"" : 큰 따옴표 ( double quotation )

# echo "$SHELL"


`` : 역 따옴표 ( back quotation ) sh -> ksh -> zsh -> bash

# date

( sh ) # echo `date`

(ksh) # echo $(date)


# echo " `date` is time "

# touch backup+`date +%m%d`.tar.gz


\ : 백 슬래쉬 ( back slash )

# echo $SHELL

# echo \SHELL  ( # echo '$SHELL' )


# find / -type f -exec grep -l Error {} \;

# find / -type f -exec grep -l Error {} ';'

# find / -type f -exec grep -l Error {} ";"


; : 세미콜론 ( semicolon )

# date ; ls ; cal


= 함수

# a () { ls ; date ; cal ; }

# a

# typeset -f

# unset -f a


= 환경 파일

/etc/profile

~/.bash_profile

~/.bashrc


= 기타 ( Hero Documentation (연속) ) cat CMD + Here Documentation

1. 출력내용이 많은 text를 효율적으로 출력하기 위한 방법

2. 선책하는 메뉴를 출력하기 위한 방법

3. 명령어 입력값으로 사용하기 위한 방법 

으로 사용된다. 

EX ) vi test.sh

#!/bin/bash


cat << _EOF 

 ----------------------------

 |     hello     world

 |

-----------------------------

_EOF


/* tab으로 메뉴를 만들거나 글이 많을경우에 echo 명령어보다 더 편하게 쓸수 있다 */


  •  조건부 실행
-a ( AND )  &&
-o ( OR )     ||

[참고] AND / OR
A AND B
A가 참이면 B를 확인해야 식이 참인것을 확인할 수 있음
A가 거짓이면 B를 확인해봐야 거짓인 식임 -> B 확인 안함

A OR B
A 가 참이면 B를 확인해 봐야 참인 식임 -> B 확인 안함
A 가 거짓이면 B를 확인해 봐야 참인것으 확인할 수 있음

EX ) # cd /test ; rm -rf *    /* /test 디렉토리가 없어도 rm 명령어가 실행됨 만약 오타나면 현재 디렉토리 모두 삭제 */
# cd /test && rm -rf *  /* /test 디렉토리가 없으면 rm 명령어 실행 안됨 */

# [ -f /etc/passwd ] && echo "OK" || echo " Fail "
-> /etc/passwd 가 존재하면  참이면  && 실행 echo OK  앞이 참이면 || 실행 안됨( 어차피 참 )
    /etc/passwd 가 존재하지 않으면  앞이 거짓이므로 && 실행 안됨 ( 어차피 거짓 ) || 실행 

  • eval CMD
-> 한번더 실행시켜준다. 

EX)
# A=5
# B=3
# echo $A
# echo $B

# A=B
# B=3
# echo $A        -> B
# echo $B        -> 3

# echo $$A 
-> $$A -> $B -> 3? X
-> $$ 먼저 실행 -> PID번호 A 출력된다

# echo \$$A
-> \ 를 이용하여 $A가 먼저 실행하게 하면 $B -> 3 X
-> 그냥 $B가 출력된다.

# eval echo \$$A
-> echo \$$A -> $B
-> eval이 한번더 실행시켜줌 echo $B -> 3






'Security > shell scripts' 카테고리의 다른 글

쉘 스크립트 예제  (0) 2017.10.10
쉘 스크립트 작성하기_(반복문)  (0) 2017.10.10
쉘 스크립트 작성하기(조건문)  (0) 2017.10.02
쉘 스크립트  (0) 2017.09.27