본문으로 바로가기

쉘 스크립트

category Security/shell scripts 2017. 9. 27. 18:35
  •  목표
프로그램에 대한 이해력(프로그램은 어려운것이 아니다!)
프로그램에 대한 문법(프로그램 작성시 문법에 대한 에러를 줄일수 있다면?)
스크립트 방식의 언어(bash shell script -> perl/python/ruby -> C -> Network Programming)


  • 배시(bash)쉘 기능
- Command-Line Interpreter - 쉘은 명령어 해석기의 역할을 가진다.
- Programming Language - 쉘의 특징을 이용하여 프로그램을 작성할 수 있다.


  • 사용중인 쉘 확인 ( sh, csh, ksh, bash )
# ps
# grep root /etc/passwd

# sh /* 쉘 변경 */
# usermod -s /bin/sh root

  • 쉘에서 실행되는 종류

쉘 내부 명령어(EX: if, while, ...)

엘리어스(EX: alias ls=’ls –al’)

함수(EX: a () { CMD ; CMD; CMD }    

디스크 내에 존재하는 명령어(EX: /bin/ls)


  • 쉘 스크립트 작성지 필요한 명령어 

- grep 명령어

# find /etc -type f -exec grep -l 'eth0' {} \;

[참고]

fgrep     # fgrep '^root' dictionary.txt /* ^root 자체를 찾음 */

egrep    ## egrep '(warn|error|crit|alart|emerg)' /var/log/messages /* 선택적인 words */


[참고] grep 명령어의 pattern 부분에 변수로 지정하는 경우
# cat grep.sh 
--------------------------------
......
PATTERN=root
grep "$PATTERN" /etc/passwd
......
--------------------------------


- sed 명령어

# sed [-n] 'addressCMD' file1

default - 원래 file1의 내용을 한번 출력해줌

-n : not default 

# sed [-n] '/pattern/CMD' file1

/word/  : 찾으려는 word 


EX)

-n /* 출력 한번만 */

# sed -n '1,3p' /etc/passwd 

# sed -n '/root/p' /etc/passwd     (# grep root /etc/passwd)

# sed -n '1,/adm/p' /etc/passwd 

# sed -n '10,$p' /etc/passwd 

# sed -n '3p' /etc/passwd 


# chkconfig --list | sed -n '/xinetd based/,$p' 


-d /* 빼고 출력 */

# sed '1,3d' /etc/hosts 

# sed '3d' /etc/passwd 

# sed '3,$d' /etc/passwd 

# sed '$d' /etc/passwd 

# sed '/root/d' /etc/passwd   (# grep -v root /etc/passwd)


-s /* 치환 ( 원본파일을 바꾸지 않고 그냥 출력시 치환 )*/ 

# sed 's/root/ROOT/' /etc/group   (# sed '1,$s/root/ROOT/' /etc/group)

# sed '1,3s/root/ROOT/g' /etc/group

# sed 's/^....//' /etc/hosts

# sed 's/....$//' /etc/hosts

# sed '1,3s/^/    /' /etc/hosts

# sed '1,3s/^    //' /etc/hosts


# sed 's#/test/file.sh#/test/file.c#g' file1 

# sed 's;/test/file.sh;/test/file.c;g' file1 


# sed 's/root/ROOT/' /etc/group > /tmp/.file1 

# mv /tmp/.file1 /etc/group 


# sed -i 's/root/ROOT/' /etc/group  /* -i 원본파일 바로 편집 */


# sed '/linux200/s/192.168.20.200/172.16.20.200/' /etc/hosts > /tmp/.file1

# mv /tmp/.file1 /etc/hosts


[참고] sed 명령어의 pattern 부분에 변수로 지정하는 경우

# cat sed.sh

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

......

PATTERN=root

sed "/^$PATTERN/d" /etc/passwd

......

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


-awk 명령어

# awk 'statement' file1

# awk '{Action}' file1

# awk 'statement {Action}' file1


[참고] 

# ls -l

 

 -rw-r--r--            1    root     other                 0   11월 10 06:29 file1


<-----$1----> <-$2-> <-$3->    <--$4-->       <-$5-> <-$6-> .....

<------------------------------------$0----------------------------------->

 


EX)

# awk '{ print $0 }' testfile 

# awk '{ print $3 $5 $9 }' testfile 

# awk '{ print $3 "    " $9 "    " $6, $7 }' testfile 

# awk '{ print $3 "\t" $5 "\t" $9 }' testfile        

# awk '{ print $9, "is using", $5, "bytes" }' testfile 


# awk '/file/' testfile 

# awk '{ print $1, $2, $3 }' testfile 

# awk '/file/ { print $1, $2 }' testfile


# awk -F: '$3 > 499 && $3 < 60000 {print $1}' /etc/passwd 

-F : 필드 구분자 지정 

# df -h / | tail -1 | awk '{print $6}'

# ifconfig eth0 | grep inet | grep -v inet6 | \

awk '{print $2}' | awk -F: '{print $2}'

# ps -elf | awk '$2 == "Z" {print $0}'     /* 좀비 프로세서 검색 */



- sort 명령어

# df -k 

# du -sk /var   /* -s : sum, -k : KBytes */

# cd /var

# du -sk * | sort –nr | more


# sort -u file1    /* 중복 되는 것 한번만 출력*/

# sort file1 | uniq -d /* -d : duplicated */ 중복된것만 

# sort file1 | uniq -u /* -u : unduplicated */ 중복되지 않은것


[예] 패키지 비교

# cat linux200  (# rpm -qa > linux200)

A

B

# cat linux201  (# rpm -qa > linux201)

A

B

C

# cat linux200 linux201 > sum.txt

# sort sum.txt | uniq -u


- cut 명령어

# cp /etc/hosts /tset/hosts

# cd /test

# cut -c1-3 hosts

# cut -c4- hosts

# cut -c4-10 hosts


# cut -f 1 hosts /* -f 필드의 구분은 tab */

# cut -f 1 -d":" /etc/passwd /* -f  첫 번째 필드 -d":" 필드의 구분자 : */


# ifconfig eth0 | grep 'inet addr:' | awk '{print $2}' | cut -d":" -f2


-uniq 명령어

근처에 있는 것끼리만 비교하여, sort와 사용하지 않으면 의미 없다. 


- tr 명령어    /* 대소문자를 바꿔 준다. */

# cat temp | tr "[A-Z]" "[a-z]"

# cat temp | tr "[a-z]" "[A-Z]"


- split 명령어

-파일을 더 작은 단위로 쪼갤 때 

- 큰 파일을 작은 단위로 쪼개서 한번에 실행한다. -> 시간 

# split -d -l 4 /etc/hosts 

/* -d : decimal number, -l : line number*/

/* -l 4 4줄씩 쪼갠다 . -d 쪼개진 파일이름을 숫자로 지정 */

( 숫자로 지정하면 script로 작성해서 한꺼번에 관리하기가 편해진다 )


- paste 명령어

파일 내용을 옆에 붙혀준다.

# cat > file1

1111

2222

3333

# cat > file2

4444

5555

6666

# paste file1 file2 

1111    4444

2222    5555

3333    6666


- head / tail / wc 명령어 









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

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