보안 / 개발 챌린저가 목표

쉘의 이해와 스크립트 작성 본문

IT Security/Class_Do it

쉘의 이해와 스크립트 작성

햄미은서 2020. 9. 16. 21:21

쉘(Shell) 이란

  • 운영체에 상에서 다양한 운영체제 기능과 서비스를 구현하는 인터페이스를 제공하는 프로그램이다.
  • 사용자가 입력한 명령을 커널에 전달한다. 그 커널이 운영체제에게 전달해서 운영체제는 처리를 하고, 운영체제가 다시 커널에게 주면 커널이 사용자에게 돌려준다.

   - 현재도 bourne Shell이 존재하지만 대부분의 배포판에서는 /bin/bash로 심볼릭 링크가 설정되어있다.

   - Ubuntu 는 chsh 명령어에 -l 옵션이 없다.

   - /bin/dash : echo 할 때 -e 옵션을 주지 않아도 이스케이프 문자 사용 가능( ex) \n, \t )

   - /bin/bash : echo 할 때 -e 옵션을 주어 이스케이프 문자를 인식 시켜줘야함

   - 만약 문자열 자체를 묶어주고 싶을 때 "", '' 뭐든 상관 없음


▶ 쉘의 입출력

   1. '>' 와 '>>'

     - '>' : 덮어쓰기

     - '>>' : 이어쓰기

 

# vi test.sh  에 위와 같이 데이터를 입력한다.

 

# chmod +x test.sh  를 하여 실행 권한을 준다.

 

# ./test.sh  를 이용하여 실행한 후 # cat file.txt  로 쓰여진 파일을 출력한다.

잘 작성된 것이 확인된다.

 

다시 test.sh 파일을 열어서 Hi!! 부분에 '>>'를 '>'로 변경한다.

 

데이터가 덮어쓰여진 것이 확인된다.

 

 

   2. 파이프( | )

     - 명령과 명령을 연결할 때 사용

     - 표준 출력 값을 다음 명령에 표준 입력으로 넣어주는 것

     - 주의사항! 파이프 라인을 너무 많이 사용하면 중간에 값이 없어짐

 

 # cat /etc/passwd | grep kisec  을 이용하여 /etc/passwd 안에 있는 kisec 이 포함된 문자열을 찾는다.

   * grep : 입력으로 전달된 파일의 내용에서 특정 문자열을 찾고자 할 때 사용하는 명령어

 

 

   3. awk

     - 문자열에서 특정 문자의 패턴을 추출하여 원하는 포맷으로 처리하는 명령어

     - 내부적으로 C언어와 같은 연산, 반복문, 제어문 등이 가능

 

# cat /etc/passwd | grep kisec | awk -F":" '{ print $1, $6 }' 

1번째 필드와 6번째 필드를 찾는 명령어이다.

   ☞ -F"구분자" : 필드 사이를 구분하는 구분자를 지정하여 사용. 지정하지 않을 시에는 공백이 기본값

   ☞ -v 변수=값 : awk 명령어 내부 처리 중에 사용할 변수를 지정

   ☞ -f 스크립트 파일 : 여러 개의 미리 만들어진 스크립트 파일을 사용하여 문자열을 처리

 

반복문을 사용하여 출력도 가능하다.

 

if 안의 "~"는 /ㅇㅇㅇ/이 포함되어 있으면! 이라는 뜻이다.

 

 

▷ 표준 스트림

   - 0 : 표준입력

   - 1 : 표준출력

   - 2 : 표준에러 출력

 

   - & : 추가로 리다이렉션 스트림을 지정할 때 사용

   - 2>&1 : 표준 에러를 표준 출력으로 표준 입력 리다이렉션

   - echo "Hello World!" > file.txt : 표준 에러 출력을 터미널에 작성

   - echo "Hello World!" > file.txt 2>&1 : 표준 에러 출력까지 파일에 작성

   - 2>/dev/null : 표준 에러 출력을 /dev/null 쪽으로 표준 입력 리다이렉션

   - /dev/null 파일 : 아무것도 존재하지 않는 특수 파일. 이 파일에 쓰여지는 모든 데이터는 버려지지만 정상적으로 쓰기 작업이 종료되었다고 인식. 블랙홀 또는 버킷 이라고 불리움.

 

 

▶ 문자열 파싱 명령어

 

# cat /etc/login.defs  와 같이 아무 파일을 열어서 읽은 후, 다음 파일의 빈 줄과 주석을 없애서 읽어본다.

 

# cat /etc/login.defs | sed -e '/^$/d' -e '/^#/d'  를 이용하면 된다.

   - '-e' 로 명령어 사이를 구분함

   - '/^$/d' 는 빈 줄 없애기

   - '/^#/d' 는 주석 없애기

 

 

▷ 변수

   - 변수 생성 시 타입 지정(int, float, long 등)은 하지 않으며, 생성과 동시에 값을 할당한다.

   - 값 사용 시 변수 명 앞에 "$"를 붙여서 사용한다.

   - 이미 생성된 쉘 변수에 다른 값을 재 대입 시 "$"를 붙이지 않고 사용한다.

 

test.sh 에 이와 같이 저장한다.

  * 쉘 스크립트 작성 시 /bin/bash 가 아닌 /bin/sh 로 하는 이유는 bash가 없는 경우가 있을 수 있기 때문!

 

다음과 같이 결과가 출력된다.

 

 

▶ 조건문

if(띄어쓰기)[(띄어쓰기)조건식(띄어쓰기)];(띄어쓰기)then
	실행 구문
fi
if(띄어쓰기)[(띄어쓰기)조건식(띄어쓰기)];(띄어쓰기)then
	실행 구문
elif(띄어쓰기)[(띄어쓰기)조건식(띄어쓰기)];(띄어쓰기)then
	실행 구문
else
	실행 구문
fi

 

입력 받을 데이터는 read val  로 입력받는다.

만약 입력 받은 값이 1이면 1 출력, 2면 2 출력, 그 외의 숫자라면 else를 출력한다.

 

다음과 같이 실행이 잘 되는 것을 볼 수 있다.

Comments